Расставим точки над EPS

Давно все знают что если уменьшать картинку, то сохраняя в EPS мы можем уменьшить его размер в мб. Да вот только почему и как это происходит понимания мало. Поэтому написал небольшую хи-хи статейку про eps, как он устроен, что мы там уменьшаем и почему все иногда столько весит. Конечно, истиной в последней инстанции я не являюсь, ибо на PostScript писать не умею, в Adobe не работаю а жаль и как и любой другой человек могу в чем-то ошибаться. Итак, если готовы, прошу под кат...


Все начинается с хорошей истории

Истории Джона Уорнока и Чарльза Гешке. В начале 80-ых эти два человека работали в исследовательской лаборатории Parc компании Xerox. Работая там Уорнок разработал язык под названием "Interpress", который использовался для управления лазерными принтерами компании Xerox. Уорнок и Гешке в течении пары лет тщетно пытались убедить руководство компании сделать Interpress коммерческим продуктом. И устав от попыток — они уходят из компании и создают собственный бизнес.

Собственный бизнес они окрестили Adobe в честь небольшой речки, которая протекала возле дома Уорнока в Лос-Альтос, Калифорния. Вот так история "любимой" нами компании, которая дала нам возможность фигачить дудлики на шаттер, началась с желания двух людей печатать хорошо и качественно. Изначально планировалось создать свой мощный принтер, но потом пришло понимание, что лучше разрабатывать средства управления принтерами для других компаний. Так родилсяPostScript ( те самые PS в аббревиатуре EPS).

В 1984-ом был выпущен PostScript "Level 1" И основной его фишкой было машинно-независимость. Т.е. PostScript файл можно было напечатать на обычном принтере с разрешением 300 dpi или же выведен на фотонабор с разрешением 2400 dpi. Файл не был привязан к конкретному устройству печати (До этого печатаемый файл должен был разработан на устройстве от компании, которая производила сам принтер и обмен данными был практически невозможен). Язык был открытый и любой мог писать программы с его поддержкой, а проивзодители принтеров могли купить лицензию и встраивать в свои устройства.

Засветился в этой истории и Джобс. Apple тогда выпускала свой принтер (но как и других компаний качество печати было не ахти), и внедрение PostScript-контроллера (устройство в принтере которое понимает язык PostScript и читая его дает указание печатающей части что\как и где печатать) позволило печатать страницы высокого качества. А потом подоспела и компания Aldus со своей программой PageMaker (место для ностальгии) — издательской системой на базе postscript (в 94-омAdobe купила PageMaker, и уже через 10 лет закрыла проект, чтобы выпустить InDesign). Так началась эра PostScript в мире полиграфии.

В 94-ом вышла PostScript Level 2 c множеством приятных нововведений, а через еще 4 года и PostScript Level 3 со своими плюшками. Перечислять все думаю не стоит, там больше тонкости для товарищей полиграфистов.

Внутри Кота Темнота

И тут мы переходим к родиму EPS (Encapsulated Post Script). Это буквально энкапсулированый PostScript, т.е. программа на PostScript завернутая со своей превьюшкой в один файл. Почему так? Перевод кода PostScript в изображение занимает время, а так встроенная превью позволяет быстро видеть что в файле (к примеру в папке Винды). Т.е. по сути внутри EPS программа на PostScript / код. Вектор и текст — описан математически, с координатами точек, формулой кривых и т.д. Растр в EPS — бинарные данные.

Тут стоит порадовать старичков и вспомнить EPS 8 (место для ностальгии) и почему таким огромным кайфом был переход нашего стокерского брата с EPS 8 на EPS 10. Многие скажут — в EPS 10 появилась поддержка режимов наложения, прозрачности и т.д. А вот и нет. Ибо PostScript ничего из перечисленного не поддерживал и поддерживать не будет (ибо никто 4-ую его версию выпускать не собирается). Вообще EPS на самом деле ужасный формат, архаизм и орудие пыток над дизайнерами. Почему спросите вы? Переносить вектор из Illustrator в тот же Photoshop или InDeign проще и безболезненней через тот же Ai или PDF.

