因此,我知道imageMagik
和carrierwave
的工作原理,但问题是它们能否精确调整图像的大小。我尝试使用process resize_to_fit: [100, 100]
,并上传了一个800*200
图片,从而生成了100*27
而不是100*100
。 resize_to_fill
会这样做,但会裁剪出不应该的图像。是否有任何方法可以使用Ruby on Rails
调整为carrierwave
中的宽度和高度。
答案 0 :(得分:3)
载波将resize_to_fit和resize_to_limit的块传递到manipulate!
方法以裁剪图像。
通过更改此块,可以更改裁剪/调整大小。 Carrierwave
在此instance Magick::Image
上调用change_geometry
方法line。
change_geometry
方法支持通过指定约束来调整方法的大小。例如,您可以指定图像的尺寸,以便保留宽高比,但结果图像的宽度不大于640像素,高度不大于480像素。自变量可以是geometry string或Geometry 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 tool和Rmagick api文档提供了更多信息。
Carrierwave
使用miniMagick
to perform the resizing process。
ImageProcessing gem使用MiniMagick(用于使用ImageMagick命令行工具的RMagick的迷你替代品)来构建执行处理的“转换”命令。
这是resize_to_limit
方法的工作方式,它可以帮助您使用Rmagick
和ImageMagick
命令行工具来构建自己的方法。
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 tool和Rmagick处理图像。您可以访问上述网站以阅读其文档。
如您在下面所看到的,resize_to_limit
通过创建Magick::Geometry
的新实例并传递width
,height
,x,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 class和on rmagick.github.io的更多信息,以更好地了解帧选择过程的工作原理。
答案 1 :(得分:0)
@ImranNaqvi,它只是图像的一个版本,在html视图中显示它是另一个故事,对吗?因此,如果我误解了您,您仍然对<img src="your_img_100_27_url" width="100" height="100">
表示歉意。