所以我知道该怎么都imageMagik
和carrierwave
工作,但问题是他们能做到图像的精确大小调整。我尝试过process resize_to_fit: [100, 100]
并上传了一个800*200
图片,结果是100*27
而不是100*100
。resize_to_fill
会这样做,但会裁剪不应该的图像。有没有办法在Ruby on Rails
使用中将尺寸调整为确切的宽度和高度carrierwave
。
Carrierwave通过与块resize_to_fit和resize_to_limit到manipulate!
方法裁剪图像。
通过更改此块,可以更改裁剪/调整大小。在此行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
方法就是这样工作的,它可以帮助您使用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
的命令行工具和Rmagick。您可以访问上述网站以阅读其文档。
正如你可以阅读以下resize_to_limit
通过创建的新实例操纵图像Magick::Geometry
和传递width
,height
,x,y
和flag
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] 删除。
我来说两句