Может старички еще помнят хитрые способы отличия EPS 8 от EPS 10. Если открыть EPS в текстовом редакторе, то: файл EPS 10 начинается со строки: %!PS-Adobe-3.1 EPSF-3.0,  а файл EPS 8 c: %!PS-Adobe-3.0 EPSF-3.0. И вот вся разница в этом 3.1 или 3.0 после Adobe. Так вот, на самом деле это не единственное и не главное отличие 8-ой и 10-ой версии. Главное отличие в том, что хитрая компания Adobe припилила в EPS-10 приличный такой кусок данных. Этот кусок данных находится после окончания файла написанного на PostScript, т.е. там где все устройства видят знак: "Стоп. Дальше дороги нет". В самом файле это выглядит так: %%EOF (EndOfFile — конец файла). И все устройства и программы останавливаются после этого знака, кроме! Кроме нашего любимого Adobe Illustrator. Он в отличии от прочих наоборот игнорирует весь код до этого самого "конца файла", и начинает читать только после…

А после находится блок, который начинается с %AI9_PrivateDataBegin. А потом следует много букв и симловом в перемешку, белеберда на первый взгляд. На самом деле много белеберды от 1/3 до 2/3 всего файла. Заканчивается она таким выражением: %AI9_PrivateDataEnd. Так вот, вся эта белеберда — это ваш файл как его представляет иллюстратор, все ваши мэши и прозрачности, режимы наложения и кисти, сватчи, паттерны и символы. Adobe решили (и правильно сделали), что чем каждый раз читать и рендерить PostScript проще тупо вставить сам файл. Что интересно, если мы возьмем два разных EPS 10 файла (с разным содержимым) и перенесем от 1-го 2-ому всю часть с этой PrivateData — они оба будут открываться как 1-ый файл со всем его содержимым.

Поэтому если мы возьмем файл в Illustrator без прозрачностей и прочего, только шейпы и заливки, по хардкору и сохраним его в EPS 8 и EPS 10 — мы увидим хорошую такую разницу в занимаемом месте. Для теста я взял один из дамаск паттернов и сохранил в 8-ой и 10-ой версии.

Начиная с 10-ой версии EPS в нем меняется только эта "особая" часть данных в конце файла. И номер говорит только о том какая минимальная версия илла его откроет без проблем.

И тут вопрос — так зачем мы сохраняем в этом EPS 10, если используем только вторую часть файла? Только для совместимости со старыми программами\техникой. Все плюшки вашего файла получит только тот, чьи программы\техника читает ту самую белеберду в конце файла.

Возвращаясь к белеберде и размеру. Как известно без глюков счастья не бывает. Так вот. После %AI9_PrivateDataEnd иногда ваш EPS не заканчивается. Иногда он продолжается. (красным выделен конец файла, желтым — новая белеберда).

И если то что находилось между %AI9_PrivateDataBegin и %AI9_PrivateDataEnd несло в себе суть и смысл файла, то это просто мусор. В моем примере этого мусора на 21 килобайт, не так уж и много — но все же мусор.

Меньше, еще меньше, совсем мелкой

Теперь перейдем к святому. Если уменьшить артборд и его содержимое — вес файла уменьшится. Как? Разберем на простом примере. Файл с черным квадратом copyright Малевич, размером 800*800pt.



Лирическое отступление про координаты. Сразу оговорюсь, если судить по линейке в иллюстраторе, то у точки №1 координаты должны быть (50, 50), а не (0,0). Но в EPS они именно (0,0). Происходит это потому, что в файле берется не артборд, а Bounding Box вокруг всего что есть, соответственно эта точка самая левая верхняя и получает координаты 0, 0.

Теперь уменьшим наш квадрат и арборд до 10*10pt


Желтым я выделил новые координаты точек. И получается что если посчитать цифры у каждой точки нашего квадрата (ну кроме 1-ой), их на 1-ну, ато и 2-е меньше. Каждая цифта — это байт. Чисто по координатам вершин мы выиграли 4 байта!!! Уух! Вот это облегчили наш файл!!!

