Make your images change sizes dynamically.
This plugin does two main things.
First, it sidesteps the part of WordPress that causes the resized images to be generated, and simply tells the WordPress functions that the images already were generated.
Secondly, it hooks into the normal WordPress 404 handler. When a request is made for an image that is not on the server, the normal WordPress permalink rules will apply and WordPress will be triggered into action. It would normally serve up a 404 page, however the plugin intercepts that and checks to see if a call for an image is being made. If so, and it can find the original image, then it resizes the image, saves it, and serves it back to the browser instead of the 404 page.
In order to do this, it changes the image naming system a little bit. Resized images are normally renamed using a style of "image-123x456.jpg", where the numbers are the width and the height. This remains the case, however a new option is added. For cropped images, the plugin denotes this with the letter "c" at the end of the image filename. This allows the plugin to determine the width, height, and whether to use cropping or not just from the filename, and to create the proper image size.
This plugin doesn't automagically adjust to new themes and new sizing. The image sizes are specified in the filenames, so all the images in your posts content will still be sized at the same sizes they were before.
However, if new sizes are defined by the new theme, and those filenames get generated and requested by that theme, the plugin will generate the new sizes as they are retrieved. So while it can't correct all cases, it can correct some of them.
The plugin doesn't clean up old images. If old image sizes are left behind and unused after changes, you'll have to manually clean them up. One way is simply to delete all the resized images (not the originals) and let images get regenerated when they get used the next time.