установка плотности на изображение, прочитанное с помощью RMagick - PullRequest
3 голосов
/ 04 июня 2011

Я пытаюсь использовать RMagick для преобразования SVG в PNG другого размера.

Когда я читаю в SVG с Magick::Image.read('drawing.svg') и записываю его в Drawing.png (эквивалент просто запуска convert drawing.svg drawing.png из командной строки), размер составляет 744x1052.

Предположим, я хочу, чтобы PNG был в два раза больше, чем по умолчанию. Вы не можете просто прочитать его, изменить его размер, а затем записать, так как это сначала растеризует SVG, а затем масштабирует это изображение в два раза больше, теряя качество и все преимущества использования векторной графики. Поэтому, если я правильно понимаю, вы должны установить плотность изображения при чтении.

image = Magick::Image.read('drawing.svg'){self.density = 144}.first

Но image.density все еще сообщает о плотности как "72x72", и если я выписываю изображение, оно имеет тот же размер, что и раньше, 744x1052. Кажется, не имеет значения, как я определяю плотность при чтении. С 144, «144», 144.0, «144.0», «144x144» и «144.0x144.0» он всегда возвращается «72x72».

Запуск convert -density 144 drawing.svg drawing.png из командной строки работает, как и ожидалось, и генерирует PNG, который в два раза больше, чем раньше, 2104x1488.

Я использую OS X 10.6.7, ImageMagick 6.7.0-0 (устанавливается через MacPorts), RMagick 2.13.1 и Ruby 1.9.2p180. Когда я помещаю свой код в контекст небольшого веб-приложения Sinatra на Heroku, он ведет себя так же некорректно, поэтому проблема, похоже, не связана с OS X или MacPorts.

1 Ответ

4 голосов
/ 04 июня 2011

Плотность - это разрешение (т.е. количество точек на дюйм), а не размер отрисовки.Из тонкого руководства :

Разрешение по вертикали и горизонтали в пикселях изображения.По умолчанию установлено значение "72x72".

Я думаю, вы ищете resize или resize!:

Изменяет размер приемника до указанных размеров.

Вы можете указать новый размер двумя способами.Либо укажите новые ширину и высоту явно, либо укажите масштабный коэффициент, число, которое представляет процентное изменение.

Так что это будет работать:

Magick::Image.read('drawing.svg').first.resize(2).write('drawing.png')

Или вот это:

img = Magick::Image.read('drawing.svg').first
img.resize!(2)
img.write('drawing.png')

Я не знаю, почему convert ведет себя иначе, чем библиотека, в игре могут быть другие настройки по умолчанию, которые имеют другие значения по умолчанию в библиотеке, или, возможно, -density делает больше, чем устанавливает плотность.

Если resize не подходит для вас (и, основываясь на ваших комментариях, это происходит слишком поздно, чтобы быть полезным), вы можете попробовать установить параметр size в блоке:

img = Magick::Image.read('drawing.svg'){ |opts| opts.size = '2104x1488' }.first

Конечно, вы должны знать, насколько велик SVG перед раздачей.Вы должны быть в состоянии указать такие вещи, как 200%x200% для геометрии, но read всегда игнорирует флаг на Magick::Geometry, когда я пытаюсь это сделать.

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