Personally, I think it would be a lot simpler to create a function rearranging the image rather than to go around tweaking everything that currently uses the class.
Nothing will break of course, it's just an internal optimization.
For simplicity, we can mark
copy() and other operations so that they "evaluate" the image. Lazy evaluation loses a bit of its usefulness as such, with a bit of thought also this could be addressed.
One advantage that lazy evaluation definitely has is that it allows two subsequent transforms to be executed efficiently (O(1)). For example, it would then be enough to provide
rotateCcw() and
rotateCw() -- we wouldn't need a
rotate180(), because twice 90° costs nothing.