我有一张图片,我想用白色空间和中心“填充”。
在大多数情况下,我需要将图像从16或32像素调整为32像素。 如果图像是16像素,我想在每一侧添加8px的白色空间,使其成为32像素的图像(原始浮动在中间)。
如果是32像素的图像,则没有任何变化。
我正在使用RMagick进行转换:
image.change_geometry!("#{size}x#{size}") { |cols, rows, img|
newimg = img.extent(cols, rows)
newimg.write("#{RAILS_ROOT}#{path}/#{name}.png")
}
哪个正常,但较小的图像位于新图像的左上角,而不是居中。 我正在看重力设置,它似乎是我需要的,但我无法弄清楚如何在通话中指定它?
提前致谢。
答案 0 :(得分:2)
检查以下载波功能的实现 http://rubydoc.info/gems/carrierwave/0.5.1/CarrierWave/RMagick#resize_and_pad-instance_method
这是仅使用RMagick依赖
的上述方法的一个版本require 'RMagick'
include Magick
module Converter
def self.resize_and_pad(img, new_img_path, width, height, background=:transparent, gravity=::Magick::CenterGravity)
img.resize_to_fit!(width, height)
new_img = ::Magick::Image.new(width, height)
if background == :transparent
filled = new_img.matte_floodfill(1, 1)
else
filled = new_img.color_floodfill(1, 1, ::Magick::Pixel.from_color(background))
end
# destroy_image(new_img)
filled.composite!(img, gravity, ::Magick::OverCompositeOp)
# destroy_image(img)
# filled = yield(filled) if block_given?
# filled
filled.write new_img_path
end
end
答案 1 :(得分:1)
extent()方法还有两个参数,x& y偏移,即图像将放置在范围内的位置。例如,如果您要求100x100图像的范围,而您的原始图像仅为50x50,那么您将执行img.extent(100,100,25,25) - 这会将图像设置为从偏移25处开始, 25(因此居中)。
注意:有一些问题,期望使用负偏移值(在这种情况下你想做-25,-25) - 请检查:
why is the behavior of extent (imagemagick) not uniform across my machines?