Поменять изображение в файле .eps? - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь выяснить, как поменять изображение, встроенное в файл .eps, в формате JPEG. Мой "template" .eps файл содержит несколько разделов, которые выглядят так, каждый из которых представляет свое изображение:

Adobe_AGM_Image/AGMIMG_fl cf /ASCII85Decode fl /RunLengthDecode filter ddf
<<
/T 1
/W 4773 
/H 273 
/M[4773 0 0 -273 0 273 ]
/BC 8 
/D[0 1 0 1 0 1 0 1 ]
/DS [
[AGMIMG_fl 4773 string /rs cvx /pop cvx] cvx
[AGMIMG_fl 4773 string /rs cvx /pop cvx] cvx
[AGMIMG_fl 4773 string /rs cvx /pop cvx] cvx
[AGMIMG_fl 4773 string /rs cvx /pop cvx] cvx
]
/O 3
>>
%%BeginBinary: 1
img
[image data]~>

%%EndBinary

Из того, что я смог определить, файл изображения закодирован в ASCII85, но у меня нет ' Я не смог найти способ кодировать изображение JPEG, чтобы я мог поменять его.

Чтобы прояснить ситуацию, у меня есть и .eps и исходные файлы. ASCII85 декодирование блоков изображения в .eps не соответствует информации в формате JPEG, и наоборот.

[обновлено]

Моя конечная цель - создать .eps со слоями и без использования языка сценариев Adobe. Мы создаем финалы для наших клиентов, которые нам нужно добавить в шаблон (файл .eps), который дал нам наш принтер. Все финалы должны быть одинаковыми и содержать одинаковую цветовую схему (CMYK).

В файле .eps один из слоев (который может прочитать Adobe Illustrator) содержит обложку, которую необходимо распечатать; другой слой содержит линии разреза в «точечном цвете», которые принтер использует в качестве инструкций для своей машины для резки. Моя цель - автоматизировать процесс создания шаблонов, чтобы нам не нужно было вручную создавать файлы .eps для принтера.

Простой поиск / замена казался самым простым способом достижения моей цели, но я я не женат на этой идее. Все библиотеки изображений, такие как imagemagick, graphicsmagick и pillow, до сих пор меня не подводили.

[обновлено]

По запросу, вот изображение шаблона: printer template Есть четыре отчетливых черных изображения, которые, как можно догадаться, встречаются в средней точке между линиями разреза. Во время «процесса создания шаблонов» (возможно, плохого выбора слов) мы берем художественные работы, сгенерированные для наших клиентов - финалы - и размещаем их там, где черные изображения. Весь процесс является ручным, утомительным и должен быть возможным автоматизировать - это то, что я пытаюсь сделать.

1 Ответ

2 голосов
/ 07 января 2020

Реально вам не следует пытаться заменить изображение.

PostScript - это язык программирования, и если все файлы EPS, которые вы когда-либо планируете обрабатывать, не будут созданы одним и тем же приложением, и чтобы быть реалистичным c точно такой же версии этого приложения, то точная семантика программы может отличаться. Если семантика различается, поиск и замена завершатся неудачно.

Указанный вами раздел неполон, похоже, что это 4-цветное изображение в пространстве CMYK (потому что в нем есть 4 процедуры для чтения данных и что, вероятно, массив декодирования имеет 8 элементов), но нет попытки установить цветовое пространство, и вы не знаете CTM в действии. Масштабирование другого изображения для размещения в одной и той же области будет затруднено, если в нем не будет одинаковое количество строк и столбцов.

Данные изображения не просто кодируются в ASCII85, они также кодируются по длине прогона (ascii85 применяется после кодирование длины строки), и данные предоставляются в виде чередующихся растров. Линия голубого цвета, за которой следует линия пурпурного цвета, за которой следуют линия желтого цвета и линия блэка. Чтобы приложение для чтения изображений могло это прочитать, вам нужно будет прочитать набор из 4 растров, отменить кодировку ascii85, а затем отменить кодирование длины серии, затем взять выборки по отдельности из каждого растра и чередовать их, чтобы получить 4 строки CMYKCMYKCMYK ... данные. (Обратите внимание, что очень немногие приложения для обработки изображений могут обрабатывать данные CMYK вообще).

Чтобы заменить данные изображения и предполагать, что замена точно с такими же размерами, вам необходимо будет декодировать данные изображения в образцы изображения (то есть отменить сжатие JPEG). Разбейте его на C, M, Y, K плоскости, длину прогона кодируйте плоскости, затем ascii85 закодируйте каждый растр, а затем запишите данные изображения в строку растра за раз.

