2010-03-26 62 views
1

我在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不适用。

回答

2

看来您需要标准格式的唯一原因是用于显示/测试目的。因此,滚动您自己的格式,但转换为PNG或TIFF显示。然后继续......生命短暂。

+0

这与我所做的相似。我已经推出了自己的格式(一种BMP的变体),并编写了一个可以读取此格式以及标准BMP和PNG的查看器应用程序。 – finnw 2010-04-05 12:31:04

0

PNG?48位+阿尔法= 64位

用于压缩“有可能通过只使用未压缩的放气块来存储未压缩数据”

+0

我不认为PNG是合适的,因为它使用RGBA命令(AFAICT这是不可配置的),Windows使用BGRA命令。 – finnw 2010-03-26 17:39:21

1

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

你也可以使用TIFF或PNG(png有很多参数,我想你也可以告诉它做未压缩)。您也可以考虑RAW格式。

它有一个.NET包装成像库的ImageMagick包括支持上百种的图像格式,不管你决定在年底起诉的格式,荫确保它有它的支持:)

+0

*支持哪些像素格式*无关紧要。其中一个是在创建位图时自动选择的(窗口的内容已经被渲染,所以我假定调用驱动函数从适配器的帧缓冲区中提取它)。我的目标是避免转换,这意味着使用本机像素位图的格式。 +1提到TIFF。 – finnw 2010-03-26 17:45:29

+0

因为我无法使用PNG,我似乎无法使用TIFF - 组件顺序(RGBA)与GDI +(BGRA)使用的顺序不兼容 – finnw 2010-03-30 12:19:30

+0

为什么不能改变组件顺序? – codymanix 2010-03-30 15:11:03

2

你真的想为14种不同的PixelFormat中的每一种实现并仔细测试单独的读取器?我知道到目前为止,你只遇到了其中的2个,但我保证有几乎所有其他的视频卡12.作为一个简单的例子,将您的显示器设置为256色...

您假设你想要最大限度地提高性能,但即使使用内存映射将位图写入磁盘上的文件,也需要花费更多的时间,而不是将其转换为内存中与设备无关的位图所需的时间。此外,如果您将64位位图转换为32位位图,则生成的文件只需要一半的时间来写入,因此实际上可能会更快。

+0

不幸的是。如果有的话,一个不寻常的像素格式,如8bpp索引是更*性能关键,因为我的程序运行的机器可能会更老,更慢。我希望完全避免写入磁盘(通过使用'FILE_ATTRIBUTE_TEMPORARY'),因为图像通常会在创建后2秒内读取,然后丢弃(不管它是否被读取)。 – finnw 2010-03-26 17:34:58

0

文件的阅读与文字表现一样重要吗?如果您可以轻松填写​​缓冲区,然后在您方便的时候阅读,这应该是一个蛋糕行程。只需要一个代表数据格式的1byte头文件,然后是你得到的原始数据。

+0

不,读取不是性能至关重要,但我想使用一种已知程序可以以该格式查看图像的格式。 – finnw 2010-03-30 13:01:28

1

当桌面和网络文件格式让你失望时,想到达大枪:FITS(灵活图像传输系统)或HDF5,甚至DICOM也许。