2011-07-21 105 views
7

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

任何想法?

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

+1

我想根本的问题是:GDI是否支持16位灰度图像? Canvas只是GDI的一个包装。 – CodesInChaos

+0

GDI不支持每像素16位AFIK –

+0

绘制什么?一个可以用纯色绘制很多东西的polyfiller只是几行代码,但是如果你想使用内插纹理填充antialiased TTF文本,情况就不同了...... – 6502

回答

1

你可以尝试的成像库等ImageFX,或用于一个开放源代码之一,尝试Graphics32,或者VampyreImagingLIbrary,根据其文档here它支持像画线和矩形比装入缓冲器的图像的一些操作。我希望扫描仪(图像处理)库比非图像库更好地支持灰度图像,但我不认为扫描仪图像处理库是基于内存的。但是如果你想直接在可见的缓冲区(你提到TCanvas)做这项工作,并且你愿意只限于Delphi XE和Windows 7,你可以使用Direct2D上下文,它支持16个和32位深度,但作为一个32位色彩深度仍然只会是一个灰度图像的8位深度,我认为所有正常的非灰度图形库将失去一些关于你的信息。

如果您不介意使用有点旧的东西,并且与Microsoft Windows有点关系,您可以使用DirectDraw样式(现在合并到DirectX)进行调查,以进行缓冲区管理(保存16位数据)和让你吸取它,以及。我不知道它对16位灰度图像有什么特别的支持。

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

+0

..如果您不介意查看非delphi的东西,请查看Python Imaging Library(PIL)。它绝对可以做到这一点,本地读取/写入16位灰度TIFF等。它在科学/医学成像中使用很多。 –

+0

Grphics32(顾名思义)不支持16位灰度图像。 – iamjoosy

+0

?? TCanvas并不意味着任何“视觉”味道。 –

0

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

,所以我们可以通过复制相同的16位在所有三个channels.performs一些绘图转换16位数据,48位RGB数据,然后再转换48位回到16位