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;

运行效果图:

对图像设置阀值后,图像最多只存在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图像处理 -- 图像像素结构与图像数据转换》。

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

maozefa@hotmail.com

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值