【问题标题】:How to upload while resizing the original image itself in Shrine如何在 Shrine 中调整原始图像本身的大小时上传
【发布时间】:2020-03-20 03:38:16
【问题描述】:

我在 Ruby on Rails 应用程序中使用 Shrine 来创建调整大小并将图像上传到存储的过程。

我当前的代码是:


image_uploader.rb

require "image_processing/mini_magick"

class ImageUploader < Shrine
  plugin :derivatives

  Attacher.derivatives_processor do |original|
    magick = ImageProcessing::MiniMagick.source(original)
    {
      resized: magick.resize_to_limit!(120, 120)
    }
  end

end

user.rb

class User < ApplicationRecord
  include ImageUploader::Attachment(:image)
  before_save :image_resize

  def image_resize
    self.image_derivatives!
  end
end

我在阅读official documentation 时实现了它,但这在两个方面是不可取的。

  1. 需要在模型代码中触发。可以只用image_uploader.rb完成吗?
  2. 访问使用此代码生成的图像需要“调整大小”前缀(例如@user.image(:resized).url),并且原始图像也将保留在存储中。我想自己处理原始图像。

有没有办法在解决这两个问题的同时上传?

【问题讨论】:

    标签: ruby-on-rails ruby image-processing imagemagick shrine


    【解决方案1】:
    1. 您可以添加以下补丁,作为将缓存文件升级为永久存储的一部分,这将触发衍生产品的创建:

      # put this in your initializer
      class Shrine::Attacher
        def promote(*)
          create_derivatives
          super
        end
      end
      
    2. 您可以只覆盖检索附件的模型方法以返回调整大小的版本。您可以使用included 插件为使用此上传器的所有模型执行此操作:

      class ImageUploader < Shrine
        # ...
        plugin :included do |name|
          define_method(name) { super(:resized) }
        end
      end
      

    关于第二个问题:它仍然会将原始文件保留在存储中,但默认返回调整大小的版本。通常最好在视图装饰器中执行此操作。

    您总是希望将原始文件保留在存储中,因为您永远不知道何时需要重新处理它。您可能会发现当前调整大小的逻辑不适用于某些文件类型和大小,在这种情况下,您需要为以前的附件重新生成调整大小的版本。如果您不再拥有原始文件,您将无法做到这一点。

    【讨论】:

    • 问1:成功了! Q 2 : 我的应用程序想将图像大小固定为 120x120,以后不会重新处理它。所以没有必要保留其他尺寸。例如,在这个用例中,carrierwave 似乎能够使用process resize_to_fit 调整原始图像本身的大小。我的用法可能不符合神社...谢谢你的回答。
    • +1 用于保留原始文件。算法的改进与图像编码方法的改进一样,使我们能够减少存储大小或提高渲染图像的质量,并且拥有原始图像可以为它们带来其他新的和令人兴奋的用途。
    • 我同意保留原始文件是最佳做法,但我也觉得应该有一种方法可以轻松地在 Shrine 中覆盖它。有时您真的不在乎原件,出于篇幅原因,不想保留它。
    • 我会记住这一点,并可能在未来添加此功能。目前,this discussion 对如何使用当前 API 实现这一点有一些建议。
    猜你喜欢
    • 2015-02-24
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多