我在Windows下创建截图并使用GDI +中的LockBits
函数提取像素数据,然后将其写入文件。什么文件格式可以表示每像素48位或64位的未压缩光栅图像?
为了最大限度地提高性能我也:
- 使用相同
PixelFormat
作为源位图,以避免格式转换 - 使用
ImageLockModeUserInputBuf
标志提供给像素数据提取到一个预先分配的缓冲区 - 此预分配缓冲区(由
BitmapData::Scan0
指向)是内存映射文件的一部分(以避免再次复制像素数据。)
我还将编写读取文件的代码,以便我可以使用(或发明)任何我希望的格式。不过,我宁愿使用现有程序(理想的网页浏览器)能够读取的众所周知的格式,因为这意味着我可以在为其他程序(读取图像)编写代码之前直观地确认图像是否正确。 )
我已经成功实现了PixelFormat32bppRGB
格式,该格式与32bpp BMP文件的格式相匹配,所以如果我将像素数据直接提取到内存映射BMP文件中,并将它作为BMP头文件的前缀,有效的BMP图像文件,可以在Paint和大多数浏览器中打开。
不幸的是我测试的机器之一返回像素为PixelFormat64bppPARGB
格式(大概这是受视频适配器驱动程序影响),并且没有相应的BMP像素格式。
转换为16,24或32bpp BMP格式会显着降低程序的运行速度(同时也是有损耗的),所以我正在寻找一种文件格式,可以在不转换的情况下使用此像素格式,因此我可以直接提取到内存映射文件,就像我用32bpp格式所做的那样。
什么光栅图像文件格式支持48bpp(BGR顺序,little-endian)和/或64bpp(BGRA顺序,little-endian)?
编辑
我迄今排除这些格式:
- BMP:深度仅限于< = 32bpp的(将是一个完美的匹配,否则)
- PNG:样品订单只能是RGBA。
- TIFF:示例订单只能是RGBA。
可能部分解决方案:
- 的OpenEXR:只有48bpp。样品订单按照通道名称的字母顺序排列; BGR适合但BGRA不适用。
这与我所做的相似。我已经推出了自己的格式(一种BMP的变体),并编写了一个可以读取此格式以及标准BMP和PNG的查看器应用程序。 – finnw 2010-04-05 12:31:04