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)


  1. Lisio
    14.10.2015 23:17
    +19

    Если прогнать PNG с троллейбусом из буханки через библиотеку, мы получим портрет автора PNGlitch?


    1. nochkin
      15.10.2015 04:11
      +11

      Нет. Это единственная картинка, которая не изменится.


  1. danaki
    15.10.2015 01:59
    +10

    Вся неведомая фигня приходит обязательно из Японии.


  1. k4shik
    15.10.2015 09:06

    Есть реальная история, а том как у фотографа украли ноут и затерли на нем все фотографии. Когда вора нашли, пытались восстановить фотографии, они либо не открывались либо были искажены. Но фотограф не растерялась и провела реальную выставку с этими фотографиями.
    http://melaniewillhide.com/portfolio/to-adrian-rodriguez-with-love/ Адриан Родригез собственно имя вора :)


  1. beliakov
    15.10.2015 09:15
    +15

    В детстве я ради эксперимента заклеивал изолентой пару-тройку контактов картриджей Денди и наблюдал похожие глюки в играх.

    image

    image

    image

    Оказывается это было целое искусство :-)


    1. kay
      15.10.2015 10:32
      +1

      У меня потерянное детство. Почему я не догадался также сделать? :(


      1. klikalka
        15.10.2015 11:53
        +7

        /шутка/
        Возможно, я не прав, но, может, у вас просто был достаточно красочный ковёр на стене?)


        1. kay
          15.10.2015 12:18
          +2

          Вот он, камень преткновения, повлекшкий отсутствие чувства вкуса у нескольких поколений.


    1. janatem
      15.10.2015 16:56
      +1

      Да, эти глюки намного интересней, чем подносить магнит к экрану ЭЛТ-телевизора.


      1. beliakov
        15.10.2015 17:01
        +5

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

        image


  1. zuborg
    15.10.2015 10:54
    +1

    Может кто-то в курсе, есть ли специальный научный термин, обозначающим различие между случаями, когда
    а) человек тратит время (годы, жизнь..), чтобы научиться получать результат именно таким, каким он задуман, и создает таким образом объект искуства
    б) человек тратит время, чтобы научиться получать в значительной мере либо совершенно непредсказуемый результат, который и становится объектом искуства


    1. bagyr
      15.10.2015 15:18
      +3

      Привнесение случайности в творческий процесс это вроде как алеаторизм (от лат. «alea» — игральная кость).


      1. RealFLYNN
        15.10.2015 16:58

        <на минуточку>Спасибо за новое клевое слово</на минуточку>


      1. Muxto
        15.10.2015 16:59
        +4

        А есть научный термин состояния, когда удивляешься, что на все случаи жизни придуманы научные термины?


    1. Chamie
      15.10.2015 16:19
      +2

      Для тех, чей внутренний парсер (как и мой) не справился сходу с текстом пункта «б»:

      б) человек тратит время, чтобы научиться получать ([в значительной мере либо совершенно] непредсказуемый) результат, который и становится объектом искусства


  1. Snakecatcher
    15.10.2015 11:17

    Вспомнилось, как на первом курсе, мы будущие инженеры по технологиям обработки металлов давлением, дружно, всей группой, не понимали истинной красоты «Черного квадрата» Малевича. А преподаватель по «Мировой художественной культуры», пытался нам вдоблить, что следует быть толерантными и открытыми.
    К его чести, концу семестра понял, что это бесполезно, дал каждому по теме доклада, и поставил зачеты «автоматом». :)


    1. tattoor
      15.10.2015 13:04
      +2

      По теме «Черного квадрата» Малевича. Я читал, что главная фишка картины была не только в том, что это черный квадрат, а в том где именно он стоял на выставке. А на выставке он стоял в Красном углу. Там, где на Руси всегда стояла икона, в каждом доме, а он поставил там вот такой битый пиксель.

      Посмотреть
      image


      1. Psychosynthesis
        15.10.2015 14:01
        +1

        Главная фишка картины вроде бы в том, что это своеобразный символ минимализма и действительно нечто вроде пикселя в «современном» (для того времени) арте.

        Но мы-то с вами знаем, что он просто супер-тонкий тролль.


      1. GamePad64
        15.10.2015 17:45
        +1

        В таком случае, это не картина, а то, что сейчас называют "арт-инсталляция". Между прочим, очень качественная и с глубоким смыслом.


        1. Snakecatcher
          15.10.2015 22:51

          А вот в таком контексте нам это не подносилось. Поэтому и вызывало недоумение у нас, и трезвый вопрос — что же в этом прекрасного?


  1. Kaberc
    16.10.2015 11:05
    +2

    Вот как «творит» мой старый ZTE телефон.

    image
    image


  1. 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