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

7
我需要在一个16位灰度内存位图上绘制。将TCanvas与位图关联会很好。我使用Delphi,但任何语言都可以。我只需要想法。
有什么想法吗?
将灰度转换为RGB不是一个选项,因为在此过程中会丢失一半的分辨率(像素深度)。

1
我猜根本问题是:GDI支持16位灰度图像吗?Canvas只是GDI的包装器。 - CodesInChaos
据我所知,GDI不支持每像素16位。 - David Heffernan
我不知道有哪个库可以原生地处理16位灰度位图。我所知道的都会将其转换为每种颜色8位的RGB格式。既然您不想转换为RGB,那么在您绘制完位图后,您打算用它做什么?如果您想在屏幕上显示,那么它无论如何都会被转换为RGB。 - iamjoosy
我试图避免编写已经存在于Windows中的函数。黑白高分辨率屏幕在使用Windows操作系统的放射学中很常见。因此,我猜测GDI能够正确处理灰度。 - fpiette
我需要绘制文本、线条、多边形和圆形,以及使用某个固定的灰度级填充表面。 - fpiette
显示剩余3条评论
2个回答

1
你可以尝试使用像ImageFX这样的图像库,或者尝试开源库Graphics32VampyreImagingLIbrary。根据其文档here,它支持一些操作,如在加载到缓冲区中的图像上绘制线条和矩形。我希望扫描仪(图像处理)库能更好地支持灰度图像,但我不认为扫描仪图像处理库是基于内存的。
但是,如果您想直接在可见缓冲区中进行工作(您提到了TCanvas),并且您愿意将自己限制在Delphi XE和Windows 7上,那么您可以使用Direct2D上下文,它支持16位和32位深度,但是对于灰度图像而言,32位颜色深度仍然只有8位深度,因此我认为所有普通的非灰度图形库都会丢失一些信息。

如果您不介意使用一些老旧的东西,并且与 Microsoft Windows 有一定的联系,您可以调查使用 DirectDraw 样式(现已合并到 DirectX)来进行缓冲区管理(保存 16 位数据)并让您绘制它。但我不知道它是否具有任何特殊支持 16 位灰度图像的功能。

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


如果您不介意查看非Delphi相关内容,请查看Python Imaging Library(PIL)。它绝对可以做到这一点,并且可以本地读/写16位灰度TIFF等。它在科学/医学成像中被广泛使用。 - Warren P
Grphics32(顾名思义)不支持16位灰度图像。 - iamjoosy
TCanvas并不意味着任何“可视化”的特性。 - Premature Optimization
我不想使用外部库。我可以轻松实现我所拥有的基本绘图功能。同时,我也不想重新发明已经存在于操作系统中的东西。我不想使用外部库,因为:1)代码相当简单易写;2)依赖性是一种风险;3)库的成本较高。 - fpiette
那么直接在位图上绘制应该是可行的。但是即使最初只是编写一个非常小的图形库,所需的成本(时间)也可能有点高。现在看起来很简单,但真的吗? - Warren P

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接