ghostscript отображает тень одного пикселя - PullRequest
0 голосов
/ 20 мая 2018

У меня проблема с отображением документа PS в TIFF (или в любом растровом формате).Одиночные пиксели имеют «тень», отрисованную на один пиксель ниже.Есть ли способ предотвратить это?

%!PS-Adobe-2.0 EPSF-2.0
%%BoundingBox: 0 0 10 10
<< /PageSize [10 10] >> setpagedevice
1 1 scale
/singlepx {
    newpath
    5 5 moveto
    0 1 rlineto
    1 0 rlineto
    0 -1 rlineto
    closepath
    setrgbcolor
    fill
} def
0.666 0.0 0.666 singlepx

Команда рендеринга:

gs -dSAFER -dNOPAUSE -dBATCH -dFitPage -dGraphicsAlphaBits=4 \
   -g10x10 -r600 -sDEVICE=tiffgray -sOutputFile=test.tif test.eps

Результат одинаков для выходных устройств png и jpeg.

EPS отрисован в evince TIF произведен ghostscript

1 Ответ

0 голосов
/ 20 мая 2018

Вы установили GraphicsAlphaBits = 4, это делает сглаживание.Результатом этого является то, что каждый нарисованный объект расширяется дальше на несколько пикселей, эти пиксели состоят из фона.

Если вы внимательно посмотрите на вывод Evince, вы увидите, что их значительно больше, чем 'Единственный пиксель 'предоставлен.Форма прямоугольника имеет границу вокруг трех сторон шириной 1 пиксель.Цвет - это цвет прямоугольника, 50% состоит из фона.По углам они составляются дважды, в результате чего вы получаете 25% цвета.

Если вы хотите рисовать до уровня пикселей, вы не можете использовать GraphicsAlphaBits.

Примечаниечто вы все равно не рисуете на один «пиксель».Ваш прямоугольник имеет ширину в один PostScript и высоту в 1.Единицы PostScript составляют 1/72 дюйма.Таким образом, при разрешении 72 т / д да, это 1 пиксель, но отображается при 1440 т / д, то есть 20 на 20 пкс.переключатели командной строки и элементы управления PostScript.Во-первых, ваш EPS-файл недопустим, поскольку он содержит setpagedevice, что недопустимо для EPS.

Ваша командная строка устанавливает разрешение 600 точек на дюйм, а выходной размер - 10x10 пикселей * 1014.*.При разрешении 600 т / д, размер носителя составляет 1/60 дюйма.Однако вы также устанавливаете -dFitPage.Это перехватывает запросы MediaSize из входящего потока данных, выясняет, какой масштабный коэффициент необходим для того, чтобы запрошенный носитель помещался на фактическом носителе, а затем масштабирует содержимое, чтобы оно соответствовало фактическому размеру носителя.

Поскольку ваш «EPS» устанавливает размер носителя, Ghostscript выполняет некоторое масштабирование, чтобы запрошенный квадрат блока 10x10 вписался в квадрат 10x10 пикселей.Теперь и -g, и -dFitPage выполняют операции масштабирования, и существует предел точности, с которой это выполняется.

Еще более усложняет проблему тот факт, что правило рендеринга PostScript - «любая часть».of pixel ', поэтому, если масштабирование / точность должны работать таким образом, чтобы отображение из пространства пользователя в пространство устройства не точно соответствовало сетке пикселей пространства устройства, пиксель мог бы рассматриватьсякак (только едва) коснувшись, и так будет оказано.

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

Обратите внимание, что PostScript (в отличие от некоторых других PDL) вообще не позволяет вам адресовать пиксели устройства, и вы (если япомните правильно) прямо сказали, что вы не можете надежно сделать это, ни в PLRM, ни в одной из вспомогательных книг.

...