在内存中使用16位灰度位图

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

任何想法 ?

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

你可以尝试像ImageFX这样的图像库,或者对于开源的图像库,试试Graphics32或者VampyreImagingLIbrary ,根据它的Docs ,它支持一些操作,例如在加载到缓冲区的图像上绘制线条和矩形。 我希望扫描仪(图像处理)库比非图像库更好地支持灰度图像,但我不认为扫描仪图像处理库是基于内存的。

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

如果你不介意使用一些有点旧的东西,并且与微软Windows有一点关系,你可以使用DirectDraw风格(现在合并到DirectX )进行缓冲区管理(保存16位数据),并让你绘制到它也是如此。 我不知道它有什么特别的支持16位灰度图像。

有趣的是, WPF本身就支持16位灰度。 如果你能弄清楚他们是怎么做的,你可以在Delphi中使用这个技术。 该链接还讨论了使用OpenGL做16位亮度,但没有从OpenGL允许的问题的建议。 我发现人们试图使用OpenGL的医疗应用程序编写的德尔福(16位灰度)图像显示,但没有参考修改内存中的图像。

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

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