我正在Windows下方创建屏幕截图,并使用 从GDI+提取Pixel数据的功能,然后将其写入文件。

为了最大程度地提高性能:

  • 使用相同 PixelFormat 作为源位图,以避免格式转换
  • 使用 ImageLockModeUserInputBuf 标记以将像素数据提取到预先分配的缓冲区中
  • 此预先分配的缓冲区(指向 bitmapdata :: scan0)是内存映射文件的一部分(以避免再次复制像素数据。)

我还将编写读取文件的代码,以便我可以使用(或发明)我希望的任何格式。但是,我更喜欢使用现有程序(理想情况下的Web浏览器)能够读取的众所周知的格式,因为这意味着我可以从视觉上确认图像在编写其他程序的代码之前(读取图像的代码)是正确的。 )

我已经成功实施了 PixelFormat32bppRGB 格式,与32BPP BMP文件的格式匹配,因此,如果我将像素数据直接提取到存储器映射的BMP文件中,并将其与BMP标头一起前缀,我将获得一个有效的BMP图像文件,可以在油漆和大多数浏览器中打开。

不幸的是,我正在测试回报像素的机器之一 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不适合。
有帮助吗?

解决方案

似乎您需要标准格式的唯一原因是用于显示/测试目的。因此,请滚动自己的格式,但转换为PNG或TIFF进行显示。然后继续前进...生活很短。

其他提示

您是否真的想为14个不同的Pixelformats中的每一个实施和仔细测试单独的读者?我知道到目前为止,您只遇到了其中2个,但是我保证那里有几乎所有其他12个视频卡。作为一个简单的例子,将显示器设置为256个颜色...

您说您想最大程度地提高性能,但是即使使用内存映射,将位图写入磁盘上的文件,平均要花费更多的时间,而不是只需将其转换为独立于设备的位图所需的时间记忆。另外,如果将64位位图转换为32位位图,则结果文件将需要一半的写入,因此实际上可能更快。

支持哪些位图颜色深度取决于您的Windows版本,这意味着GDI+版本,而不是图形适配器。

您也可以使用TIFF或PNG(PNG有很多参数,我认为您也可以告诉它不压缩)。您也可以考虑原始格式。

Imaging库ImageMagick具有.NET包装器包含数百个图像格式,无论您决定在最后起诉哪种格式,iam肯定它具有支持:)

当桌面和Web文件格式让您失望时,请考虑伸手去拿大枪: 适合 (灵活的图像传输系统)或 HDF5, , 甚至 迪科姆 也许。

PNG? 48位 + alpha = 64位

对于压缩,“可以仅使用未压缩的放气块来存储未压缩的数据”

文件的读数与写作一样重要?如果您可以轻松填充缓冲区,然后在方便时阅读,这应该是蛋糕行走。只需一个1个字节标头代表数据格式,然后是您获得的原始数据。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top