我目前正在尝试编写类似于互联网上其他类似的自定义图像裁剪系统,用户可以选择裁剪区域,然后相应地裁剪图像.该应用程序位于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,因此没有正确裁剪.之前有没有人用回形针尝试这样的东西?这可能是不可能的,但任何帮助将不胜感激.
我已经能够暂时解决这个问题如下:
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是回形针库的一部分.