настройка плотности при чтении изображения с помощью RMagick

Я пытаюсь использовать 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.


person hynkle    schedule 04.06.2011    source источник


Ответы (1)


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

Вертикальное и горизонтальное разрешение в пикселях изображения. По умолчанию "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 когда попробую.

person mu is too short    schedule 04.06.2011
comment
Если бы я просто работал с преобразованием растра в растр, изменение размера определенно было бы тем, что я хотел. Но если я изменяю размер после того, как SVG был прочитан, я увеличиваю масштаб растрового изображения и получаю неприятные артефакты сглаживания можно ожидать. Команда convert, похоже, в первую очередь растрирует SVG как более крупное изображение, что создает правильно гладкие линии. - person hynkle; 04.06.2011
comment
Это не позволило бы мне отредактировать мой комментарий, но я хотел упомянуть тему, которую я нашел на форумах ImageMagick. говорит, что одним из применений -density является указание плотности чтения векторного изображения. Просто очевидно, что это не имеет того же значения для RMagick, что и для convert. - person hynkle; 04.06.2011
comment
@hynkle: взгляните на мое обновление. Предполагается, что вы можете указать процентную геометрию для opts.size, но я не могу заставить его работать или вывести сообщение об ошибке, объясняющее, почему это не сработает. Это довольно типично для моего взаимодействия с ImageMagick: отличная библиотека, если вы можете заставить ее работать, ужасный интерфейс. - person mu is too short; 04.06.2011
comment
@muistooshort, похоже, это больше не работает. Я пробовал, но изменение opts.size ни на что не влияет. - person Maximilian Ruta; 16.01.2016