Если есть какие-либо различия в цветовом пространстве, размерах, битах на компонент или кодировку вам также потребуется заменить часть программы, которая считывает данные изображения и массирует их в форму, подходящую для передачи интерпретатору, и это будет большая задача, требующая изучить язык программирования PostScript.

Процедура 'img' (которая будет определена ранее в программе) берет данные словаря и либо превращает их в словарь изображений, который будет предоставлен оператору изображений PostScript, либо превращает его в эквивалентные операнды уровня 1, которые передаются оператору изображения, если интерпретатор очень старый и поддерживает только уровень 1.

В общем, единственный способ обработки файлов EPS - это использование полного интерпретатора PostScript, такие как Ghostscript (как используется ImageMagick и, Я полагаю, GraphicsMagick). Потому что вам действительно нужно интерпретировать программу. Вы можете вносить ограниченные изменения в программы, которые соответствуют спецификации EPS, но оптовая замена данных изображения не является одной из предполагаемых целей.

Я не знаю, что вы подразумеваете под «слоями». В PostScript нет концепции слоев, потому что это язык описания страниц; нет необходимости в «слое». Возможно, если бы вы могли объяснить, чего вы хотите достичь, можно было бы предложить другое решение.

[дополнительные]

ОК, поэтому «нормальный» способ действовать в такой ситуации - для PostScript с «шаблоном», который будет сгенерирован таким образом, чтобы он содержал контент от ваших клиентов.

Обычно контент клиента поставляется в виде EPS (в наши дни это может быть PDF), инструмента для создания выходных данных. поскольку принтер генерирует PostScript (не EPS, полноценная программа PostScript) и внедряет EPS в программу. В этом суть EPS, вы включаете его в программу PostScript.

Файлы EPS на самом деле не редактируются и не предназначены для изменения, ведь их изменение потенциально делает недействительной информацию BoundingBox. Единственный способ понять, что делает программа PostScript, - это интерпретировать ее, поэтому попытка поиска и замены на самом деле не является решением на будущее.

Я также немного обеспокоен тем, что вы, кажется, используете сжатые изображения JPEG в среде печати! JPEG (обычно) является методом сжатия с потерями, поэтому сжатое JPEG-изображение будет иметь артефакты, я бы обычно счел его неподходящим для того типа процесса, который вы, похоже, подразумеваете здесь.

Теперь я вижу несколько способов подойти к проблеме, которая не связана с редактированием файла EPS. Предполагая, что вы знаете размер и положение каждого из «ящиков» в EPS, а содержимое вашего клиента представлено в формате EPS, вы просто объединяете файлы вместе, генерируя информацию о местоположении по мере необходимости.

В PostScript непрозрачный модель визуализации, это означает, что если вы начинаете с «шаблона», а затем правильно настраиваете CTM, вы можете включить весь файл EPS таким образом, чтобы при визуализации он точно охватывал область, которую вы хотите заменить.

Для этого вам нужно знать точный размер и местоположение, которое должен охватывать EPS (я предполагаю, что вы знаете это), и точную площадь, покрываемую EPS, вы получите это из комментария %% BoundingBox файла EPS. , Это тогда тривиальный вопрос, чтобы добавить операции масштабирования и перевода так, чтобы EPS правильно определил размер позиционированного.

Вот скелет того, что я имею в виду:

%!PS

%!PS-Adobe-2.0 EPSF-1.2
%%Creator: Adobe Illustrator
%%Title: Template
%%BoundingBox: 0 0 612 792
....
....
%%EOF

% execute a save of the graphics state so the EPS doesn't change anything
gsave

% Reposition customer EPS file to first location in the template
% and scale it up (Lets pretend the first slot is at x=0, y=200
% and we need to double the size of the EPS so it fits.
0 200 moveto
2 2 scale

%!PS-Adobe-2.0 EPSF-1.2
%%Creator: Adobe Illustrator
%%Title: customer content file #1
%%BoundingBox: 0 0 100 100
....
....
%%EOF

% Now execute a grestore so everythgin goes back to the state it was in
% before we ran the EPS
grestore

% Repeat for each EPS file

showpage

Я предполагаю, что ваш Контент на заказ предоставляется в виде EPS, а не в виде данных изображения (растрового изображения). Если это действительно JPEG-изображение, то вы можете написать код PostScript, чтобы включить JPEG вместо EPS в приведенном выше коде.

Я не уверен, как работает ваш существующий процесс, для меня не очевидно, что Ваш ручной процесс позиционирования клиентского контента:

...