我目前正在尝试编写与互联网上其他类似的自定义图像裁剪系统,用户可以选择裁剪区域,然后相应地裁剪图像。该应用程序在Rails中,我们将Paperclip与Amazon S3一起使用来存储文件。虽然让RMagick从S3适当裁剪文件,但我遇到了很多麻烦。这是当前代码(不起作用):
if params[:width].to_i > 0 and params[:height].to_i > 0 then
photo = Photo.find(params[:id])
image_data = Net::HTTP.get_response(URI.parse(photo.photo.url(:big))).body
orig_img = Magick::ImageList.new
orig_img.from_blob(image_data)
args = [params[:x1].to_i, params[:y1].to_i, params[:width].to_i, params[:height].to_i]
orig_img.crop!(*args)
photo.update_attributes({:photo => orig_img.to_blob})
photo.photo.reprocess!
photo.save
end
主要问题是裁剪的图像没有通过回形针上传回S3,因此没有正确裁剪。 之前有没有人用回形针尝试这样的东西?这可能是不可能的,但任何帮助将不胜感激。
答案 0 :(得分:5)
我已经能够暂时解决这个问题,如下所示:
photo = Photo.find(params[:id])
image_data = Net::HTTP.get_response(URI.parse(photo.photo.url(:big))).body
orig_img = Magick::ImageList.new
orig_img.from_blob(image_data)
args = [params[:x1].to_i, params[:y1].to_i, params[:width].to_i, params[:height].to_i]
orig_img.crop!(*args)
tmp_img = Tempfile.new("image_data")
orig_img.format = "png"
tmp_img.write(orig_img.to_blob)
photo.photo = tmp_img
tmp_img.close
photo.photo.reprocess!
photo.save
这里主要关注的是创建新临时文件的速度,因此我们可能需要创建自己的自定义界面。希望这对于解决类似问题的人来说是一个很好的起点。
编辑:简单来说,Tempfile是回形针库的一部分。
答案 1 :(得分:0)
您可以在模型上定义一些attr_accessors,并在创建实际文件之前将它们设置在控制器操作中。以下应该有效..
class Poodle < ActiveRecord::Base
has_attached_file :avatar, :styles => Proc.new{|a| a.instance.get_styles}
attr_accessor :width, :height
def get_styles(style = "medium")
return {style.to_sym => [self.width, self.height].join("x") + ">" }
end
end
答案 2 :(得分:0)
您可能需要仔细查看Paperclip processors。
我实际上在我自己的代码中遇到了同样的问题,并在我的待办事项列表中有这个问题。