PNG – графический формат, который появился в далёком 1995 году и до сих пор широко используется. Его основными свойствами считаются сжатие без потерь и поддержка прозрачных пикселей. Однако японский программист и художник под ником UCNV заинтересован не уникальными свойствами этого формата, а тем, как заставить его художественно глючить.
Чтобы научиться внедрять глюки, нужно более тщательно изучить детали формата.
Контрольная сумма
Первым делом, следует обратить внимание на механизм генерации контрольной суммы по коду CRC32. Она используется для подтверждения повреждённых изображений. Если обнаружено повреждение, то приложение просмотра отказывается его отображать. Поэтому нельзя генерировать глюки простыми методами, просто повреждая бинарный файл. Другими словами, формат PNG трудно подвергнуть глюкам.
Нам придётся генерировать искажения в соответствии со спецификациями PNG. То есть мы должны декодировать CRC32, затем переписать данные, пересчитать контрольную сумму и добавить её к отредактированным данным.
Состояние
Затем смотрим на процесс перекодирования в PNG.
Каждое из четырёх состояний, указанных на диаграмме, может быть мишенью глюка. Но внедрение искажений в первое состояние (сырые данные) — это то же самое, что искажать BMP, в этом нет смысла, да и технически это не глюк PNG. Искажение в последнем состоянии не сработает из-за вышеупомянутой системы подсчёта контрольной суммы. Остаётся внедрение искажений во второе и третье состояния, то есть в фильтрованные данные и сжатые данные. Наиболее эффективны манипуляции с фильтрами, они действительно дают хороший эффект. С помощью хаков можно наглядно показать различия между фильтрами. Внедрение глюков в состояние сжатых данных тоже имеет мало смысла. В PNG используется компрессия Deflate, и какие-то искажения выглядят просто как белый снег.
Есть и другие элементы, кроме названных, которые могут повлиять на внешний вид итоговой картинки. Это прозрачные пиксели и т.д.
Пять фильтров
Фактор, который больше всего влияет на внешний вид картинки после внедрения хака, это фильтры. Они конвертируют несжатые пиксельные данные по каждой линии, используя определённые алгоритмы, чтобы увеличить эффективность сжатия. Есть всего пять типов фильтров, включая четыре алгоритма под названием Sub, Up, Average и Paeth, а также None (то есть фильтры не применяются). Изображения PNG обычно сжимаются после того как наиболее эффективный фильтр применён по каждой линии. Поэтому обычно в готовом изображении PNG использованы все пять фильтров.
Пять фильтров влияют только на степень компрессии, то есть сама картинка не изменяется в зависимости от того, какой из фильтров был использован. Однако явное искажение итогового результата происходит в случае повреждения отфильтрованных данных. Трудно понять разницу между фильтрами, если используются все пять из них. Но эта разница становится очевидной, когда мы внедряем глюк, а при этом был использован один и тот же фильтр для каждой линии.
Каждый из фильтров отвечает за свою часть той красоты, которую мы увидим на искажённых PNG.
Глюки на практике
Оригинальное изображение
Искажённое изображение
Вверху мы видим пример глюка фильтра. В оригинальном изображении при сжатии использовались оптимизированные фильтры для каждой линии. При этом применялись все пять фильтров.
Разница между фильтрами
Вот искажённое изображение, предварительно отфильтрованное фильтром None (то есть без фильтров).
Поскольку фильтры не применяются, то данное искажение приравнивается к искажению в сырых данных. Каждый пиксель изолирован и не имеет никакого отношения к соседним. Поэтому единственный изменённый байт не имеет практически никакого эффекта.
Увеличенный фрагмент изображения
Теперь искажённое изображение, предварительно отфильтрованное Sub.
Если применить этот фильтр, то пиксель переписывает себя, отсылаясь к рядом стоящему пикселю. Вот почему проявляется уклон в правую сторону.
Увеличенный фрагмент изображения
Далее искажённое изображение, предварительно отфильтрованное Up.
Эффект аналогичен Sub, только направлен по вертикали.
Увеличенный фрагмент изображения
Искажённое изображение, предварительно отфильтрованное Average.
Фильтр Average отвечает за диагональное направление. Он генерирует метеороподобные тени, которые начинаются с повреждённого пикселя. Эффект мягкого перехода — также одно из последствий. Cамый красивый глюк.
Увеличенный фрагмент изображения
Искажённое изображение, предварительно отфильтрованное Paeth.
В фильтре Paeth реализован самый сложный алгоритм, по сравнению со всеми остальными фильтрами. Эффект затрагивает обширные области изображения даже при небольшом количестве искажённых пикселей. Оригинальное изображение сохраняется, но при этом интенсивно уничтожается.
Увеличенный фрагмент изображения
PNG – относительно простой формат, в сравнении с JPEG и более современными форматами. Алгоритмы фильтров как игрушки, а метод сжатия тоже довольно простой. Тем не менее, он проявляет довольно интересное разнообразие глюков.
Японский программист выложил Ruby-библиотеку PNGlitch, которая помогает внедрять глюки и перезаписывать контрольную сумму. На его странице можно посмотреть каталог работ и получить инструкции, как пользоваться библиотекой.
Комментарии (22)
k4shik
15.10.2015 09:06Есть реальная история, а том как у фотографа украли ноут и затерли на нем все фотографии. Когда вора нашли, пытались восстановить фотографии, они либо не открывались либо были искажены. Но фотограф не растерялась и провела реальную выставку с этими фотографиями.
http://melaniewillhide.com/portfolio/to-adrian-rodriguez-with-love/ Адриан Родригез собственно имя вора :)
zuborg
15.10.2015 10:54+1Может кто-то в курсе, есть ли специальный научный термин, обозначающим различие между случаями, когда
а) человек тратит время (годы, жизнь..), чтобы научиться получать результат именно таким, каким он задуман, и создает таким образом объект искуства
б) человек тратит время, чтобы научиться получать в значительной мере либо совершенно непредсказуемый результат, который и становится объектом искустваChamie
15.10.2015 16:19+2Для тех, чей внутренний парсер (как и мой) не справился сходу с текстом пункта «б»:
б) человек тратит время, чтобы научиться получать ([в значительной мере либо совершенно] непредсказуемый) результат, который и становится объектом искусства
Snakecatcher
15.10.2015 11:17Вспомнилось, как на первом курсе, мы будущие инженеры по технологиям обработки металлов давлением, дружно, всей группой, не понимали истинной красоты «Черного квадрата» Малевича. А преподаватель по «Мировой художественной культуры», пытался нам вдоблить, что следует быть толерантными и открытыми.
К его чести, концу семестра понял, что это бесполезно, дал каждому по теме доклада, и поставил зачеты «автоматом». :)tattoor
15.10.2015 13:04+2По теме «Черного квадрата» Малевича. Я читал, что главная фишка картины была не только в том, что это черный квадрат, а в том где именно он стоял на выставке. А на выставке он стоял в Красном углу. Там, где на Руси всегда стояла икона, в каждом доме, а он поставил там вот такой битый пиксель.
ПосмотретьPsychosynthesis
15.10.2015 14:01+1Главная фишка картины вроде бы в том, что это своеобразный символ минимализма и действительно нечто вроде пикселя в «современном» (для того времени) арте.
Но мы-то с вами знаем, что он просто супер-тонкий тролль.
GamePad64
15.10.2015 17:45+1В таком случае, это не картина, а то, что сейчас называют "арт-инсталляция". Между прочим, очень качественная и с глубоким смыслом.
Snakecatcher
15.10.2015 22:51А вот в таком контексте нам это не подносилось. Поэтому и вызывало недоумение у нас, и трезвый вопрос — что же в этом прекрасного?
5x86
16.10.2015 17:48Еще интересно накладывать на изображение аудио фильтры, как-то давно экспериментировал:
s17.postimg.org/uj6n1kfbx/good03.png
s23.postimg.org/gvgruyr1l/good02.png
s21.postimg.org/5b5afuftx/index1.jpg
s24.postimg.org/7oxqqwmfn/index4.jpg
s3.postimg.org/q68krxuy9/Sun_Spider.png
Lisio
Если прогнать PNG с троллейбусом из буханки через библиотеку, мы получим портрет автора PNGlitch?
nochkin
Нет. Это единственная картинка, которая не изменится.