我在 Windows 下创建屏幕截图并使用LockBits
GDI+ 中的函数提取像素数据,然后将其写入文件。
为了最大限度地提高性能,我还:
- 使用与
PixelFormat
源位图相同,避免格式转换 - 使用
ImageLockModeUserInputBuf
标志将像素数据提取到预先分配的缓冲区中 - 这个预先分配的缓冲区(由 指向
BitmapData::Scan0
)是内存映射文件的一部分(以避免再次复制像素数据。)
我还将编写读取文件的代码,因此我可以使用(或发明)任何我希望的格式。但是,我更喜欢使用现有程序(理想情况下是 Web 浏览器)能够读取的众所周知的格式,因为这意味着我可以在为其他程序(读取图像的程序)编写代码之前直观地确认图像是正确的。 )
我已经成功实现了该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 不适合。