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