Структура png файла: Формат файла PNG — файл растрового изображения
Формат файла PNG — файл растрового изображения
Что такое PNG-файл?
Файл PNG (Portable Network Graphics) — это формат файла растрового изображения, в котором используется сжатие без потерь. Этот формат файла был создан в качестве замены формата обмена графикой (GIF) и не имеет ограничений авторского права. Однако формат файла PNG не поддерживает анимацию. Формат файлов PNG поддерживает сжатие изображений без потерь, что делает его популярным среди пользователей. С течением времени PNG превратился в один из широко используемых форматов файлов изображений.
Краткая история формата файлов PNG
Основной причиной создания формата файла PNG был запатентованный алгоритм сжатия Lempel-Ziv-Welch, используемый в формате файла GIF. Это, наряду с другими ограничениями GIF, привело к необходимости замены формата файла GIF. Первое предложение и название для формата файлов PNG поступило в январе 1995 года. Основные события, связанные с форматами файлов PNG, перечислены ниже:
- Октябрь 1996: Спецификации PNG версии 1.
0 были выпущены и позже появились как [RFC] (https://en.wikipedia.org/wiki/Request_for_Comments) 2083. В октябре 1996 года они стали рекомендацией W3C.
- Декабрь 1998: Выпущена версия 1.1 с небольшими изменениями и добавлением трех новых частей.
- Август 1999: Выпущена версия 1.2, добавляющая один дополнительный фрагмент.
- Ноябрь 2003 г.: PNG стал международным стандартом (ISO/IEC 15948:2003). Эта версия PNG лишь незначительно отличается от версии 1.2 и не добавляет новых фрагментов.
- Март 2004 г.: ИСО/МЭК 15948:2004.
Функциональное сравнение GIF и PNG
Формат файла PNG был разработан, чтобы быть простым и портативным, юридически свободным, взаимозаменяемым, гибким и надежным. В следующей таблице перечислены функции GIF, унаследованные форматом файла PNG, в дополнение к новым функциям.
Функция | GIF | PNG |
---|---|---|
Индексные изображения до 256 цветов | Да | Да |
Поддержка потоковой передачи | Да | Да |
Прозрачность | Да | Да |
Дополнительная информация | Да | Да |
Независимость от оборудования и платформы | Да | Да |
Действует | Да | Да |
Truecolor изображения до 48 бит на пиксель | Нет | Да |
Изображения в оттенках серого до 16 бит на пиксель | Нет | Да |
Полный альфа-канал (общие маски прозрачности) | Нет | Да |
Информация о гамме изображения | Нет | Да |
Надежность | Нет | Да |
Быстрая начальная презентация | Нет | Да |
Структура файла PNG
Почти все операционные системы поддерживают открытие файлов PNG. Например, средство просмотра Microsoft Windows имеет возможность открывать файлы PNG, поскольку ОС по умолчанию поддерживает эту поддержку, доступную как часть установки. Файл PNG состоит из «подписи» PNG, за которой следует серия //фрагментов//.
Заголовок файла PNG
Первые восемь байтов файла PNG всегда содержат следующие (десятичные) значения:
{{{137 80 78 71 13 10 26 10 }}}
Эта сигнатура указывает, что оставшаяся часть файла содержит одно изображение PNG, состоящее из серии фрагментов, начиная с фрагмента IHDR и заканчивая фрагментом IEND.
Кусочки
Каждый чанк состоит из четырех частей:
Длина: 4-байтовое целое число без знака, указывающее количество байтов в поле данных фрагмента. Длина учитывает только поле данных, а не само поле, код типа блока или CRC. Нуль является допустимой длиной. Хотя кодировщики и декодеры должны рассматривать длину как беззнаковую, ее значение не должно превышать 231 байт.
Тип фрагмента: 4-байтовый код типа фрагмента. Для удобства описания и изучения файлов PNG коды типов могут состоять только из прописных и строчных букв ASCII (AZ и az или 65–90 и 97–122 в десятичном формате). Однако кодировщики и декодеры должны обрабатывать коды как фиксированные двоичные значения, а не строки символов. Например, было бы неправильно представлять код типа IDAT эквивалентами этих букв в формате EBCDIC. Дополнительные соглашения об именах для типов фрагментов обсуждаются в следующем разделе.
Данные фрагмента: Байты данных, соответствующие типу фрагмента, если таковые имеются. Это поле может иметь нулевую длину.
CRC: 4-байтовый CRC (проверка циклическим избыточным кодом), рассчитанный для предыдущих байтов в блоке, включая код типа блока и поля данных блока, но не включая поле длины. CRC присутствует всегда, даже для фрагментов, не содержащих данных.
Длина данных чанка может быть любым числом байтов вплоть до максимального; поэтому разработчики не могут предполагать, что фрагменты выровнены по любым границам, превышающим байты.
Фрагменты могут появляться в любом порядке с учетом ограничений, наложенных на каждый тип фрагментов. (Одним заметным ограничением является то, что IHDR должен стоять первым, а IEND должен стоять последним; таким образом, фрагмент IEND служит маркером конца файла.) Могут появляться несколько фрагментов одного и того же типа, но только если это специально разрешено для этого типа.
Типы чанков
Типы фрагментов подразделяются на Критические и Вспомогательные на основе 4-байтового значения ASCII с учетом регистра, присвоенного Типу фрагмента. Все реализации должны понимать и успешно отображать стандартные критические фрагменты. Допустимое изображение PNG должно содержать фрагмент IHDR, один или несколько фрагментов IDAT и фрагмент IEND.
Сжатие
Метод сжатия PNG 0 (единственный метод сжатия, определенный в настоящее время для PNG) задает сжатие deflate/inflate со скользящим окном размером не более 32768 байт. Сжатие Deflate — это производная LZ77, используемая в zip, gzip, pkzip и связанных с ними программах. Были проведены обширные исследования, подтверждающие его безпатентный статус. Сжатые данные в потоке данных zlib хранятся в виде серии блоков, каждый из которых может представлять необработанные (несжатые) данные, данные, сжатые с помощью LZ77, закодированные с помощью фиксированных кодов Хаффмана, или данные, сжатые с помощью LZ77, закодированные с помощью пользовательских кодов Хаффмана. Бит маркера в последнем блоке идентифицирует его как последний блок, позволяя декодеру распознать конец сжатого потока данных.
Фильтрация перед сжатием
Фильтры предварительного сжатия применяются для подготовки данных изображения к оптимальному сжатию. Метод фильтра PNG определяет пять основных типов фильтров:
Тип фильтра | Имя | Прогнозируемое значение |
---|---|---|
0 | Нет | Сканерлайн передается без изменений |
1 | Sub | Передает разницу между каждым байтом и значением соответствующего байта предыдущего пикселя. |
2 | Up | Фильтр Up() аналогичен фильтру Sub(), за исключением того, что в качестве предиктора используется пиксель непосредственно над текущим пикселем, а не слева от него. |
3 | Среднее | Фильтр Average() использует среднее значение двух соседних пикселей (слева и сверху) для прогнозирования значения пикселя. |
4 | Paeth | Фильтр Paeth() вычисляет простую линейную функцию трех соседних пикселей (слева, вверху, вверху слева), затем выбирает в качестве предиктора соседний пиксель, ближайший к вычисляемому значению. |
Алгоритмы фильтрации применяются к «байтам», а не к пикселям, независимо от битовой глубины или типа цвета изображения. Алгоритмы фильтрации работают с последовательностью байтов, сформированной строкой сканирования. Если изображение включает альфа-канал, альфа-данные фильтруются так же, как данные изображения.
Когда изображение чересстрочное, каждый проход шаблона чересстрочной развертки обрабатывается как независимое изображение для целей фильтрации. Фильтры работают с последовательностями байтов, образованными пикселями, фактически переданными во время прохода, а «предыдущая строка сканирования» — это та, которая ранее была передана в том же проходе, а не соседняя в полном изображении. Обратите внимание, что частичное изображение, передаваемое за один проход, всегда прямоугольное, но имеет меньшую ширину и/или высоту, чем полное изображение. Фильтрация не применяется, когда это фрагмент изображения пуст.
Использованная литература
- [PNG — домашняя страница] (http://www.libpng.org/pub/png/)
Растровый формат PNG | SEO-портал
PNG (Portable Network Graphics — портативная сетевая графика) — популярный в интернете растровый графический формат файлов, применяющий технологию сжатия без потерь и поддерживающий полупрозрачность (альфа-канал).
Содержание
Создание изображений в формате PNG
Сделать картинку в формате PNG
можно с помощью любого графического редактора (в том числе Paint и Photoshop).
Как сохранить картинку в формате PNG в Paint?
Процесс сохранения в формат PNG
с помощью редактора Paint в Windows 10:
- Откройте файл изображения в Paint.
Программа поддерживает изображения в форматах
BMP
,TIFF
,PNG
,GIF
,JPEG
. - Кликните по вкладке Файл.
Откроется контекстное меню.
- Выберите Сохранить как → Изображение в формате PNG.
Откроется модальное окно выбора папки и названия для файла.
- Определите папку, введите название файла и нажмите Сохранить.
Как сохранить PNG-файл в Photoshop?
Процесс сохранения изображений в формате PNG
с помощью редактора Adobe Photoshop CC 2015:
- Откройте файл изображения в Photoshop.
Программа поддерживает изображения в самых разных графических форматах.
- Кликните по вкладке Файл.
Откроется контекстное меню.
- Выберите Сохранить для Web (по умолчанию клавиши
Alt
+Ctrl
+Shift
+S
).Откроется модальное окно сохранения.
- В правом верхнем углу диалогового окна из выпадающего списка выберите PNG-8 (палитра до 256 цветов) или PNG-24 (максимальная палитра цветов).
Откроются дополнительные настройки формата
PNG
. Для PNG-24:Дополнительные настройки для PNG-8:
- модель редукции цвета (способ определения цветов в палитру),
- количество цветов в палитре,
- определение модели дизеринга (способа сглаживания цветовых переходов),
- степень дизеринга (0-100%),
- цвет фона (при наличии прозрачности),
- модель дизеринга прозрачности,
- web-цвета (не актуально).
- Произведите необходимые настройки.
Изменение изображения в зависимости от выставленных настроек можно контролировать в левой части окна.
- Кликните Сохранить….
Откроется модальное окно выбора папки и названия для файла.
- Определите папку, введите название файла и нажмите Сохранить.
Как сохранить PNG-файл в Illustrator?
Программа Illustrator является графическим редактором компании Adobe, предназначенным для работы с векторной графикой. Функционал программы схож с функционалом Photoshop — для сохранения изображений в PNG-формате в «иллюстраторе» используйте аналогичную функцию «Сохранить для Web»:
- Откройте или создайте изображение в Adobe Illustrator.
Программа поддерживает изображения в самых разных графических форматах.
- Кликните по вкладке Файл.
Откроется контекстное меню.
- Выберите Сохранить для Web (по умолчанию
Alt
+Ctrl
+Shift
+S
).Откроется модальное окно сохранения.
- В правом верхнем углу диалогового окна из выпадающего списка выберите PNG-8 (палитра до 256 цветов) или PNG-24 (максимальная палитра цветов).
Откроются дополнительные настройки формата
PNG
(описаны выше в процессе сохранения PNG через «фотошоп»). - Произведите необходимые настройки.
Изменение изображения в зависимости от выставленных настроек можно контролировать в левой части окна.
- Кликните Сохранить….
Откроется модальное окно выбора папки и названия для файла.
- Определите папку, введите название файла и нажмите Сохранить.
Алгоритм сжатия PNG
Главной отличительной особенностью формата PNG
является сжатие без потерь данных: в зависимости от компрессора (сжимающей программы) можно уменьшить «вес» изображения в определённой степени.
В отличие от формата JPG
, степень сжатия PNG-файлов не регулируется и полностью зависит от предустановленных алгоритмов программы, с помощью которой сохраняется картинка.
Оптимизация PNG-изображений
Уменьшить размер файла <div class="seog-tooltip-more-link"><a href="/baza/kartinki/formaty-kartinok/png">Подробнее</a></div> »>PNG можно с помощью ограничения цветовой палитры.
В зависимости от глубины цвета изображения в формате PNG
, применяемые на веб-ресурсах, делят на 2 вида:
- PNG-8
Использует 8-битную глубину цвета (не более 256 индексированных цветов) и возможность использования прозрачных пикселей.
- PNG-24
Использует 24-битную глубину цвета и 8-битный альфа-канал (1 677 7216 цветов + канал прозрачности).
Экспортируя изображение из полноцветного PNG-24 в индексированный PNG-8 можно добиться значительного уменьшения размера файла («веса» изображения):
PNG-24 — 271 КБPNG-8 256 цветов — 87,7 КБPNG-8 128 цветов — 74,1 КБВ приведённых выше примерах можно заметить значительную разницу в размере файлов в зависимости от глубины цвета. Также очевидна нехватка цветов: на 256-цветном варианте можно рассмотреть «гранулы», которые становятся значительно более заметны в 128-цветном варианте из-за явного недостатка цветов в палитре.
Применение формата PNG-24 для изображений, использующих небольшое количество цветов, неоправданно увеличивает размер файла.
Следует иметь ввиду, что ограничение цветовой палитры до минимума ведёт к безвозвратной потере данных, которые невозможно восстановить из оптимизированного изображения.
Применяйте PNG-8 только если максимума в 256 цветов будет достаточно для изображения.
В случаях, когда картинка использует до 256 цветов, ограничение палитры может существенно уменьшить «вес» изображения, ни как не отражаясь на качестве его детализации:
Зависимость «веса» от глубины цвета для PNGПреимущества формата PNG
- Cжатие без потерь в качестве детализации.
- Нет ограничений в глубине цвета.
- Применение индексированной палитры (8 бит).
- Регулировка размера файла в зависимости от палитры.
- Применение канала прозрачности (альфа-канала).
Недостатки формата PNG
Рекомендации по применению формата
При использовании и оптимизации изображений в формате PNG
для вашего <div class="seog-tooltip-more-link"><a href="/terminy/sajt">Подробнее</a></div>
»>сайта руководствуйтесь следующими рекомендациями:
- используйте формат
PNG
для картинок с прозрачным фоном и небольших иконок, - используйте формат
PNG
, если потери при сжатии недопустимы, - используйте формат PNG-8 для картинок с небольшим количеством цветов (не более или около 256),
- используйте формат PNG-24 для картинок с большим количеством цветов (более 256),
- выбирая между PNG-8 и PNG-24, контролируйте размер файла и качество детализации изображения на выходе перед сохранением,
- помните, что при сохранении изображения в формате PNG-8 в его палитре останется не более 256 цветов, а данные о других цветах будут удалены и восстановить их будет невозможно.
Часто задаваемые вопросы
Чем открыть файл в формате PNG на компьютере?
Открыть файлы в формате PNG
можно с помощью любых программ для просмотра изображений (в том числе стандартные приложения Windows), всех современных интернет-обозревателей (браузеров), а также векторных и растровых графических редакторов.
Какой программой можно открыть файл PNG?
Список наиболее популярных программ для открытия и редактировать картинок в формате PNG
(и во многих других графических форматах):
- Microsoft Paint,
- GIMP,
- Adobe Photoshop,
- Adobe Illustrator,
- CorelDRAW,
- Corel Photo Paint,
- и др.
Как открыть файл PNG в «фотошопе»?
Чтобы открыть любое изображение в формате PNG
(а также в любом другом графическом формате) в Photoshop откройте программу и воспользуйтесь функцией Файл → Открыть… (клавиши Ctrl
+ O
). Таким же способом это можно сделать в любом другом графическом редакторе.
Как сохранить (создать) PNG-файл?
Ответ здесь.
Как изменить формат изображения на PNG?
Изменить формат картинки (фотографии или рисунка) на PNG
можно с помощью функции экспорта в графических редакторах или через онлайн-конвертеры.
Например, программа Microsoft Paint позволяет перевести картинку в формат PNG
с помощью функции «Сохранить как» следующие графические форматы: BMP
, TIFF
, PNG
, GIF
.
Как сжать изображение в формате PNG?
Сжатие PNG
происходит при сохранении картинки в данном формате, размер файла на выходе зависит от алгоритма сжатия программы, в которой он сохраняется. Если файл PNG
необходимо сжать в большей степени, можно изменить глубину цвета (экспорт из PNG-24 в PNG-8) или воспользоваться онлайн-компрессором tinypng.com.
Как уменьшить (изменить) размер файла в формате PNG?
Уменьшить размер PNG-файла можно следующими способами:
- изменив глубину цвета с 24-х до 8-бит,
- уменьшив количество индексированных цветов при 8-битной глубине цвета,
- отключив альфа-канал прозрачности,
- удалив мета-данные.
Все эти действия разом можно совершить при помощи онлайн-компрессора tinypng. com или частично с помощью функции «Сохранить для Web» в графических редакторах от компании Adobe (Photoshop и Illustrator).
Инспектор фрагментов файла PNG
Portable Network Graphics — это повсеместно распространенный формат файлов для передачи неподвижных изображений. Он используется в Интернете и в различных системах документов и имеет достойный уровень сжатия без потерь.
Файл PNG состоит из 8-байтового заголовка подписи, за которым следует любое количество фрагментов, содержащих управляющие данные/метаданные/данные изображения. Каждый чанк содержит три стандартных поля – длина 4 байта, код типа 4 байта, 4 байта CRC 9.0006 — и различные внутренние поля, зависящие от типа чанка.
Инструмент JavaScript на этой странице читает заданный PNG-файл и глубоко анализирует его, показывая список фрагментов и полей, а также любые ошибки, нарушающие спецификацию формата. Это может быть полезно при поиске скрытых метаданных (то есть вещей, которых нет на визуальном изображении), а также при разработке программного обеспечения, которое читает или записывает файлы PNG в соответствии с требованиями.
Программа
Использовать образец файла: | |
Чтение локального файла: |
Сводка фрагментов:
Начальное смещение | Необработанные байты | Кусок снаружи | Кусок внутри | Ошибки |
---|
Примечания
Формат файла PNG начинается с волшебной подписи, за которой следует любое количество фрагментов с унифицированным синтаксисом. Этот дизайн похож на другие популярные форматы мультимедийных файлов, такие как: BMP, TIFF, WAV, AVI, общий RIFF. Он отличается от обычных текстовых форматов файлов (на удивление существуют такие примеры, как Netpbm), Иерархические элементы XML , ZIP-контейнер подфайлов, Пользовательский двоичный формат PDF и т. д.
Файл PNG может содержать несколько фрагментов IDAT для хранения сжатых данных изображения.
Это семантически эквивалентно объединению байтов данных всех фрагментов IDAT; это не эквивалентно наличию нескольких (под)изображений. Наличие нескольких IDAT требует немного больше места в заголовках и нижних колонтитулах фрагментов и не дает никакой пользы декодеру. Основная причина наличия нескольких IDAT заключается в том, что программное обеспечение кодировщика хочет поддерживать низкий уровень использования памяти и не нуждается в буферизации всего IDAT, что требуется только для того, чтобы узнать окончательную длину фрагмента перед началом записи фрагмента. Гораздо реже причиной многих IDAT является то, что данные полезной нагрузки после сжатия превышают 2
Хотя этот инструмент довольно глубоко проникает в различные значения и поля в файлах PNG, он не может быть идеально детализирован. Например, вывод каждого символа DEFLATE, каждого значения пикселя или даже каждого значения палитры был бы очень подробным и, вероятно, бесполезным.
Кроме того, существуют некоторые сложные внешние форматы данных (не определенные в стандарте PNG), которые я предпочитаю не понимать и не декодировать, например профили ICC или метаданные Exif. Когда этого инструмента недостаточно для ваших нужд, единственным оставшимся решением является проверка необработанных байтов файла и анализ фрагментов и полей самостоятельно.
Если вы выберете чтение файла из вашей локальной системы, это веб-приложение будет выполнять все вычисления в вашем веб-браузере и не будет загружать изображение на сервер. Исходный код TypeScript и скомпилированный код JavaScript доступны для просмотра.
По сравнению с pngcheck
Сделано не мной, pngcheck — аналогичная программа командной строки, которая отображает информацию о фрагментах файла PNG и проверяет наличие ошибок формата. Он реализован на C и существует с 19 года.95, примерно в то время, когда родилась PNG. Насколько я знаю, это единственная общедоступная и всеобъемлющая программа проверки PNG, поэтому, по-видимому, многие другие разработчики на протяжении десятилетий полагались на нее для проверки своей работы.
Моя программа вышла в 2021 году, намного позже них.
С точки зрения детализации, pngcheck составляет около 5000 строк кода C (включая поддержку фрагментов MNG и
Моя программа и pngcheck могут правильно обнаруживать почти все распространенные и серьезные ошибки файлов. pngcheck не может обнаружить некоторые ошибки, такие как переполнение bKGD, переполнение tRNS, неправильный день месяца tIME, повторяющееся имя sPLT, неверный iTXt UTF-8, неправильный сжатый zTXt данные. Моя программа не может обнаружить какую-либо ошибку в IDAT, например. ошибка декомпрессии, неправильная длина, неправильный фильтр, индекс палитры вне допустимого диапазона.
Автор(ы) pngcheck признают, что за прошедшие годы исправили ряд ошибок, связанных с переполнением буфера, и признают, что все еще может оставаться больше уязвимостей безопасности.
Я вызвался прочитать весь исходный код pngcheck v3.0.3 (выпущен ) и был рад не найти критических логических ошибок или уязвимостей в системе безопасности. Напротив, я знал о переполнении буфера и числовых переполнениях при написании своего кода и считаю, что избежал всех возможных ошибок; кроме того, мой код работает на виртуальной машине JavaScript, которая по своей природе безопасна для памяти.
Подробнее
- W3C: Спецификация переносимой сетевой графики (PNG) (второе издание) (2003 г.)
- W3C: Спецификация Portable Network Graphics (PNG) (Второе издание) — Спецификации блоков
- PNG (Portable Network Graphics) Домашний сайт: Спецификация PNG, версия 1.2 (1999 год)
- Расширения спецификации PNG 1.2, версия 1.5.0 (2017 год)
- Википедия: Портативная сетевая графика
- Домашняя страница pngcheck, программа командной строки
- TweakPNG, программа с графическим интерфейсом пользователя для Windows от Джейсона Саммерса
- Brokensuite-20061204 Криса Ноклеберга (114 файлов)
Категории: Программирование, Обработка изображений, JavaScript / TypeScript
Последнее обновление:
swift — Невозможно прочитать фрагмент IHDR файла PNG
спросил
Изменено 3 года, 9 месяцев назад
Просмотрено 12 тысяч раз
Я прочитал спецификацию файла PNG и узнал, что после первых 8 байтов подписи PNG у нас есть фрагмент IHDR. На этом изображении указано, что у нас есть IHDR длиной 13 (0x0000000D) байт.
Я написал код в Swift для чтения того же файла PNG и печати байтов, который не дает мне IHDR длиной, равной 13 байтам, из первых 4 байтов фрагмента после подписи PNG. Вывод кода в консоли
Байты подписи PNG: 89 50 4E 47 0D 0A 1A 0A Смещение файла: 8 Байты длины IHDR: 00 00 00 04 Смещение файла: 12 Байты IHDR Chunktype: 43 67 42 49 Смещение файла: 16 Байт данных IHDR: 50 00 20 02 Смещение файла: 20 pngImageWidth: 1342185474 pngImageWidth: 20480 pngImageHeight: 8194
Я что-то пропустил или спецификация, которую я прочитал, устарела?
Первые 8 байтов фактически являются байтами подписи PNG. В байтах IHDR я не получаю ожидаемую длину и типы фрагментов (ширина, высота и другие байты IHDR являются переменными для разных файлов, но длина и типы фрагментов должны быть такими же, как я читал).
Код для чтения файла png прост и выглядит следующим образом:
enum PNGFileAnatomyConstants { статический пусть pngSignatureLength = 8 статический пусть ihdrLength = 4 статический пусть chunkTypeLength = 4 статический пусть chunkCRCLength = 4 статический пусть imageWidthLength = 4 статический пусть imageHeigthLength = 4 } функция анатомииOfPNGFile() { пусть комплект = Bundle.main охранять let pngFileUrl = bundle.url (для ресурса: "PNGFileSignature", withExtension: "png") else { fatalError() } делать { // Начало подписи------------------------------------------------------------- -------------------------------------------- пусть readFileHandle = попробуйте FileHandle (forReadingFrom: pngFileUrl) отложить { readFileHandle.closeFile() } let pngSignatureData = readFileHandle.readData(ofLength: PNGFileAnatomyConstants.pngSignatureLength) let signalString = pngSignatureData.hexEncodedString (параметры: [Data.HexEncodingOptions.upperCase]) если строка подписи != "8950 4E 47 0D 0A 1A 0A "{ фатальная ошибка("Это не png") } print("Байты подписи PNG: \(signatureString)") print("Смещение файла: \(readFileHandle.offsetInFile)") // Подпись ebd------------------------------------------------------------ -------------------------------------------- // Начало длины IHDR------------------------------------------------------------ ------------------------------------------------------------ пусть ihdrLengthDataBigEndian = readFileHandle. readData(ofLength: PNGFileAnatomyConstants.ihdrLength) пусть ihdrLength: UInt32 если PlatformEndianess.isLittleEndian { ihdrLength = Data(ihdrLengthDataBigEndian.reversed()).withUnsafeBytes({ (unsafePointer: UnsafePointer
) -> UInt32 в вернуть unsafePointer.pointee }) } еще { ihdrLength = ihdrLengthDataBigEndian.withUnsafeBytes({ (unsafePointer: UnsafePointer ) -> UInt32 в вернуть unsafePointer.pointee }) } пусть ihdrLengthDataBigEndianString = ihdrLengthDataBigEndian.hexEncodedString (параметры: [.upperCase]) print("Байты длины IHDR: \(ihdrLengthDataBigEndianString)") print("Смещение файла: \(readFileHandle.offsetInFile)") // Конец длины IHDR------------------------------------------------------------ ------------------------------------------------------------ // Начало типа чанка IHDR----------------------------------------------------------- ------------------------------------------------------------- let ihdrChunkTypeData = readFileHandle. readData(ofLength: PNGFileAnatomyConstants.chunkTypeLength) let ihdrChunkTypeDataString = ihdrChunkTypeData.hexEncodedString (параметры: [Data.HexEncodingOptions.upperCase]) print("Байты IHDR Chunktype: \(ihdrChunkTypeDataString)") print("Смещение файла: \(readFileHandle.offsetInFile)") // конец чанка IHDR----------------------------------------------------------- ------------------------------------------------------------- // начало байта данных IHDR----------------------------------------------------------- ------------------------------------------------------------- let ihdrData = readFileHandle.readData(ofLength: Int(ihdrLength)) пусть ihdrDataString = ihdrData.hexEncodedString (параметры: [.upperCase]) print("Байт данных IHDR: \(ihdrDataString)") print("Смещение файла: \(readFileHandle.offsetInFile)") // конец байта данных IHDR----------------------------------------------------------- ------------------------------------------------------------- делать { пусть pngImageWidth: UInt32 если PlatformEndianess.
isLittleEndian { pngImageWidth = Data(ihdrData.reversed()).withUnsafeBytes({ (unsafePointer: UnsafePointer
) -> UInt32 в вернуть unsafePointer.pointee }) } еще { pngImageWidth = ihdrData.withUnsafeBytes({ (unsafePointer: UnsafePointer ) -> UInt32 в вернуть unsafePointer.pointee }) } печать ("pngImageWidth: \(pngImageWidth)") } делать { пусть pngImageWidth: UInt16 пусть widthData = Data (байты: [ihdrData [0], ihdrData [1]]) если PlatformEndianess.isLittleEndian { pngImageWidth = Data(widthData.reversed()).withUnsafeBytes({ (unsafePointer: UnsafePointer ) -> UInt16 в вернуть unsafePointer.pointee }) } еще { pngImageWidth = widthData.withUnsafeBytes({ (unsafePointer: UnsafePointer ) -> UInt16 в вернуть unsafePointer. pointee }) } print("pngImageWidth: \(pngImageWidth)")//20480 пусть pngImageHeight: UInt16 пусть heightData = Данные (байты: [ihdrData[2], ihdrData[3]]) если PlatformEndianess.isLittleEndian { pngImageHeight = Data(heightData.reversed()).withUnsafeBytes({ (unsafePointer: UnsafePointer
) -> UInt16 в вернуть unsafePointer.pointee }) } еще { pngImageHeight = heightData.withUnsafeBytes({ (unsafePointer: UnsafePointer ) -> UInt16 в вернуть unsafePointer.pointee }) } print("pngImageHeight: \(pngImageHeight)")//20480 } } ловить { фатальная ошибка (ошибка. локализованное описание) } } данные расширения { структура HexEncodingOptions: OptionSet { пусть rawValue: Int статический let upperCase = HexEncodingOptions (rawValue: 1 << 0) } func hexEncodedString (параметры: HexEncodingOptions = []) -> String { пусть hexDigits = Array((options. contains(.upperCase) ? "0123456789ABCDEF " : "0123456789abcdef ").utf16) переменные символы: [unichar] = [] chars.reserveCapacity(3 * количество) для байта в себе { chars.append (hexDigits [Int (байт / 16)]) chars.append (hexDigits [Int (байт % 16)]) chars.append(hexDigits.last!) } return String (utf16CodeUnits: chars, count: chars.count) } } класс PlatformEndianess { статическая переменная isLittleEndian: Bool = { переменная целочисленная: UInt16 = 0x0001 return withUnsafeBytes(of: &integer, { (rawBufferPointer) -> Bool in вернуть rawBufferPointer.first == 0x01 }) }() }
- свифт
- png
- nsfilehandle
8
Как указал MartinR, для файлов PNG существует расширение, называемое CgBI.
Обычный файл PNG имеет структуру, в которой за сигнатурой PNG следует фрагмент IHDR.
Ниже приведен пример байтов в шестнадцатеричном представлении для обычного файла PNG (xx — байты-заполнители с переменными значениями):
Подпись PNG (8 байт): 8950 4Е 47 0D 0А 1А 0А =======Начало фрагмента======= IHDR-фрагмент: Длина фрагмента IHDR (4 байта): 00 00 00 0D Тип фрагмента IHDR (определяет тип фрагмента как IHDR): 49 48 44 52 Ширина изображения в пикселях (переменная 4): xx xx xx xx Высота изображения в пикселях (переменная 4): xx xx xx xx Флаги в чанке (переменная 5 байт): xx xx xx xx xx Контрольная сумма CRC (переменная 4 байта): xx xx xx xx =======Конец фрагмента=======
Файл PNG с расширением CgBI имеет структуру, в которой за подписью PNG следует фрагмент CgBI, а затем фрагмент IHDR.
Когда я говорю расширение, не путайте его с «filename.png, filename.cgbi». На самом деле это расширение того, как должен быть структурирован файл PNG.
Ниже приведен пример байтов в шестнадцатеричном представлении для файла PNG с расширением CgBI (xx — байты-заполнители с переменными значениями):
Подпись PNG (8 байт): 89 50 4E 47 0D 0A 1A 0A =======Начало фрагмента======= Чанк CgBI: Длина фрагмента CgBI (4 байта): 00 00 00 04 Тип блока CgBI (идентифицирует тип блока как CgBI): 43 67 42 49Информационные флаги CgBI (4 байта): xx xx xx xx Контрольная сумма CRC (переменная 4 байта): xx xx xx xx =======Конец фрагмента======= =======Начало фрагмента======= IHDR-фрагмент: Длина фрагмента IHDR (4 байта): 00 00 00 0D Тип фрагмента IHDR (определяет тип фрагмента как IHDR): 49 48 44 52 Ширина изображения в пикселях (переменная 4): xx xx xx xx Высота изображения в пикселях (переменная 4): xx xx xx xx Флаги в чанке (переменная 5 байт): xx xx xx xx xx Контрольная сумма CRC (переменная 4 байта): xx xx xx xx =======Конец фрагмента=======
В то время как файлы PNG отображаются во всех средствах просмотра изображений, расширение CgBI может отображаться или не отображаться во всех средствах просмотра изображений в зависимости от поддержки, которую они предоставляют для таких файлов.