Подробный гайд о том, как проверить 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-1zTXt→ Latin-1 после распаковкиiTXt→ UTF-8
- Для быстрой проверки используйте
pngcheck -v,exiftoolили Python-скрипт выше. - Не пытайтесь определить кодировку PNG через текстовый редактор — это бессмысленно, потому что файл не текстовый.
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.