Но все не так просто. В 99% случаев координаты точки будут выглядеть следующим образом: 234.1234, 133.5678 (на картинке сверху выделенно красным). Иллюстратор поддерживает 4 цифры после запятой. И кол-во цифр после запятой при уменьшении размера картинку у нас практически не меняется. А вот целая часть — да. Т.е. если у нас артборд будет 1000*1000 pt, то у практически у самой крайней точки будут координаты: 999.9999, 999.9999 и уменьшая артборд до 50*50 pt — ее координаты станут: 49,999, 49.999. В итоге мы выигрываем 2 цифры на каждой точке, 2 байта информации.

Я взял один из своих файлов, там только шейпы и заливки. В нем 214619 точек, выигрывая на каждой 2 байта, получаем — 400 кб, т.е. мы уменьшаем вес файла на 400 кб только на координатах. Помня что в нашем EPS есть часть PostScript'a и часть чистого иллюстраторовского файла — получаем что вместе выигрываем практически 800 кб(это по нашим грубым подсчетам). А это уже практически мегабайт — и если ваш файл весит 15,8 мб и не пролазит на шаттер — эти цифры уже решают.

Теперь глянем на реальные цифры:



На самом деле нам удалось выиграть 433 кб уменьшая с 1000*1000pt до 50*50pt, а потом еще ~320 кб уменьшая до 25*25pt

Надеюсь вы еще следите за мыслью и готовы продолжать.

Итак, мы рассматривали файл в котором только шейпы и заливки, то есть то что можно было безболезненно запихнуть и в EPS 8.
Возьмем теперь файл, в котором много точек, шейпов, у каждого шейпа есть режим наложения и бэкграунд — мэш.
Как выглядит картинка и сколько занимают PostScript и PrivateData в каждом файле(размеры артборда/содержимого: 50*50pt и 300*300pt):



Разница в размере в 40!!! Мб Неплохо так уменьшило. И это уже не из-за координат. На изображеннии выше видно, что размер PrivateData части практически не меняется. Т.е. то что читает иллюстратор открывая этот EPS занимает совсем малую часть и на него практически не влияет изменение размера артборда/содержимого нашего файла.

Так почему же на столько сильно увеличивается PostScript часть? Тут мы возвращаемся к тому, что PostScript не поддерживает как таковой прозранчности и наложения и прочие любимые нами украшательства. Что он с ними делает? Растрирует. Каждый кусочек с тем что не поддерживает. Более того. На картинке выше светящиеся точки — это круги с градиентом и режимом наложения. Illustrator переводя в EPS растирует каждый кусочек, но делает не круглым, а квадратным, и прячем углы под клипинг маской.

Вот так выглядит один из кусочков в PostScript:

/T 1 — тип изображения
/W 4 — ширина изображения в пикселях
/H 3 -высота изображения в пикселях
/M[4 0 0 -3 0 3 ] — Матрица трансформирования (подставляет\крутит картинку так как она должна быть)
/MD true — хз
/BC 8 — битность изображения (8 бит)
/D[0 1 0 1 0 1 ] — это говорит что картинка в RGB
/DS
[ -от этой квадратной скобки до следующей сама картинка
<~.O68d-m^5e.46Jg~>
<~.jZDb.O65a-R9l]~>
<~+WhdJ+WhdJ+<M[I~>
]
/O 2
>>
%%BeginBinary: 1
img
%%EndBinary

И теперь вернемся с наших облаков на землю, к настройкам экспорта нашего иллюстратора:

В блоке Transparency>Custom как раз и скрываются настройки растрирования. Разрешение трогать я пока не буду — не наэкспериментировался с ним, чтобы откровенно заявлять о плюсах и минусах их подкрутки. А вот ползунок Raster/Vector Balance выкручивать на 100% вектор всегда абсолютно не реккомендую. Ибо:
1. если в файле только шейпы\заливки — толку от него 0.
2. Если в файле много элементов с прозрачностями\режимами наложения — выкрутив на 100% ваш файл может раздуться еще больше. К примеру файл описанный выше с артбордом 50*50Pt при сохранении с ползунком на 100% Vector весит — 274 мб (на 75% — 2,46 мб) Происходит это потому что пытается надробить еще больше более мелких кусочков, стараясь сделать из них вектор — а в результате получается все-равно растр. В некоторых случая можно попробовать убрать ползунок на 0% — это может еще уменьшить ваш файл. Если хотите посмотреть как в действительности вяглядит ваш EPS файл (т.е. как его видит не иллюстратор) откройте его в Иллюстраторе через Place. И сразу будут видны пиксели если вы ставили баланс на 0% или будет все достаточно красиво если на 100%. Так же стоит отметить то, что сохраняя с балансом 0% открывая потом этот EPS тем же Photoshop — картинка будет мягко говоря не радовать, поэтому лучше так делать не стоит.

