RMagick меняет размеры изображения с помощью гравитации

У меня есть изображение, которое я хотел бы «дополнить» пробелами и центром.

В большинстве случаев мне нужно изменить размер изображения с 16 или 32 пикселей до 32 пикселей. Если размер изображения составляет 16 пикселей, я хочу добавить по 8 пикселей пустого пространства с каждой стороны, сделав изображение размером 32 пикселя (с исходным изображением, плавающим посередине).

Если это изображение размером 32 пикселя, то ничего не меняется.

Я использую RMagick для преобразования:

image.change_geometry!("#{size}x#{size}") { |cols, rows, img|
  newimg = img.extent(cols, rows)
  newimg.write("#{RAILS_ROOT}#{path}/#{name}.png")
}

Что работает нормально, но меньшие изображения находятся в левом верхнем углу нового изображения, а не по центру. Смотрел настройку гравити, вроде то что нужно, но не могу разобраться как указать в звонилке?

Заранее спасибо.


person d2kagw    schedule 29.04.2011    source источник


Ответы (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
person Christos K    schedule 15.06.2014

Метод extension() принимает еще два параметра, смещения x и y, где изображение будет помещено в пределах экстента. Например, если вы запрашиваете экстент для изображения размером 100 x 100, а ваш оригинал имеет размер всего 50 x 50, вы должны сделать img.extent(100, 100, 25, 25) -- что заставит изображение начинаться со смещения 25, 25 (таким образом, центрируя его).

ПРИМЕЧАНИЕ. Существует некоторая проблема с экстентом, ожидающим использования отрицательных значений смещения (в этом случае вам нужно сделать -25, -25) — проверьте это:

почему поведение степени (imagemagick ) неодинаково на моих машинах?

person dotdotdotPaul    schedule 28.02.2012