我有一个Photo
模型,其中包含2个样式:original
和:medium
,其中:medium
是原始的裁剪版本。我现在想添加:small
样式,它只是:medium
的调整后版本。对于新图像,一切正常:我只裁剪原始图像两次,一次针对:medium
,一次针对:small
样式。但是我还有几千个现有的图像需要重新处理以获得:small
拇指(所有这些都存储在AWS S3上)。不幸的是,我无法拨打.reprocess! :small
,因为它会使用原始版本制作小版本,而我需要基于裁剪:medium
版本的小版本。
中等版本已被用户裁剪,因此我无法重新处理原件。
使用Paperclip是否有一种简单的方法可以执行此操作,或者我是否必须编写脚本以从S3中提取:medium
版本,在本地调整其大小,然后将其发送到S3上的:small
目录?
更新1:
这些是我的风格
:original, { geometry: "1500x1500>", format: :jpg },
:medium, { geometry: "650x650#", processors: [:cropper], format: :jpg },
:small, { geometry: "262x262#", processors: [:cropper], format: :jpg }
请注意,我已经添加了:small
样式,但我仍然需要为添加之前创建的图像生成:small
个拇指。
更新2: 这样做的方法可能是使用rake任务:
:medium
样式之前创建的每张照片从S3获取:small
图片:small
尺寸/some/path/to/small/image/
不知道从哪里开始。
答案 0 :(得分:0)
看起来您可以使用自定义处理器。在过去,我已经从回形针复制处理器并修改它们以满足我的需要。例如,如果你使用缩略图处理器,修改它以便它缩小缩略图并按照你想要的方式调整它,然后将其保存为自定义处理器(如果你把它放在lib / paperclip中,它应该是aotu-load)。 / p>
无论哪种方式。从https://github.com/thoughtbot/paperclip/blob/master/lib/paperclip/thumbnail.rb
复制文件编辑部分:
def transformation_command
scale, crop = @current_geometry.transformation_to(@target_geometry, crop?)
trans = []
trans << "-coalesce" if animated?
trans << "-auto-orient" if auto_orient
trans << "-resize" << %["#{scale}"] unless scale.nil? || scale.empty?
trans << "-crop" << %["#{crop}"] << "+repage" if crop
trans << '-layers "optimize"' if animated?
trans
end
在调整图像大小之前裁剪图像。我的gess是你必须交换调整大小和裁剪命令,但我不确定。所有paperclip都运行imagemagick命令,所以你可以在这里找到一些好的文档:http://www.imagemagick.org/script/command-line-processing.php
将此保存为lib / paperclip / your_processor_name.rb中的自定义处理器,并按照以下方式制作所需的样式:
:original, { geometry: "1500x1500>", format: :jpg },
:medium, { geometry: "650x650#", processors: [:your_processor_name], format: :jpg },
:small, { geometry: "262x262#", processors: [:your_processor_name], format: :jpg }
最重要的是,您只能从原件进行裁剪,因此如果您需要自定义处理,则必须构建它。你必须要玩它,但这会让你走上正确的轨道。