Итак резюмируя все выше сказанное.

EPS 10 — прозрачностей/блэндинг модов в нем нет, все это представлено в нем в виде растра. И наличие этого растра шаттер не запрещает — ибо в EPS 10 есть еще чисто иллюстраторовская часть в которой и живет наш чистый вектор с прозрачностями и т.д. Если размер файла у нас получается большой — уменьшаем его линейные размеры (артборда и содержимого) — вес файла уменьшится. Обращаю внимание еще на то, что в данной статье я не беру во внимание такие опции при сохранении EPS как: Preview format (у меня None всегда), чекбоксы Embed Fonts/Include Thumbnail (у меня всегда сняты).

Спасибо за внимание, на этом все :) Удачных вам уменьшений ;)

11 комментариев

❄ Летта
Это так невероятно интересно и полезно, я аж зачиталась.
Спасибо, все так понятно и хорошо написано!
Прямо так и хочется пойти залезть в файлы и теперь уже осознанно ставить эксперименты! smile
garrykillian
thumbsup Только ручками код в EPS-ах лучше не править ;)
Топот Котов
Спасибо, очень интересно, но есть пара вопросов


Вы написали что такая разница в PS части возникает из-за того, что кусочки растрируются. Но мне не понятно, а что при уменьшении артборда этого не происходит? Или смысл в том, что эти кусочки растровые сохраняются с меньшим размером?

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

И второй вопрос, не могли бы вы сжать этот большой EPS zip`ом? Интересно насколько он избыточен.
garrykillian
1. Во вкладке Transparecny>Custom (при сохранении в EPS) там есть выбор ppi(pixel per inch) разрешения растеризации. При одинковом ppi файл с меньшим артбордом будет иметь более маленькие кусочки растра — и соответственно вес. Но чисто логически кусочек картинки меньше 1*1px быть не может — поэтому есть приделы уменьшения размера. Кол-во этих кусочков зависит от того как Illustrator порежет их, разделяя области чистого вектора, от вектора с прозрачностями\наложениями.
2. Происходит потеря информации, деградация. Да и хорошая. но происходит она только в PostScript части и с местами где есть прозрачность\режимы наложения. Часть с PrivateData, где у нас сырые данные илла — практически не меняется. С другой стороны как я писал в статье PostScript часть ну физически не может содержать больше, чем у EPS 8, все что лишнее — растр. Соответственно о какой-то пригодности файла (масштабирование без потерь, вывод под любое разрешение) речи быть не может.

ZIP
50*50 — 1 864 кб (файл вне архива: 2 464 кб )
300*300 — 11 762 кб (файл вне архива: 42 110 кб )
Т.е. да, зипуется достаточно хорошо, но шаттер, к сожалению, не просит зипить.
barsrsind
  • barsrsind
Офигенный стиль написания статьи, очень понятно и просто. Как раз эта тема меня волновала. У вас отменное понимание таких вещей)))
Teq
  • Teq
Большое спасибо за статью — очень многое для себя узнал!
А не откроете еще одну загадку: пункт Preview format (который у вас по None всегда) — что это за превью и для каких случаев оно вообще создается?
garrykillian
Если не ошибаюсь это та превьюшка которая появляется, когда вы смотрите eps через какую-либо прогу для просмотра картинок.
Teq
  • Teq
Не пользуюсь сторонними просмоторщиками, но встроенный просмотрщик в Mac OS нормально отображает EPS с отключенными превью.
garrykillian
Да Мак показывает и без него. А винда походу нет, сейчас на 2-ом компе проверю быстро.
garrykillian
Проверил, да — с превью ACDSee показывает картинку на eps, без него — нет.
Teq
  • Teq
С превью разобрались, спасибо!
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.