ActiveStorage performs image processing on-the-fly, and for that it currently uses raw MiniMagick. As we can see from CarrierWave and Refile, for common image resizing it’s not enough to just use simple ImageMagick options, certain resizers like “resize_to_fill” require a combination of ImageMagick options to achieve the desired effect.
To avoid reimplementing this functionality, I propose that ActiveStorage uses the ImageProcessing gem, as a layer on top of MiniMagick. The ImageProcessing gem has been developing for almost 3 years now, and it’s gotten pretty good. It was primarily written to be used with Shrine, but I deliberately made it generic so that other file attachment libraries can use it as well and avoid reimplementing the same functionality.
Some features that are added on top of MiniMagick:
- resizing macros:
- automatic orientation
- automatic thumbnail sharpening
- avoids the complex MiniMagick::Image class
But probably the biggest features of the ImageProcessing gem is that it also ships with the libvips backend. Libvips is an alternative to ImageMagick. The advantage of using libvips is that in most cases it’s multiple times faster than ImageMagick. This is a big deal.
The ImageProcessing gem provides a uniform API regardless of which backend is used, just the operations/options specific to ImageMagick and libvips differ of course. That means the potential ActiveStorage integration would work for both ImageMagick and libvips, allowing the user to swap backends with just a single line of code.
So, my question is: would you be open to accepting a pull request that replaces MiniMagick with ImageProcessing?