RMagick用重力改变图像范围

时间:2011-04-29 11:43:48

标签: ruby-on-rails rmagick

我有一张图片,我想用白色空间和中心“填充”。

在大多数情况下,我需要将图像从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")
}

哪个正常,但较小的图像位于新图像的左上角,而不是居中。 我正在看重力设置,它似乎是我需要的,但我无法弄清楚如何在通话中指定它?

提前致谢。

2 个答案:

答案 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?