在内存中绘制16位灰度位图

时间:2011-07-21 17:54:32

标签: windows delphi bitmap gdi

需要绘制16位灰度内存位图。将TCanvas与位图相关联将是非常了不起的。我使用Delphi,但任何语言都可以。我只是需要这个想法。

任何想法?

将灰度转换为RGB不是一种选择,因为在此过程中会丢失一半的分辨率(像素深度)。

2 个答案:

答案 0 :(得分:1)

您可以尝试像ImageFX这样的成像库,或者尝试使用开放源代码库,尝试Graphics32VampyreImagingLIbrary,根据其文档here,它支持一些操作,如绘图加载到缓冲区中的图像上的线条和矩形。我希望扫描仪(图像处理)库比非成像库更好地支持灰度图像,但我不希望扫描仪图像处理库基于内存。

但是如果你想直接在可见的缓冲区中工作(你提到TCanvas),并且你愿意将自己限制在Delphi XE和Windows 7,你可以使用Direct2D上下文,它支持16和32位深度,但32位色深相对于灰度图像仍然只有8位深度,我认为所有正常的非灰度图形库都会丢失一些信息。

如果你不介意使用有点旧的东西,并且与微软Windows有点联系,你可以调查使用DirectDraw样式(现在合并到DirectX)来进行缓冲管理(保持16位)数据)并允许你绘制它。我不知道它对16位灰度图像有任何特殊支持。

有趣的是,WPF原生支持16位灰度。如果你能找到他们是如何做到的,你可以在Delphi中使用这种技术。该链接还讨论了使用OpenGL进行16位亮度,但OpenGL允许的问题没有任何建议。我发现人们试图将OpenGL用于用delphi(16位灰度)图像显示编写的医疗应用程序,但没有提到修改内存中的图像。

答案 1 :(得分:0)

你可以使用Gdi + 它不适用于16位灰度,但它可以在48位RGB图像上工作。

所以我们可以通过在所有三个通道中复制相同的16位来将16位数据转换为48位RGB数据。执行一些绘图然后再将48位转换回16位