Чтение информации заголовка изображения без загрузки всего изображения

У меня есть приложение .net 3.5, которое будет работать с большим количеством изображений. Мне нужно проверить правильность расширения изображения, его высоты и ширины, а также PPI. Я не хочу загружать все изображение в .net-изображение или растровое изображение, это займет много времени и потребует больших ресурсов. Я не могу использовать сторонние плагины или dll, и, конечно, это нужно сделать вчера.

Итак, я читаю начальные байты файлов, проверяя «магические» числа, чтобы убедиться, что расширение изображения совпадает, а затем высоту и ширину изображения для большинства типов изображений, которые мне нужно обрабатывать. Это гораздо быстрее и менее ресурсоемко. Мне не помешала бы небольшая помощь в чтении PPI для некоторых типов изображений, и два из этих типов только что поставили меня в тупик после проверки расширения.

BMP, JPG, GIF и PNG Мне нужна помощь в чтении PPI.

  • Ищем что-то вроде расположенного по смещению xx.

TIF, EPS и PSD Мне нужна помощь в чтении высоты, ширины и PPI.

  • Я в значительной степени застрял в файлах Eps и Psd, и все могло бы помочь.

  • Да, я знаю о tiflib, он отлично выглядит и намного больше, чем мне нужно. Более легкая версия, которая обрабатывает только высоту, ширину и PPI, была бы отличной. Если мне нужно, я могу это сделать, но я надеюсь, что у кого-то все готово :-)


person Loscas    schedule 17.01.2013    source источник
comment
Определить PPI будет не так просто, как смещение XX для всех форматов. Например, размер PNG в пикселях является необязательным (libpng. org/pub/png/book/chapter11.html#png.ch11.div.8) и находится в чанке среди других чанков. Вам придется читать куски, пока вы не найдете один pHY (если он существует). Другие форматы даже не сохраняют размеры в пикселях, или размер в пикселях может быть неправильным (но не используется приложением, поэтому он все еще работает).   -  person Simon Mourier    schedule 22.01.2013
comment
PPI также зависит от выходного дисплея. Форматы файлов, которые используют PPI, обычно предназначены для ссылки на исходное устройство вывода.   -  person Adam Zuckerman    schedule 22.01.2013
comment
EPS и PSD являются составными документами хранения. Вы не сможете найти то, что ищете, по определенному смещению. Каждое содержащееся изображение может быть растровым или векторным. Также может быть большое количество изображений в любом типе файла.   -  person Adam Zuckerman    schedule 22.01.2013
comment
@SimonMourier, это будет автоматический фильтр, прежде чем человек действительно посмотрит на изображение, и мы пытаемся сократить количество плохих фотографий, которые попадут к этому человеку. Если данные неверны или не существуют, мы поймаем их на следующем шаге. Перебирая фрагменты, пока я либо не найду то, что ищу, либо не найду данные изображения, это то, что мне нужно сделать для PNG, как это выглядит.   -  person Loscas    schedule 30.01.2013
comment
@AdamZuckerman, PPI используется в нескольких разных контекстах и ​​часто ошибочно заменяется DPI. В этом случае я смотрю на фотографии и использую разрешение и плотность пикселей (PPI) для оценки качества изображения в том виде, в котором оно было снято. elizabethhalford.com/editing/pixels-and-dots-the-game andrewdaceyphotography.com/articles/dpi   -  person Loscas    schedule 30.01.2013
comment
Кроме того, похоже, что я не смогу выполнить проверку файлов EPS или PSD.   -  person Loscas    schedule 30.01.2013


Ответы (2)


Все расположения байтов предполагают, что первый байт находится в позиции 1, а не 0.

Файлы PNG Ширина: 9–12 байт, Высота: 13–16 байт, PPI: ищите 4-байтовую подпись 112 72 89 115 (десятичные значения), байты 1–4 (последующие) содержат X пикселей на единицу, байты 5-8 содержат Y пикселей на единицу, байт 9 содержит спецификатор единицы измерения (0=неизвестно, 1=метр). PPI хранится в необязательном фрагменте и может существовать не во всех файлах PNG.

http://www.libpng.org/pub/png/spec/iso/index-object.htm или http://en.wikipedia.org/wiki/PNG_file_format

Файлы BMP Ширина: байты 18–21, Высота: байты 22–25, PPI: байты 38–41 содержат X пикселей на метр, байты 42–45 содержат Y пикселей на метр.

http://en.wikipedia.org/wiki/BMP_file_format

Файлы JPG JPEG относится к сжатию, а JFIF — это фактический формат хранения файлов. Ширина: , высота: , PPI: байты 11-12 содержат X пикселей на единицу, байты 13-14 содержат Y пикселей на единицу. Байт 10 содержит единицу измерения (0 = нет единиц, 1 = пикселей на дюйм, 2 = пикселей на см).

http://en.wikipedia.org/wiki/JPEG_File_Interchange_Format и http://www.ecma-international.org/publications/files/ECMA-TR/TR-098.pdf

Файлы GIF Ширина: 7–8 байт, Высота: 9–10 байт, PPI: файлы GIF не содержат информации о плотности пикселей.

http://en.wikipedia.org/wiki/Graphics_Interchange_Format

Я предоставил ссылки на другие форматы, поскольку они требуют специальных знаний о формате, чтобы определить, хранится ли запрошенная вами информация и где.

http://partners.adobe.com/public/developer/tiff/index.html

http://en.wikipedia.org/wiki/Portable_Document_Format и http://www.adobe.com/devnet/pdf/pdf_reference_archive.html

http://www.adobe.com/devnet-apps/photoshop/fileformatashtml/

person Adam Zuckerman    schedule 29.01.2013
comment
В моем собственном эксперименте ширина PNG была 16 (десятичная), а высота 20. - person Sten Petrov; 26.12.2015

Вместо того, чтобы тратить сотни часов на разработку и отладку собственного многоформатного синтаксического анализатора изображений, я бы посоветовал вам изучить способы оптимизации существующих методов. В то время как некоторые форматы изображений просты, другие сложны. Некоторые действительно тяжелые. Как уже упоминалось, некоторые «форматы» являются просто контейнерами для других форматов.

Вот несколько предложений:

Ускорить загрузку изображение с диска в приложении Windows Forms (c#.net)

http://www.vcskicks.com/fast-image-processing.php

Как найти пиксель на дюйм в изображении JPG?

person lfalin    schedule 28.01.2013
comment
Как я упоминал в исходном посте, загрузка всего изображения для получения этих трех частей информации об изображении требует больших ресурсов. Зачем загружать целый файл размером 10 или 25 МБ, если вам нужно прочитать только несколько байтов? У нас есть проблемы с ресурсами и производительностью, и время, потраченное на его создание, того стоит для моего клиента. - person Loscas; 29.01.2013