Carrierwave 和 Jcrop 不使用 Minimagick 进行裁剪
Posted
技术标签:
【中文标题】Carrierwave 和 Jcrop 不使用 Minimagick 进行裁剪【英文标题】:Carrierwave and Jcrop not cropping with Minimagick 【发布时间】:2014-05-29 15:45:33 【问题描述】:我正在关注有关如何使用 Carrierwave 和 Jcrop 裁剪图像的 Ryan Bates 教程。
但是,图像没有被裁剪。 x,y,w,h 值正在参数中传递,但没有进行裁剪。我正在使用 Minimagick。我将非常感谢某人的帮助。
我在 *** 中关注过类似的问题,但没有一个给出好的解决方案。 谢谢
照片上传器
process :resize_to_fit => [800,800]
version :big do
process :resize_to_limit => [800,600]
process :convert => 'jpg'
end
version :thumb, :from_version => :big do
process :crop
resize_to_fill(100,100)
end
def crop
if model.crop_x.present?
resize_to_limit(600, 600)
manipulate! do |img|
x = model.crop_x.to_i
y = model.crop_y.to_i
w = model.crop_w.to_i
h = model.crop_h.to_i
img.crop "#model.crop_xx#model.crop_y+#model.crop_w+#model.crop_h"
img
end
end
end
查看
<%= image_tag @photo.photo_url(:big), id: "cropbox" %>
型号
mount_uploader :photo, PhotoUploader
attr_accessor :crop_x, :crop_y, :crop_w, :crop_h
before_create :crop_spot
after_update :crop_spot
更新
#Cropping spots
def crop_spot
photo.recreate_versions! if crop_x.present?
end
【问题讨论】:
你的crop_spot方法在哪里?可以发一下吗 @Baloo 请查看我更新的帖子 裁剪文本字段是否由 javascrpt 设置? @Baloo 抱歉,我没有看到您的回复。是的,正在设置值。我还是不知道该怎么办。 【参考方案1】:img.crop
方法不会改变图像,而是返回一个新图像。所以要么使用img.crop!
,它在原地编辑图像,要么删除最后一个img
,这样编辑后的图像就会被返回。
crop
方法就变成了
def crop
if model.crop_x.present?
resize_to_limit(600, 600)
manipulate! do |img|
x = model.crop_x.to_i
y = model.crop_y.to_i
w = model.crop_w.to_i
h = model.crop_h.to_i
img.crop "#model.crop_xx#model.crop_y+#model.crop_w+#model.crop_h"
end
end
end
【讨论】:
img.crop!是给 Rmagick 的。 img.crop 用于 MiniMagick。文档表明作物需要 WxH+X+Y【参考方案2】:对我来说是这样的:
include CarrierWave::MiniMagick
version :thumb do
process :resize_to_fit => [Cover::IMAGE_WIDTH, -1] # '-1' means that height is infinite (this is works for minimagick, but for rmagick it should be '10000').
process :manual_crop
process :resize_to_fill => [340, 191]
end
version :big do
process :resize_to_fit => [Cover::IMAGE_WIDTH, -1]
process :manual_crop
process :resize_to_fill => [Cover::IMAGE_WIDTH, Cover::IMAGE_HEIGHT]
end
def manual_crop
return if model.crop_coords.blank?
manipulate! do |img|
img.crop "#model.crop_coords['w'].to_ix#model.crop_coords['h'].to_i+#model.crop_coords['x'].to_i+#model.crop_coords['y'].to_i!"
img
end
end
crop_coords 是 JCrop 返回的坐标(但我们不需要 x2 和 y2,所以我这里不用) 考虑到格式是“WxH+X+Y”。 参考http://www.imagemagick.org/script/command-line-processing.php#geometry和http://www.imagemagick.org/script/command-line-options.php#crop
【讨论】:
以上是关于Carrierwave 和 Jcrop 不使用 Minimagick 进行裁剪的主要内容,如果未能解决你的问题,请参考以下文章
Rails 4,Carrierwave,jcrop,移动到 POST,而不是 UPDATE
rails4.2.8carrierwave+mini_magick+Jcrop,图片上传失败