Let’s Learn About Pixel Scaling and Rotation

When you start using emulators, it won’t be long before you’re brought up against the choice of which scalers to use, a bewildering collection of options with names like Nearest Neighbor, AdvMAME3x, and RotSprite.

Resizing pixel images in an intelligent way is a difficult problem for many reasons. Most techniques intended for use on photographs won’t apply, since they’ll produce unacceptably blurry results when applied to extremely low resolution art. Pixel art is designed so that every dot matters, and adding new pixels carelessly can cause problems, such as Mario flipping us the bird in the right-hand image below:

Mario vs MMarrioo:A possible result of bad upscaling.

Additionally, being done frequently in real-time emulation, scaling algorithms must be fast. Yet the fastest solution, called Nearest Neighbor, produces very blocky results, and also only really works well if images are scaled up to an integer multiple of the original in X and Y dimensions.

A good backgrounder of various issues is available from an old blog post here, but there’s been some interesting advancements in the field since then. RotSprite is a good contemporary solution that also can rotate pixel art images well.

The problem of rotation is made simpler by a nifty trick that’s used by many image editors and libraries. It turns out you can rotate an image by an arbitrary amount with three simple shear operations. (If you don’t know what shearing is, it’s just tilting an image by some amount in a direction. It’s pretty awesome that this works since shearing is easy to do.)

Example image borrowed from the above linked page. I’m amazed this works.