通过imageMagic和Carrierwave获得精确尺寸

时间:2019-05-03 08:22:23

标签: ruby-on-rails ruby-on-rails-4 carrierwave rmagick

因此,我知道imageMagikcarrierwave的工作原理,但问题是它们能否精确调整图像的大小。我尝试使用process resize_to_fit: [100, 100],并上传了一个800*200图片,从而生成了100*27而不是100*100resize_to_fill会这样做,但会裁剪出不应该的图像。是否有任何方法可以使用Ruby on Rails调整为carrierwave中的宽度和高度。

2 个答案:

答案 0 :(得分:3)

摘要

载波将resize_to_fitresize_to_limit的块传递到manipulate!方法以裁剪图像。

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

  

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

     

自变量可以是geometry stringGeometry object。 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 command line toolRmagick api文档提供了更多信息。

说明

Carrierwave使用miniMagick to perform the resizing process

  

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 command line toolRmagick处理图像。您可以访问上述网站以阅读其文档。

如您在下面所看到的,resize_to_limit通过创建Magick::Geometry的新实例并传递widthheightx,y和{{ 1}}

flag

def resize_to_limit(width, height) width = dimension_from width height = dimension_from height manipulate! do |img| # Read The Explanation below end end 创建了自己的manipulate! method,它将iterate with the yield statement and crop/resize the image

Carrierwave

方法 image.each_with_index do |frame, index| frame = yield(*[frame, index, options].take(block.arity)) if block_given? frames << frame if frame end 将使用yield语句迭代between manipulate! do ... end

each_with_index*[frame, index, options].take(block.arity)将仅通过frame,因为它被称为with only one parameter

.take(block.arity)变量将等于返回的frame

new_image

您可以阅读有关Image::Magick classon rmagick.github.io的更多信息,以更好地了解帧选择过程的工作原理。

答案 1 :(得分:0)

@ImranNaqvi,它只是图像的一个版本,在html视图中显示它是另一个故事,对吗?因此,如果我误解了您,您仍然对<img src="your_img_100_27_url" width="100" height="100">表示歉意。