3

在我的 Rails 应用程序中,我可以上传图像,元数据保存在数据库表中,并且文件可以正常写入磁盘(上传由 attachment_fu 处理)。

这很好用,我可以显示用户的头像,但是,我在上传表单上使用了一个 jQuery 插件,以允许用户在上传之前裁剪图像,所以在我的表单POST数据中我有图像和,xy参数。wh

然后我尝试使用这些来裁剪上传的图像,但 RMagick 创建的新图像是 1x1 空图片,我已经硬编码下面的图像路径以消除可能的问题,正在读取的图像肯定存在,否则应用程序会抛出错误。

# top of controller
require 'RMagick'
include Magick

def change_avatar
  image = Magick::Image.read(RAILS_ROOT + '/public/files/avatars/0000/0027/940.jpg').first

  cropped_image = image.crop(params[:x].to_i, params[:y].to_i, params[:w].to_i, params[:h].to_i, true).write(RAILS_ROOT + '/public/files/avatars/0000/0027/940_1.jpg')

  redirect_to '/portal/profile/' + a.id.to_s

end

仅供参考,Ruby 1.8.7 和 Rails 2.3.14

更新

经过大量的混乱,我意识到裁剪和覆盖只能通过读取某个上传的图像来工作:

image = Magick::Image.read(RAILS_ROOT + '/public/files/avatars/0000/0001/940.jpg').first

即使我将其更改为

image = Magick::Image.read(RAILS_ROOT + '/public/files/avatars/0000/0007/940.jpg').first

这是已上传两次的相同图像(嗯,不止于此,但只是指出我正在使用相同的图像进行测试),重新编写的文件保存为 1 x 1 空白/空图像。

两者都具有相同的权限,但不认为这是一个因素,因为图像实际上是被保存的,不知道它如何只适用于这个特定的图像。

更新 2

认为我已经知道了,在模型中,attachment_fu将上传的图像调整为 200 x 200,所以我认为它不是应用于上传的图像的裁剪,而是应用于裁剪的版本,所以我认为这在某处搞砸了并产生 1 x 1 图像。

tldr::resize_to => '200x200',从模型中删除。

4

0 回答 0