Ghostscript - конвертировать PS в PNG, вращать и масштабировать - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть приложение, которое создает очень хорошие графики данных в PostScript с размером букв и в альбомной ориентации.Пример входного файла: http://febo.com/uploads/blip.ps. [Примечание: это изображение правильно отображается в средстве просмотра, но преобразование PNG выходит с изображением вбок.] Мне нужно преобразовать эти файлы PostScript в изображения PNG, которые уменьшены и повернуты на 90 градусов для веб-презентации.

Я хочу сделать это с помощью ghostscript и без каких-либо других внешних инструментов, поскольку программа преобразования будет использоваться наи системы Windows, и Linux, и gs, кажется, общий знаменатель.(Я создаю Perl-скрипт с функцией «PS2png», которая будет вызывать gs, но я не думаю, что это имеет отношение к вопросу.)

Я искал в Интернете и провел пару днейпытаясь изменить примеры, которые я нашел, но ничего из того, что я пробовал, ничего не делает: (а) вращение, (б) изменение размера, (в) сохранение соотношения сторон и (d) избегание отсечения.

Я сделалнайдите пример, который вставляет команду «scale» в поток постскриптума и, кажется, хорошо работает для масштабирования изображения до желаемого размера при сохранении соотношения сторон.Но я не могу найти способ повернуть изображение с измененным размером так, чтобы, например, постскриптный ввод 601 x 792 точек (2504 x 3300 пикселей) стал выходным сигналом 800 x 608 пикселей.

Я ищу ghostscript / postscript fu, который я могу передать в командную строку gs для достижения этой цели.

Я пробовал командные строки gs с различными комбинациями -dFIXEDMEDIA, -dFitPage, -dAutoRotatePages = / None или / All, -c "<> setpagedevice", изменение -dDISPLAYWIDTHPOINTS и -dDISPLAYHEIGHTPOINTS, -g [ширина] x [высота], -dUseCropBox с повернутыми координатами и другими вещами, которые я забыл,Ничто из этого не сработало, хотя меня не удивит, если есть волшебная комбинация некоторых из них, которая сработает.Я просто не смог его найти.

Вот код ядра, который производит масштабированный, но не повернутый вывод:

## "$molps" is the input ps file read to a variable
## insert the PS "scale" command
$molps = $sf . " " . $sf . " scale\n" . $molps;
$gsopt1 = " -r300 -dGraphicsAlphaBits=4 -dTextAlphaBits=4";
$gsopt1 = $gsopt1 . " -dDEVICEWIDTHPOINTS=$device_width_points";
$gsopt1 = $gsopt1 . " -dDEVICEHEIGHTPOINTS=$device_height_points";
$gsopt1 = $gsopt1 . " -sOutputFile=" . $outfile;
$gscmd = "gs -q -sDEVICE=pnggray -dNOPAUSE -dBATCH " . $gsopt1 . " - ";
system("echo \"$molps\" \| $gscmd");

$ device_width_points и $ device_height_points вычисляются путем взятияисходный размер изображения и применение масштабного коэффициента $ sf.Я буду благодарен всем, кто может показать мне, как это сделать.Спасибо!

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Благодаря JHNC, я думаю, что теперь я его облизал, и вот для потомства вот что сработало.(Пожалуйста, подпишите JHNC, а не этот ответ.)

## code to determine original size, scaling factor, rotation goes above
my $device_width_points;
my $device_height_points;
my $orientation;
if ($rotation) {
    $orientation = 3;
    $device_width_points = $ytotal_png_pt;
    $device_height_points = $xtotal_png_pt;
} else {
    $orientation = 0;
    $device_width_points = $xtotal_png_pt;
    $device_height_points = $ytotal_png_pt;
}

my $orientation_string =
    " -dAutoRotatePages=/None -c '<</Orientation " .
        $orientation . ">> setpagedevice'";

## $ps = .ps file read into variable
## insert the PS "scale" command
$ps = $sf . " " . $sf . " scale\n" . $ps;

$gsopt1 = " -r300 -dGraphicsAlphaBits=4 -dTextAlphaBits=4";
$gsopt1 = $gsopt1 . " -dDEVICEWIDTHPOINTS=$device_width_points";
$gsopt1 = $gsopt1 . " -dDEVICEHEIGHTPOINTS=$device_height_points";
$gsopt1 = $gsopt1 . " -sOutputFile=" . $outfile;
$gsopt1 = $gsopt1 . $orientation_string;
$gscmd = "gs -q -sDEVICE=pnggray -dNOPAUSE -dBATCH " . $gsopt1 . " - ";
system("echo \"$ps\" \| $gscmd");

Одна из проблем, с которыми я столкнулся, заключалась в том, что некоторые параметры явно не очень хорошо сочетаются друг с другом - например, я попытался использовать параметр -g, чтобы установитьразмер вывода в пикселях, но в этом случае вращение не сработало.Вместо этого сработали команды DEVICE ... POINTS.

0 голосов
/ 11 февраля 2019

Лучший ответ:

Вы почти получили его в своем первоначальном исследовании.Просто установите ориентацию в gs вызове:

... | gs ... -dAutoRotatePages=/None -c '<</Orientation 3>> setpagedevice' ...

ср. обсуждение setpagedevice в Красной книге и ghostscript docs (непосредственно перед разделом 6.2)

Оригинальный ответ:

Помимо «масштаба», вам нужно «вращать» и «переводить», не обязательно в таком порядке.

Предположительно, это одностраничные файлы PostScript?

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

  • Глава 6 Синей книги содержит множество деталей
  • A ubc.На бумаге ca приведены некоторые иллюстрированные примеры (перейдите на страницу 4)

Простой файл PostScript для воспроизведения.Вам просто понадобятся три команды translate, scale, rotate в некотором порядке.Остальное для демонстрации происходящего.

%!

% function to define a 400x400 box outline, origin at 0,0 (bottom left)
/box { 0 0 moveto 0 400 lineto 400 400 lineto 400 0 lineto closepath } def

box clip % pretend the box is our bounding box 

clippath stroke % draw initial black bounding box

(Helvetica) findfont 50 scalefont setfont % setup a font

% draw box, and show some text @ 100,100
box stroke
100 100 moveto (original) show

% try out some transforms

1 0 0 setrgbcolor % red
.5 .5 scale
box stroke
100 100 moveto (+scaled) show

0 1 0 setrgbcolor % green
300 100 translate
box stroke
100 100 moveto (+translated) show

0 0 1 setrgbcolor % blue
45 rotate
box stroke
100 100 moveto (+rotated) show

showpage

Может быть возможно вставить вычисленное преобразование в командную строку gs следующим образом:

... | gs ... -c '1 2 scale 3 4 translate 5 6 rotate' -@ ...
...