Какой формат файла может представлять несжатое растровое изображение со скоростью 48 или 64 бита на пиксель? - PullRequest
1 голос
/ 26 марта 2010

Я создаю скриншоты под Windows и использую функцию <a href="http://msdn.microsoft.com/en-us/library/ms536298(VS.85).aspx" rel="nofollow noreferrer">LockBits</a> из GDI + для извлечения данных пикселей, которые затем будут записаны в файл.

Для максимальной производительности я также:

  • Использование того же <a href="http://msdn.microsoft.com/en-us/library/ms534412(VS.85).aspx" rel="nofollow noreferrer">PixelFormat</a> в качестве исходного растрового изображения, чтобы избежать преобразования формата
  • Использование флага ImageLockModeUserInputBuf для извлечения данных пикселей в заранее выделенный буфер
  • Этот предварительно выделенный буфер (на который указывает <a href="http://msdn.microsoft.com/en-us/library/ms534421(VS.85).aspx" rel="nofollow noreferrer">BitmapData::Scan0</a>) является частью отображенного в памяти файла (чтобы избежать повторного копирования данных пикселей.)

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

Я успешно реализовал это для формата PixelFormat32bppRGB, который соответствует формату файла BMP 32bpp, поэтому, если я извлекаю данные пикселей непосредственно в отображенный в памяти файл BMP и префиксирую его заголовком BMP, я получаю действительный файл изображения BMP, который можно открыть в Paint и большинстве браузеров.

К сожалению, одна из машин, на которых я тестирую, возвращает пиксели в формате PixelFormat64bppPARGB (предположительно, это зависит от драйвера видеоадаптера), и для этого нет соответствующего формата пикселей BMP.

Преобразование в формат BMP 16, 24 или 32bpp значительно замедляет программу (а также с потерями), поэтому я ищу формат файла, который может использовать этот формат пикселей без преобразования, чтобы я мог извлечь непосредственно в память файл, как я сделал с форматом 32bpp.

Какие форматы файлов растровых изображений поддерживают 48bpp (порядок BGR, little-endian) и / или 64bpp (порядок BGRA, little-endian)?


Редактировать

Пока я исключил эти форматы:

  • BMP : глубина ограничена <= 32bpp (в противном случае было бы идеальным совпадением.) </li>
  • PNG : Заказ образца может быть только RGBA.
  • TIFF : Заказ образца может быть только RGBA.

Возможные частичные решения:

  • OpenEXR : только 48bpp. Порядок выборки в алфавитном порядке по названию канала; BGR подходит, но BGRA нет.

Ответы [ 6 ]

2 голосов
/ 05 апреля 2010

Кажется, единственная причина, по которой вам нужен стандартный формат, - это отображение / тестирование. Так что катите свой собственный формат, но конвертируйте в PNG или TIFF для отображения. А потом двигаться дальше ... жизнь коротка.

2 голосов
/ 26 марта 2010

Вы действительно хотите внедрить и тщательно протестировать отдельные ридеры для каждого из 14 различных форматов Pixel? Я знаю, что до сих пор вы встречали только 2 из них, но я гарантирую, что есть видеокарты с почти всеми остальными 12. В качестве одного простого примера, установите ваш монитор на 256 цветов ...

Вы говорите, что хотите максимизировать производительность, но запись растрового изображения в файл на диске, даже с отображением памяти, в среднем займет больше времени, чем просто преобразование его в устройство. независимое растровое изображение в памяти. Кроме того, если вы преобразуете 64-битное растровое изображение в 32-разрядное растровое изображение, результирующий файл будет записываться в два раза дольше, поэтому он может быть быстрее.

1 голос
/ 05 апреля 2010

Когда форматы настольных и веб-файлов подведут вас, подумайте о том, чтобы дотянуться до больших пушек: FITS (гибкая система транспортировки изображений) или HDF5 , даже DICOM возможно.

1 голос
/ 26 марта 2010

Какая глубина цвета растрового изображения поддерживается, зависит от версии Windows, что означает версию gdi +, а не графический адаптер.

Вы также можете использовать TIFF или PNG (png имеет много параметров, я думаю, вы также можете сказать, что он должен делать несжатый). Вы также можете рассмотреть формат RAW.

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

0 голосов
/ 30 марта 2010

Чтение файла так же критично для производительности, как и запись? Если вы можете легко заполнить буфер, а затем читать по своему усмотрению, это должно быть легкой прогулкой. Просто используйте 1-байтовый заголовок, представляющий формат данных, а затем необработанные данные, которые вы получили.

0 голосов
/ 26 марта 2010

PNG? 48 бит + альфа = 64 бит

для сжатия: «Можно хранить несжатые данные, используя только несжатые дефляционные блоки»

...