Delphi图像处理 -- 最大值
阅读提示:
《Delphi图像处理》系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM。
《C++图像处理》系列以代码清晰,可读性为主,全部使用C++代码。
尽可能保持二者内容一致,可相互对照。
本文代码必须包括文章《Delphi图像处理 -- 数据类型及公用过程》中的ImageData.pas单元。
图像的最大值处理就是以当前像素为中心,取周边一定半径范围内的所有像素的RGB分量的最大值,作为当前像素的分量值。如果图像含Alpha信息,则应对Alpha分量作一个相反的处理,即最小值处理。
procedure DoMaxValue(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
pxor mm0, mm0
pxor mm1, mm1
pxor mm2, mm2
@@iLoop:
push eax
@@jLoop:
pmaxub mm1, [esi]
pmaxub mm2, [esi+ebx]
add esi, 8
dec eax
jnz @@jLoop
movd mm3, [esi]
movd mm4, [esi+ebx]
pmaxub mm0, mm3
pmaxub mm0, mm4
pop eax
add esi, jOffset
dec edx
jnz @@iLoop
push eax
@@jlLoop:
pmaxub mm1, [esi]
add esi, 8
dec eax
jnz @@jlLoop
movd mm3, [esi]
pmaxub mm0, mm3
pop eax
pmaxub mm0, mm1
pmaxub mm0, mm2
psrlq mm1, 32
psrlq mm2, 32
pmaxub mm0, mm1
pmaxub 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 DoMinAlpha(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
mov eax, 255
@@iLoop:
push edx
@@jLoop:
cmp al, [esi]
jbe @@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 ImageMaxValue(var Data: TImageData; Radius: Integer);
var
src: TImageData;
begin
if Data.AlphaFlag then
ArgbConvertPArgb(Data); // 如果图像数据含Alpha信息,转换为PARGB
src := _GetExpandData(Data, Radius);// 获取扩展半径后的图像数据源
DoMaxValue(Data, src, Radius); // 图像数据的最大值处理
if Data.AlphaFlag then // 如果图像数据含Alpha信息
begin
DoMinAlpha(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);
ImageMaxValue(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 // ...
随机推荐
- RAD Studio 10 自带Demo代码汇总说明
大家好,好多朋友来信咨询Delphi和C++Builder的移动开发.DataSnap架构等问题,希望能有Demo代码学习.其实Delphi和C++Builder本身自带有很多示例代码,已经覆盖了大部 ...
- Pathchirp—有效的带宽估计方法(二)
上一个blog介绍了有效带宽估计方法:pathload.http://blog.csdn.net/ice110956/article/details/11126491. 做一个小小的总结:pathlo ...
- Chapter 17 Replication 复制
Chapter 17 Replication 复制 Table of Contents 17.1 Replication Configuration 17.2 Replication Implemen ...
- Android内存之VSS/RSS/PSS/USS
Terms VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存) RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存) PSS - P ...
- win7下:MySQL-Front的下载与安装
MySQL-Front是mysql数据库的可视化图形工具,因为它是“实时”的应用软件,它可以提供比系统内建在PHP和HTML上更为精炼的用户界面. 参考百度经验:http://jingyan.baid ...
- QThread 与 QObject的关系(QObject可以用于多线程,可以发送信号调用存在于其他线程的slot函数,但GUI类不可重入)
QThread 继承 QObject..它可以发送started和finished信号,也提供了一些slot函数. QObject.可以用于多线程,可以发送信号调用存在于其他线程的slot函数,也可以 ...
- jackson 转json. 过滤null值
@Test public void tttttt() throws JsonGenerationException, JsonMappingException, IOException { Objec ...
- pycURL的内存问题
pycURL的内存问题 最近用pycURL写了一个工具,注册账号用的.写是写好了,但是发现内存占用超大.40个线程运行一天跑到了3.7G的内存. 于是着手调查这个问题. 调查方法就是用python的g ...
- Math.random与java.util.Random的差别
今天在做一道习题时想到了Math.random()与Random类有什么区别,查阅了一些资料,感觉讲的不是太好. 首先两者的区别是一个是方法,一个是类. 其实前者的实现借助与后者.大家可以看一下Mat ...
- java list三种遍历方法性能比较
从c/c++语言转向java开发,学习java语言list遍历的三种方法,顺便测试各种遍历方法的性能,测试方法为在ArrayList中插入1千万条记录,然后遍历ArrayList,发现了一个奇怪的现象 ...