Delphi图像处理 -- 设置图像阀值

GDI+的TGpImageAttributes类提供了设置图像阀值的功能,下面是使用TGpImageAttributes设置图像阀值的代码:

var Image: TGpBitmap; g: TGpGraphics; Attr: TGpImageAttributes; r: TGpRect; begin Image := TGpBitmap.Create('../../media/20041001.bmp'); g := TGpGraphics.Create(Handle, False); r := GpRect(0, 0, Image.Width, Image.Height); g.DrawImage(Image, r); Attr := TGpImageAttributes.Create; Attr.SetThreshold(0.5); // 设置阀值0.5,相当于RGB值128 g.TranslateTransform(0, 210); g.DrawImage(Image, r, r.X, r.Y, r.Width, r.Height, utPixel, Attr); Attr.Free; g.Free; image.Free; end;

运行效果图:

Delphi图像处理 -- 设置图像阀值

对图像设置阀值后,图像最多只存在8种颜色,即红、黄、绿、青、蓝、紫及黑与白。如果是灰度图,设置阀值后,只有黑白2种颜色,即通常所说的二值图,原理及测试例子可见《GDI+ for VCL基础 -- 图像显示辅助类ImageAttributes》一文。

上面的设置阀值方法只是用来显示,如果要保存阀值图,必须建立新位图,然后画上去,而且也不能直接设置Delphi的TBitmap图像,所以自己写了设置图像阀值的代码:

过程定义: // 设置阀值 procedure ImageSetThreshold(var Data: TImageData; Value: LongWord = 127); 代码实现: procedure ImageSetThreshold(var Data: TImageData; Value: LongWord); asm push edi push ebx call IsValid32 jc @@Exit dec edx movd mm2, edx punpcklwd mm2, mm2 punpcklwd mm2, mm2 pxor mm7, mm7 call SetDataRegs32 @@yLoop: push ecx @@xLoop: mov al, [edi].TARGBQuad.Alpha movd mm0, [edi] punpcklbw mm0, mm7 pcmpgtw mm0, mm2 packsswb mm0, mm0 movd [edi], mm0 mov [edi].TARGBQuad.Alpha, al add edi, 4 loop @@xLoop pop ecx add edi, ebx dec edx jnz @@yLoop emms @@Exit: pop ebx pop edi end;

测试效果与前面利用TGpImageAttributes设置阀值的效果图完全一样。

本文采用的GDI+单元介绍和下载地址见《GDI+ for VCL基础 -- GDI+ 与 VCL》。

文章中所用数据类型及一些过程见《Delphi图像处理 -- 数据类型及内部过程》和《Delphi图像处理 -- 图像像素结构与图像数据转换》。

尽管我十分努力,但水平有限,错误在所难免,欢迎指正和指导。邮箱地址:

[email protected]

注:本文已经于2009.10.28重新整理。