通过imageMagic和Carrierwave获得精确尺寸

伊姆兰·纳克维

所以我知道该怎么都imageMagikcarrierwave工作,但问题是他们能做到图像的精确大小调整。我尝试过process resize_to_fit: [100, 100]并上传了一个800*200图片,结果是100*27而不是100*100resize_to_fill会这样做,但会裁剪不应该的图像。有没有办法在Ruby on Rails使用中将尺寸调整为确切的宽度和高度carrierwave

法布里佐·贝托格里奥(Fabrizio Bertoglio)

概要

Carrierwave通过与块resize_to_fitresize_to_limitmanipulate!方法裁剪图像。

通过更改此块,可以更改裁剪/调整大小。在此Carrierwave调用instanceMagick::Image方法change_geometry

change_geometry方法支持通过指定约束来调整方法的大小。例如,您可以指定图像的尺寸,以便保留宽高比,但结果图像的宽度不大于640像素,高度不大于480像素。

参数可以是几何字符串Geometry对象Change_geometry屈服于块,基于关于self的参数传递新的宽度和高度值。返回值是块的返回值。

您需要传递manipulate!类似于以下示例的代码块

def resize_no_crop(width, height)
  width = dimension_from width
  height = dimension_from height
  manipulate! do |img|
      # change the below geometry object to achieve your effect
      # geometry = Magick::Geometry.new(width, height, 0, 0,    Magick::GreaterGeometry)
      new_img = img.change_geometry(geometry) do |new_width, new_height|
      img.resize(new_width, new_height)
    end
    destroy_image(img)
    new_img = yield(new_img) if block_given?
    new_img
  end
end

根据需要设置geometry对象

geometry = Magick::Geometry.new(width, height, 0, 0, !)

正如我在文档中所读到的,最后一个参数!具有以下作用

! 当您要强制新图像具有完全由width和height属性指定的大小时,请使用此标志。

ImageMagick命令行工具Rmagick api文档提供了更多信息。

说明

Carrierwave用于miniMagick 执行调整大小的过程

ImageProcessing gem使用MiniMagick(用于使用ImageMagick命令行工具的RMagick的迷你替代品)构建执行处理的“转换”命令。

resize_to_limit方法就是这样工作的,它可以帮助您使用RmagickImageMagick命令行工具构建自己的方法

module MiniMagick
  extend ActiveSupport::Concern

  included do
    require "image_processing/mini_magick"
  end

  module ClassMethods
    def convert(format)
      process :convert => format
    end

    def resize_to_limit(width, height)
      process :resize_to_limit => [width, height]
    end
  end
end

method操纵用图像ImageMagick的命令行工具Rmagick您可以访问上述网站以阅读其文档。

正如你可以阅读以下resize_to_limit通过创建的新实例操纵图像Magick::Geometry和传递widthheightx,yflag

def resize_to_limit(width, height)
  width = dimension_from width
  height = dimension_from height
  manipulate! do |img|
     # Read The Explanation below
  end
end

Carrierwave创建了自己的manipulate!方法,该方法与yield语句进行迭代并裁剪/调整图像大小

  image.each_with_index do |frame, index|
    frame = yield(*[frame, index, options].take(block.arity)) if block_given?
    frames << frame if frame
  end

该方法each_with_index在yield语句之间manipulate! do ... end进行迭代

*[frame, index, options].take(block.arity).take(block.arity)只会把frame它称为只有一个参数

frame变量将等于new_image返回的值。

geometry = Magick::Geometry.new(width, height, 0, 0, Magick::GreaterGeometry)
new_img = img.change_geometry(geometry) do |new_width, new_height|
  img.resize(new_width, new_height)
end
destroy_image(img)
new_img = yield(new_img) if block_given?
new_img

你可以阅读更多关于图片:: Magick类对rmagick.github.io更好地理解如何帧选择作品的过程。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章