RMagick меняет размеры изображения под действием силы тяжести - PullRequest
3 голосов
/ 29 апреля 2011

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

В большинстве случаев мне нужно изменить размер изображения с 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")
}

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

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

Ответы [ 2 ]

2 голосов
/ 15 июня 2014

Проверьте реализацию следующей функции несущей волны 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 голос
/ 28 февраля 2012

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

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

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

...