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,图片上传失败

RailsCast 182(修订):Jcrop 不工作

Rails Carrierwave NoMethodError

如何不旋转 jcrop

Rails 头像上传