在我的 Rails 应用程序中,我可以上传图像,元数据保存在数据库表中,并且文件可以正常写入磁盘(上传由 attachment_fu 处理)。
这很好用,我可以显示用户的头像,但是,我在上传表单上使用了一个 jQuery 插件,以允许用户在上传之前裁剪图像,所以在我的表单POST
数据中我有图像和,x
和y
参数。w
h
然后我尝试使用这些来裁剪上传的图像,但 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',
从模型中删除。