Подробный гайд о том, как проверить PNG: сигнатура, hex, чанки tEXt/zTXt/iTXt, кодировки Latin-1

Гайд о том, как проверить PNG: сигнатура, hex, чанки tEXt/zTXt/iTXt, кодировки Latin-1 и UTF-8, метаданные и инструменты pngcheck, exiftool, Python.

2026.09.19                  


Подробный гайд о том, как проверить PNG: сигнатура, hex, чанки tEXt/zTXt/iTXt, кодировки Latin-1Подробный гайд о том, как проверить PNG: сигнатура, hex, чанки tEXt/zTXt/iTXt, кодировки Latin-1

Сразу важно уточнить:

PNG — это бинарный формат изображения, а не текстовый файл. Поэтому у самого .png нет текстовой кодировки вроде UTF-8, Windows-1251 или KOI8-R. Понятие «кодировка» применимо только к текстовым данным внутри PNG — например, к метаданным (комментариям, описаниям, автору).


Если вы хотите узнать:

  • формат файла — смотрите сигнатуру PNG;
  • кодировку текстовых метаданных — смотрите тип чанка tEXt, zTXt или iTXt;
  • байтовое представление — используйте hex-просмотрщик.



1. Проверить, что это действительно PNG

PNG всегда начинается с 8 байт:

89 50 4E 47 0D 0A 1A 0A

Linux / macOS

file image.png

Пример вывода:

image.png: PNG image data, 800 x 600, 8-bit/color RGBA, non-interlaced

Или посмотреть первые байты:

xxd -l 16 image.png
# или
hexdump -C -n 16 image.png

Windows (PowerShell)

Format-Hex -Path .\image.png | Select-Object -First 1

Или:

certutil -encodehex image.png hex.txt 4

Затем откройте hex.txt. Если первых 8 байт нет — это не PNG, даже если расширение .png.


2. Посмотреть байты и hex-представление

Linux / macOS

xxd image.png | head -n 20
hexdump -C image.png | head -n 20
od -c image.png | head -n 20

Windows

  • HxD — бесплатный hex-редактор.
  • 010 Editor — платный, но мощный.
  • PowerShell: Format-Hex .\image.png.

В hex-виде вы увидите сигнатуру PNG и названия чанков: IHDR, IDAT, IEND, tEXt, zTXt, iTXt и т.д.


3. Посмотреть чанки и метаданные PNG

pngcheck — лучший инструмент для чанков

Установка:

  • Ubuntu/Debian: sudo apt install pngcheck
  • macOS: brew install pngcheck
  • Windows: через Chocolatey choco install pngcheck

Запуск:

pngcheck -v image.png

Вы увидите список всех чанков:

File: image.png (12345 bytes)
  chunk IHDR at offset 0x0000c, length 13
  ...
  chunk tEXt at offset 0x00123, length 45
  chunk iTXt at offset 0x00150, length 80
  ...

exiftool — показывает метаданные

exiftool -a -G1 -s image.png

ExifTool покажет теги, но не всегда явно пишет кодировку. Зато видно, есть ли Text, Comment, Description, XML и т.п.


ImageMagick

identify -verbose image.png

Ищите блоки Properties, Profiles, Comment, Text.


4. Какая кодировка у текстовых чанков PNG?

Согласно спецификации PNG:

Чанк Что содержит Кодировка текста
tEXt Несжатый текст Latin-1 (ISO-8859-1)
zTXt Сжатый текст (zlib/deflate) Latin-1 (ISO-8859-1) после распаковки
iTXt Международный текст UTF-8

Важно:

  • В tEXt и zTXt кириллица официально не поддерживается. Если программа записала русский текст, она могла использовать iTXt или нестандартно трактовать Latin-1.
  • iTXt всегда UTF-8. Там же есть language tag и translated keyword.

5. Python-скрипт для точного определения кодировки метаданных

Если нужно автоматически разобрать PNG и увидеть, какие текстовые чанки есть и в какой они кодировке:

import struct
import zlib
import sys

def read_png_chunks(path):
    with open(path, 'rb') as f:
        sig = f.read(8)
        if sig != b'\x89PNG\r\n\x1a\n':
            print('Это не PNG: сигнатура не совпала')
            return

        print('PNG signature OK\n')

        while True:
            raw_len = f.read(4)
            if len(raw_len) < 4:
                break

            length = struct.unpack('>I', raw_len)[0]
            ctype = f.read(4)
            data = f.read(length)
            crc = f.read(4)

            ctype_str = ctype.decode('ascii', errors='replace')
            print(f'Chunk: {ctype_str} ({length} bytes)')

            if ctype == b'tEXt':
                keyword, text = data.split(b'\x00', 1)
                print('  Keyword:', keyword.decode('latin-1'))
                print('  Encoding: Latin-1 (ISO-8859-1)')
                print('  Text:', text.decode('latin-1'))

            elif ctype == b'zTXt':
                keyword, rest = data.split(b'\x00', 1)
                comp_method = rest[0]
                comp_data = rest[1:]
                text = zlib.decompress(comp_data)
                print('  Keyword:', keyword.decode('latin-1'))
                print('  Encoding: Latin-1 (ISO-8859-1), сжато zlib')
                print('  Text:', text.decode('latin-1'))

            elif ctype == b'iTXt':
                keyword, rest = data.split(b'\x00', 1)
                comp_flag = rest[0]
                comp_method = rest[1]
                lang_tag, rest = rest[2:].split(b'\x00', 1)
                translated_keyword, rest = rest.split(b'\x00', 1)
                text = rest

                if comp_flag == 1:
                    text = zlib.decompress(text)

                print('  Keyword:', keyword.decode('latin-1'))
                print('  Encoding: UTF-8')
                print('  Language tag:', lang_tag.decode('ascii', errors='replace'))
                print('  Translated keyword:', translated_keyword.decode('utf-8', errors='replace'))
                print('  Text:', text.decode('utf-8', errors='replace'))

            if ctype == b'IEND':
                break

if __name__ == '__main__':
    if len(sys.argv) < 2:
        print('Использование: python png_chunks.py image.png')
    else:
        read_png_chunks(sys.argv[1])


Запуск:

python png_chunks.py image.png

Скрипт покажет все чанки и явно напишет, где Latin-1, а где UTF-8.


6. GUI-инструменты

  • ExifToolGUI — удобный интерфейс к ExifTool для Windows.
  • XnView MP — показывает свойства и метаданные.
  • GIMP — меню Изображение → Метаданные → Показать метаданные.
  • HxD — для просмотра байтов вручную.
  • Notepad++ — не поможет с кодировкой PNG. Он покажет «кракозябры», а его определение кодировки для бинарного файла бессмысленно.

Важно

  • У PNG нет текстовой кодировки. Это бинарный формат.
  • Если нужно проверить, что файл — PNG, смотрите сигнатуру: 89 50 4E 47 0D 0A 1A 0A.
  • Если нужно узнать кодировку текста внутри PNG, смотрите тип чанка:
    • tEXt → Latin-1
    • zTXt → Latin-1 после распаковки
    • iTXt → UTF-8
  • Для быстрой проверки используйте pngcheck -v, exiftool или Python-скрипт выше.
  • Не пытайтесь определить кодировку PNG через текстовый редактор — это бессмысленно, потому что файл не текстовый.

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


Статью подготовил: Аверко Денис Сергеевич @Nymexis г. Омск (специалист по ЗИ)

Комментарии

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