使用Paperclip和aws-sdk基于现有样式生成新样式缩略图

时间:2014-09-17 16:14:09

标签: ruby-on-rails ruby-on-rails-3 amazon-s3 paperclip

我有一个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任务:

  1. 为添加:medium样式之前创建的每张照片从S3获取:small图片
  2. 将其调整为:small尺寸
  3. 将生成的图片上传到S3上的/some/path/to/small/image/
  4. 不知道从哪里开始。

1 个答案:

答案 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 }

最重要的是,您只能从原件进行裁剪,因此如果您需要自定义处理,则必须构建它。你必须要玩它,但这会让你走上正确的轨道。