Delphi图像处理 -- 最小值
阅读提示:
《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
movq mm2, mm0
@@iLoop:
push eax
@@jLoop:
pminub mm1, [esi]
pminub mm2, [esi+ebx]
add esi, 8
dec eax
jnz @@jLoop
movd mm3, [esi]
movd mm4, [esi+ebx]
pminub mm0, mm3
pminub mm0, mm4
pop eax
add esi, jOffset
dec edx
jnz @@iLoop
push eax
@@jlLoop:
pminub mm1, [esi]
add esi, 8
dec eax
jnz @@jlLoop
movd mm3, [esi]
pminub mm0, mm3
pop eax
pminub mm0, mm1
pminub mm0, mm2
psrlq mm1, 32
psrlq mm2, 32
pminub mm0, mm1
pminub mm0, mm2
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
emms
end; 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 esi
end; // 图像数据最小值处理。参数:图像数据,半径
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图像处理 -- 文章索引
转载:http://blog.csdn.net/maozefa/article/details/7188354 本文对已发布<Delphi图像处理>系列文章进行索引链接,以方便阅读和查找. ...
- Delphi图像处理 -- 最大值
阅读提示: <Delphi图像处理>系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM. <C++图像处理>系列以代码清晰,可读性为主,全部使用C ...
- Delphi图像处理 -- RGB与HSV转换
阅读提示: <Delphi图像处理>系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM. <C++图像处理>系列以代码清晰,可读性为主,全部使用C ...
- Delphi图像处理 -- RGB与HSL转换
阅读提示: <Delphi图像处理>系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM. <C++图像处理>系列以代码清晰,可读性为主,全部使用C ...
- Delphi图像处理 -- 颜色矩阵变换
转载自阿发伯:http://blog.csdn.net/maozefa/article/details/8316430 阅读提示: <Delphi图像处理>系列以效率为侧重点,一般 ...
- Delphi图像处理控件
Envision Image Library (Full Sources for D7 to D10-Seattle) v3.08http://www.intervalsoftware.com/env ...
- delphi 图像处理 图像左旋右旋
procedure TDR_QM_ZP_Form.btn_ZXClick(Sender: TObject); //图像左旋 begin screen.Cursor := crhourglass; my ...
- delphi 图像处理 图像放大缩小
procedure TDR_QM_ZP_Form.btn_FDClick(Sender: TObject); //图像放大 begin my_int1 := Trunc( my_int1 * 1.1) ...
- delphi 图像处理 二值化
procedure TDR_QM_ZP_Form.Image_EZH( Bmp: TBitmap ); var p: PByteArray; Gray, x, y: Integer; begin // ...
随机推荐
- printk
printk的日志级别定义如下(在linux/kernel.h中): #define KERN_EMERG "<0>"/*紧急事件消息,系统崩溃之前提示,表示系统不可用 ...
- CSS基础3——使用CSS格式化元素内容的字体
1.CSS属性单位: (1)长度单位:包含绝对长度单位和相对长度单位 绝对长度单位包含:cm.mm.in.pt.pc等. 绝对长度单位最好用于打印输出设备.在仅作为频幕显示时.绝对长度值并没有什么意义 ...
- Java For循环效率试验
非常奇怪的结果! ..! 测试方法如以下 public class Main { public static void main(String[] args){ long ti = System.cu ...
- WinForm 小程序 NotePad
运行效果: 代码: using System; using System.Collections.Generic; using System.ComponentModel; using System. ...
- 一口一口吃掉Hibernate(八)——Hibernate中inverse的用法
一.Inverse是hibernate双向关系中的基本概念.inverse的真正作用就是指定由哪一方来维护之间的关联关系.当一方中指定了“inverse=false”(默认),那么那一方就有责任负责之 ...
- 演练2-1:创建MVC默认项目
在VS2012中点击“文件 | 新项目”,在弹出对话框中选择“Visual C# | Web | ASP.NET MVC 4 Web应用程序”. 在弹出的模板对话框中选择“Internet应用程序”和 ...
- Qt学习之路(58): 进程间交互(QProcess.readAllStandardOutput可以读取控制台的输出)
所谓 IO 其实不过是与其他设备之间的数据交互.在 Linux 上这个概念或许会更加清楚一些.Linux 把所有设备都看作是一种文件,因此所有的 IO 都归结到对文件的数据交互.同样,与其他进程之间也 ...
- BNU Questions and answers
http://www.bnuoj.com/bnuoj/problem_show.php?pid=2490 这个题是先输入一个整数n,说明有几个数据,然后输入n个整数,然后用三个#分开,后面输入整数k, ...
- iTunes Store:隐藏和取消隐藏已购项目
使用 Mac 或 PC 上的 iTunes 来隐藏或取消隐藏已购项目. 如何隐藏已购项目 在 Mac 或 PC 上打开 iTunes. 从 Store 菜单中,选取商店 > 登录,然后输入您的 ...
- Charles_N:HTTP请求响应监听工具
Charles:HTTP请求响应监听工具使用说明.doc 1. 介绍 Charles是一个HTTP代理服务器,HTTP监视器,反转代理服务器.它允许一个开发者查看所有连接互联网的HTTP通信 ...