Delphi图像处理 -- 最小值
来源:互联网 发布:淘宝联盟佣金设置 编辑:程序博客网 时间:2024/05/16 18:54
阅读提示:
《Delphi图像处理》系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM。
《C++图像处理》系列以代码清晰,可读性为主,全部使用C++代码。
尽可能保持二者内容一致,可相互对照。
本文代码必须包括文章《Delphi图像处理 -- 数据类型及公用过程》中的ImageData.pas单元。
图像的最小值处理就是以当前像素为中心,取周边一定半径范围内的所有像素的RGB分量的最小值,作为当前像素的分量值。如果图像含Alpha信息,则应对Alpha分量作一个相反的处理,即最大值处理。
procedure DoMinValue(var Dest: TImageData; const Source: TImageData; Radius: Integer);var height, iOffset, jOffset, dstOffset, srcOffset: Integer;asm push esi push edi push ebx push ecx shl ecx, 1 mov ebx, [edx].TImageData.Stride imul ebx, ecx shl ecx, 2 add ebx, ecx sub ebx, 4 neg ebx mov iOffset, ebx mov ebx, [edx].TImageData.Stride push ebx shl ebx, 1 sub ebx, ecx mov jOffset, ebx call _SetCopyRegs mov dstOffset, ebx mov srcOffset, eax mov height, edx pop ebx pop eax@@yLoop: push ecx@@xLoop: mov edx, eax pcmpeqb mm0, mm0 movq mm1, mm0@@iLoop: push eax@@jLoop: pminub mm1, [esi] pminub mm1, [esi+ebx] add esi, 8 dec eax jnz @@jLoop pminub mm0, [esi] pminub mm0, [esi+ebx] pop eax add esi, jOffset dec edx jnz @@iLoop push eax@@jlLoop: pminub mm1, [esi] add esi, 8 dec eax jnz @@jlLoop pop eax pminub mm0, [esi] pminub mm0, mm1 psrlq mm1, 32 pminub mm0, mm1 movd [edi], mm0 add esi, iOffset add edi, 4 loop @@xLoop pop ecx add esi, srcOffset add edi, dstOffset dec height jnz @@yLoop pop ebx pop edi pop esi emmsend;procedure DoMaxAlpha(var Dest: TImageData; const Source: TImageData; Radius: Integer);var height, iOffset, jOffset, dstOffset, srcOffset: Integer;asm push esi push edi push ebx shl ecx, 1 inc ecx push ecx mov ebx, [edx].TImageData.Stride imul ebx, ecx sub ebx, 4 neg ebx mov iOffset, ebx shl ecx, 2 mov ebx, [edx].TImageData.Stride sub ebx, ecx mov jOffset, ebx call _SetCopyRegs mov dstOffset, ebx mov srcOffset, eax mov height, edx add esi, 3 add edi, 3 pop edx@@yLoop: push ecx@@xLoop: mov ebx, edx xor eax, eax@@iLoop: push edx@@jLoop: cmp al, [esi] jae @@1 mov al, [esi]@@1: add esi, 4 dec edx jnz @@jLoop pop edx add esi, jOffset dec ebx jnz @@iLoop mov [edi], al add esi, iOffset add edi, 4 loop @@xLoop pop ecx add esi, srcOffset add edi, dstOffset dec height jnz @@yLoop pop ebx pop edi pop esiend;// 图像数据最小值处理。参数:图像数据,半径procedure ImageMinValue(var Data: TImageData; Radius: Integer);var src: TImageData;begin if Data.AlphaFlag then ArgbConvertPArgb(Data); // 如果图像数据含Alpha信息,转换为PARGB src := _GetExpandData(Data, Radius);// 获取扩展半径后的图像数据源 DoMinValue(Data, src, Radius); // 图像数据的最小值处理 if Data.AlphaFlag then // 如果图像数据含Alpha信息 begin DoMaxAlpha(Data, src, Radius); // Alpha分量作最大值处理 PArgbConvertArgb(Data); // 还原PARGB为ARGB end; FreeImageData(src);end;
调用例子及运行效果:
procedure TForm1.Button3Click(Sender: TObject);var bmp: TGpBitmap; g: TGpGraphics; data: TImageData;begin// bmp := TGpBitmap.Create('..\..\media\apple.png'); bmp := TGpBitmap.Create('..\..\media\source.bmp'); data := LockGpBitmap(bmp); ImageMinValue(data, 3); UnlockGpBitmap(bmp, data); g := TGpGraphics.Create(Canvas.Handle); g.DrawImage(bmp, 140, 0); g.Free; bmp.Free;end;
《Delphi图像处理》系列使用GDI+单元下载地址和说明见文章《GDI+ for VCL基础 -- GDI+ 与 VCL》。
因水平有限,错误在所难免,欢迎指正和指导。邮箱地址:maozefa@hotmail.com
这里可访问《Delphi图像处理 -- 文章索引》。
- Delphi图像处理 -- 最小值
- Delphi图像处理 -- 图像卷积
- Delphi图像处理 -- 图像缩放
- Delphi图像处理 -- 图像合成
- Delphi图像处理 -- 图像显示
- Delphi图像处理 -- 图像颜色混合
- Delphi图像处理 -- 模糊
- Delphi图像处理 -- 锐化
- Delphi图像处理 -- 最大值
- Delphi图像处理
- Delphi图像处理
- Delphi图像处理
- Delphi图像处理
- Delphi图像处理 -- 设置阈值
- Delphi图像处理 -- 灰色浮雕
- Delphi图像处理 -- 彩色浮雕
- Delphi图像处理 -- 填充浮雕
- Delphi图像处理 -- 中值滤波
- java netty之decoder与encoder的使用
- MySQL,重新安装时,配置不成功的原因以及解决办法
- Mysql和Sql Service语法和关键字区别
- UNIX环境高级编程——线程同步之互斥量
- Log分析
- Delphi图像处理 -- 最小值
- 亲爱的你,我拿什么来爱你?
- HDU 4512 吉哥系列故事——完美队形I
- Mysql,主从数据同步的搭建步骤
- SpringMVC + Spring + SpringJDBC整合
- windows 下的svn服务端与客户端的搭建与使用
- Construct Binary Tree from Preorder and Inorder Traversal
- ubuntu默认root密码
- uva 539 The Settlers of Catan