RMagick: масштабировать и изменять размер изображения для миниатюры - PullRequest
2 голосов
/ 13 января 2011

Я хочу изменить размер / масштабировать изображение. Оригиналы имеют не такие размеры, как 300x200 или 512x600. Я хочу изменить размер изображения до 100x100, но НЕ обрезать что-либо из изображения или изменить соотношение. В идеале изображение будет сначала масштабировать длинный край до 100 (соотношение сторон), а затем заполнить меньший край белым.

 .---------.
 |- - - - -|
 |  IMAGE  |
 |- - - - -|
 '---------'

Я не использую Paperclip или Rails, просто RMagick.

Ответы [ 4 ]

6 голосов
/ 13 января 2011

Я сделал это путем слияния измененного изображения с новым изображением 100x100.Это точно не лучший способ, но он работает:

img = Magick::Image.read("file.png").first
target = Magick::Image.new(100, 100) do
  self.background_color = 'white'
end
img.resize_to_fit!(100, 100)
target.composite(img, Magick::CenterGravity, Magick::CopyCompositeOp).write("file-small.png)
1 голос
/ 20 ноября 2013
image = Magick::Image.read("filename").first
resized = image.resize_to_fit(width, height)     # will maintain aspect ratio, so one of the resized dimensions may be less than the specified dimensions
resized.background_color = "#FFFFFF"             # without a default, background color will vary based on the border of your original image
x = (resized.columns - width) / 2                # calculate necessary translation to center image on background
y = (resized.rows - height) / 2
resized = resized.extent(width, height, x, y)    # 'extent' fills out the resized image if necessary, with the background color, to match the full requested dimensions. the x and y parameters calculated in the previous step center the image on the background.
resized.write("new_filename")

Примечание: на heroku, который на момент публикации использует imagemagick 6.5.7-8, мне нужно было умножить переводы x и y на -1 (и отправить положительные числа).Версия 6.8.0-10 ожидает отрицательные числа.

1 голос
/ 20 марта 2013

Поработав некоторое время, я заставил композитный трюк Fu86 работать так:

img = Image.read("some_file").first().resize_to_fit!(width, height)
target = Image.new(width, height) do
    self.background_color = 'white'
end
target.composite(img, CenterGravity, AtopCompositeOp).write("some_new_file")

AtopCompositeOp, кажется, работает лучше, чем CopyCompositeOp, который для некоторых стал частью моего фона чернымпричина.

0 голосов
/ 20 февраля 2011

Кажется, вы хотите использовать change_geometry ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...