1

我正在使用 Paperclip 来存储我的图像,并且我想创建一个裁剪/旋转的图像作为缩略图。这是 Paperclip 应该运行的 PROPER 命令:

convert [file].jpg -gravity center -distort SRT -30 -quality 100 -antialias -flatten -background white -unsharp 0.3x0.3+5+0 -crop 433x433+69+88 +repage -resize "300x300>" [file].jpg

这会产生我想要的结果。我已经在安装了 imagemagick 的电脑上直接对其进行了测试。但是查看我服务器上的日志,这些参数的顺序是不同的。Paperclip 想要 a) 将-resize "300x300>"命令放在第一个,然后放在-crop 433x433+69+88第二个,然后将其余的参数放在后面。这会改变最终图像的外观!不是我想要的。这是它在日志中输出的内容:

convert [file].jpg -auto-orient -resize "300x300>" -crop 433x433+69+88 +repage -gravity center -distort SRT -30 -quality 100 -antialias -flatten -background white -unsharp 0.3x0.3+5+0 [file].jpg

...这是我模型中的配置:

Wine.rb

has_attached_file :photo, :styles => {
                    :thumb => {
                    :geometry => "300x300>",
                    :format => :jpg,
                    :processors => [:cropper, :recursive_thumbnail],
                    :thumbnail => :croppable
                    },
                    :general => ["150x375", :jpg],
                    :show => ["x425", :jpg],
                    :croppable => ["1200x1200>", :jpg]
        },
        :url  => "/assets/wines/:style/:wine_name",
        :path => ":rails_root/public:url",
        :default_url => ":wine_default",
        :default_path => ":rails_root/public:wine_default",
        :default_style => :show,
        :convert_options => {
            :thumb => '-gravity center -distort SRT -30',
            :croppable => '-gravity center -extent 1200x1200',
            :general => '-gravity center -extent 150x375 -quality 95',
            :all => '-quality 100 -antialias -flatten -background white -unsharp 0.3x0.3+5+0'
        },
        :processors => [:thumbnail, :compression]

基本上它按以下顺序运行 convert.exe:[:geometry][:transformations][:convert_options]。

我如何按我想要的顺序得到东西?

recursive_thumbnail.rb - 用于从 :croppable 而不是原始文件运行 :thumb 缩略图生成(因为裁剪时的水平填充问题)

module Paperclip
    class RecursiveThumbnail < Thumbnail
    def initialize file, options = {}, attachment = nil
        super Paperclip.io_adapters.for(attachment.styles[options[:thumbnail] || :original]), options, attachment
    end
    end
end

裁剪器.rb

module Paperclip
    class Cropper < Thumbnail
    def transformation_command
        if crop_command
        super.join(' ').sub(/ -crop \S+/, '').split(' ') + crop_command
        else
        super
        end
    end

    def crop_command
        target = @attachment.instance
        if target.cropping?
        ["+repage", "-crop", "#{target.crop_w}x#{target.crop_h}+#{target.crop_x}+#{target.crop_y}", "+repage"]
        end
    end
    end
end
4

2 回答 2

0

我尝试创建自己的回形针处理器,但遇到了问题。我的处理器覆盖了cropper.rb 处理器,因为它们都试图在缩略图处理器中使用相同的方法;所以我可以将 resize 命令移动到参数列表的末尾,但找不到crop 参数。我不知道如何将裁剪器处理器包含在我的自定义处理器中,整个事情看起来就像一团糟,而且它不起作用。

没有找到答案。我最终切换到 Carrierwave 并遇到了另一组问题,我终于找到了解决方案。太糟糕了 Carrierwave 不记录图像的处理,但这是一个很小的代价。

Carrierwave RMagick 在转换为 jpg 时不删除透明度
Carrierwave +repage 选项不起作用

于 2013-10-28T19:41:29.650 回答
0

有同样的问题,并意识到我无法改变裁剪和调整大小的顺序。但我确实设法做了一个小技巧,让我得到了我想要的结果。我在模型上创建了另一个图像附件。

has_mongoid_attached_file :cropped_image, {:styles => :original => '1920x1680>', :processors => [:cropper]}

这只会用原始尺寸裁剪图像。然后另一个图像将是:

has_mongoid_attached_file :image, {:styles => IMAGE_STYLES, :processors => [:thumbnail]}

那个将有你所有不同大小的缩略图,并会做所有的调整。所以在它作物之后,我会做这样的事情:

self.image = self.cropped_image
self.save

不是最理想的方式,但我让它在不牺牲太多性能的情况下做我想做的事。

于 2014-01-10T20:17:46.733 回答