I like that an idea as an optional upgrade. The Rails 5.2 ship has already 
sailed, so we'll want to make sure that any optional upgrade honors the 
existing transformation API. But I could see making the Variation#transform 
call a strategy that's configurable. And it'll just start with what we have 
now, but can be upgraded/replaced with this solution.

On Wednesday, April 4, 2018 at 5:18:25 PM UTC-7, Janko Marohnić wrote:
>
> Hello everyone,
>
> ActiveStorage performs image processing on-the-fly, and for that it 
> currently uses raw MiniMagick. As we can see from CarrierWave 
> <https://github.com/carrierwaveuploader/carrierwave/blob/master/lib/carrierwave/processing/mini_magick.rb>
>  
> and Refile <https://github.com/refile/refile-mini_magick>, 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* <https://github.com/janko-m/image_processing> 
> 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 
> <https://github.com/shrinerb/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:
>       - #resize_to_limit 
>       
> <https://github.com/janko-m/image_processing/blob/master/doc/minimagick.md#resize_to_limit>
>       - #resize_to_fit 
>       
> <https://github.com/janko-m/image_processing/blob/master/doc/minimagick.md#resize_to_fit>
>       - #resize_to_fill 
>       
> <https://github.com/janko-m/image_processing/blob/master/doc/minimagick.md#resize_to_fill>
>       - #resize_and_pad 
>       
> <https://github.com/janko-m/image_processing/blob/master/doc/minimagick.md#resize_and_pad>
>    - automatic orientation 
>    <https://www.imagemagick.org/script/command-line-options.php#auto-orient>
>    - automatic thumbnail sharpening 
>    
> <https://github.com/janko-m/image_processing/blob/master/doc/minimagick.md#sharpening>
>    - avoids the complex MiniMagick::Image class
>
> But probably the biggest features of the ImageProcessing gem is that it 
> also ships with the *libvips* <http://jcupitt.github.io/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?
>
> Kind regards,
> Janko
>

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to rubyonrails-core+unsubscr...@googlegroups.com.
To post to this group, send email to rubyonrails-core@googlegroups.com.
Visit this group at https://groups.google.com/group/rubyonrails-core.
For more options, visit https://groups.google.com/d/optout.

Reply via email to