Поменять местами изображение в файле .eps?

Я пытаюсь понять, как поменять местами изображение, встроенное в файл.eps, на jpeg. Мой "шаблон".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, пока не помогли мне.

[обновлено]

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

1 ответ

Решение

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

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

Раздел, который вы предоставили, является неполным, он выглядит как 4-цветное изображение в пространстве CMYK (потому что он имеет 4 процедуры для чтения данных, и что, вероятно, массив Decode имеет 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 в приведенном выше коде.

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

Другие вопросы по тегам