2013-10-25 27 views
1

我正在使用回形针来存储我的图像,我想创建一个裁剪/旋转的图像作为缩略图。这里是回形针应该运行的正常命令:停止回形针剪裁和其他参数之前调整大小

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的电脑上直接测试了它。然而,在我的服务器上查看日志,这些参数的顺序是不同的。回形针希望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而不是原来的文件(因为水平填充问题裁剪时)

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 

cropper.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 
+0

希望我能帮忙,但我只能推荐使用标准回形针功能来处理这种事情:)如果你想让我给你一些想法,我可以做一个答案? –

+0

当然,无论帮助,帮助。我甚至可以做一个自定义滚动的处理器,它将覆盖Paperclip用于生成缩略图的默认过程,但我不知道从哪里开始。 – JakeTheSnake

回答

0

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

未找到答案。我最终转向了Carrierwave,并遇到了另一系列问题,我终于找到了解决方案。太糟糕了Carrierwave不记录图像处理,但这是一个小的代价。

Carrierwave RMagick not removing transparency in convert to jpg
Carrierwave +repage option not working

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 

不是最理想的方式,但我得到了它做什么,我想在不牺牲太多性能。