Delphi图像处理 -- 彩色浮雕
阅读提示:
《Delphi图像处理》系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM。
《C++图像处理》系列以代码清晰,可读性为主,全部使用C++代码。
尽可能保持二者内容一致,可相互对照。
本文代码必须包括文章《Delphi图像处理 -- 数据类型及公用过程》中的ImageData.pas单元和《Delphi图像处理 -- 平面几何变换类》TransformMatrix.pas单元。
利用模版矩阵进行卷积操作,可以实现图片的彩色浮雕效果,下面的代码使用《Delphi图像处理 -- 图像卷积》中介绍的通用卷积过程,来实现图片的彩色浮雕效果:
varData: TImageData;
beginData := GetImageData(TGpBitmap.Create('d:/56-3.jpg'), True);ImageConvolutionI(Data, [1, 1, 0, 0, 0, 0, 1, 0, -2]);DrawImage(Canvas, 0, 0, Data);FreeImageData(Data);
end;
但是,同一般灰色浮雕的实现一样,没法实现任意角度的浮雕,为此,采用《Delphi图像处理 -- 灰度浮雕》同样的方法,可灵活的完成任意角度和大小的图片彩色浮雕效果,下面是整个代码:
procedure ImageColorSculpture(var Data: TImageData; Angle: Single; Size: LongWord);
varx, y, Radius: Integer;xDelta, yDelta: Integer;xDelta2, yDelta2: Integer;width, height: Integer;dstOffset: Integer;src: TImageData;
beginRadius := (Size + 1) shr 1; // 图像边框扩展半径Angle := PI * Angle / 180;Size := Size shl 11; // Size = Size * 2048xDelta := Round(Cos(Angle) * Size);yDelta := Round(Sin(Angle) * Size);xDelta2 := xDelta shl 1;yDelta2 := yDelta shl 1;x := (Radius shl 12) - xDelta;y := (Radius shl 12) - yDelta;width := x + (Data.Width shl 12);height := y + (Data.Height shl 12);if Data.AlphaFlag thenArgbConvertPArgb(Data);src := _GetExpandData(Data, Radius);asmpush esipush edipush ebxmov eax, Datalea edx, srccall _SetCopyRegsmov dstOffset, ebxpxor mm7, mm7 // mm7 = 00 00 00 00 00 00 00 00pxor xmm7, xmm7mov esi, src.Scan0mov ebx, src.Stridemov ecx, y // for (; y < Height; y += 1096)
@@yLoop: // {mov edx, x // for (; x < Width; x += 4096
@@xLoop: // {push edxpush ecx // x1 = x, y1 = ycall GetSrcColor // mm0 = 00 A1 00 R1 00 G1 00 B1movq mm1, mm0 // mm1 = mm0(ARGB1)add edx, xDelta // x2 = x, y2 = y - yDeltacall GetSrcColor // mm0 = 00 A2 00 R2 00 G2 00 B2paddw mm1, mm0 // mm1 += mm0(ARGB2)add ecx, yDelta2sub edx, xDelta // x3 = x - xDelta, y3 = y + yDeltacall GetSrcColor // mm0 = 00 A3 00 R3 00 G3 00 B3paddw mm1, mm0 // mm1 += mm0(ARGB3)add edx, xDelta2 // x0 = x + xDelta, y0 = y + yDeltacall GetSrcColor // mm0 = 00 A0 00 R0 00 G0 00 B0psllw mm0, 1 // mm0 = A0*2 R0*2 G0*2 B0*2psubsw mm1, mm0 // mm6 = (ARGB1+ARGB2+ARGB3) - ARGB0*2packuswb mm1, mm7 // mm6 = 00 00 00 00 A R G Bmov al, [edi].TARGBQuad.Alphamovd [edi], mm1 // *edi = mm0mov [edi].TARGBQuad.Alpha, alpop ecxpop edxadd edi, 4 // edi += 4add edx, 1000hcmp edx, widthjl @@xLoop // }add ecx, 1000hadd edi, dstOffsetcmp ecx, heightjl @@yLoop // }emmspop ebxpop edipop esiend;FreeImageData(src);if Data.AlphaFlag thenPArgbConvertArgb(Data);
end;
代码还是采用二次线性插值法为每个象素点寻找邻近的4个逻辑点进行差值运算,差值运算的原理同前面所举的利用卷积矩阵实现彩色浮雕效果的例子。
下面是一个简单的测试代码:
procedure TForm1.Button3Click(Sender: TObject);
varbmp: TGpBitmap;g: TGpGraphics;data: TImageData;
beginbmp := TGpBitmap.Create('..\media\20041001.jpg');g := TGpGraphics.Create(Canvas.Handle);g.DrawImage(bmp, 0, 0);data := LockGpBitmap(bmp);ImageColorSculpture(data, 45, 3);UnlockGpBitmap(bmp, data);g.DrawImage(bmp, 0, data.Height);g.Free;bmp.Free;
end;
原始图:
彩色浮雕效果图:
《Delphi图像处理》系列使用GDI+单元下载地址和说明见文章《GDI+ for VCL基础 -- GDI+ 与 VCL》。
因水平有限,错误在所难免,欢迎指正和指导。邮箱地址:maozefa@hotmail.com
这里可访问《Delphi图像处理 -- 文章索引》。
Delphi图像处理 -- 彩色浮雕相关推荐
- Delphi图像处理 -- 灰色浮雕
阅读提示: <Delphi图像处理>系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM. <C++图像处理>系列以代码清晰,可读性为主,全部使用C ...
- 如何用DELPHI区分彩色图和黑白图(多色与单色)??
如何用DELPHI区分彩色图和黑白图(多色与单色)?? Delphi / Windows SDK/API http://www.delphi2007.net/DelphiMultimedia/html ...
- Delphi图像处理 -- 高保真反差
阅读提示: <Delphi图像处理>系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM. <C++图像处理>系列以代码清晰,可读性为主,全部使用C ...
- 冈萨雷斯数字图像处理——彩色图像增强3实例
冈萨雷斯数字图像处理--彩色图像增强3实例 实例一:基于直方图均衡化的彩色图像增强 要处理的图片:fruit.jpg example1.m: clc; RGB=im ...
- Delphi图像处理 -- 图像合成
阅读提示: <Delphi图像处理>系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM. <C++图像处理>系列以代码清晰,可读性为主,全部使用C ...
- Delphi图像处理 -- 最大值
阅读提示: <Delphi图像处理>系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM. <C++图像处理>系列以代码清晰,可读性为主,全部使用C ...
- Delphi图像处理 -- USM锐化
阅读提示: <Delphi图像处理>系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM. <C++图像处理>系列以代码清晰,可读性为主,全部使用C ...
- Delphi图像处理 -- 图像翻转(镜像)
阅读提示: <Delphi图像处理>系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM. <C++图像处理>系列以代码清晰,可读性为主,全部使用C ...
- 彩色图像处理 彩色空间转换及代码实现
一.彩色图像基础 为什么要研究彩色图像处理? 符合人类视觉特点:人类可以辨别几千种颜色色调和亮度:只能辨别几十种灰度层次. 有用的描绘子:简化目标物的区分:目标识别,根据目标的颜色特征. 彩色图像处理 ...
最新文章
- python学起来难吗-python学起来难吗
- 给定一个日期,算出上周五日期
- Java内存访问重排序的研究
- 使用squid在阿里云服务器(centos7)上搭建自己的代理服务器
- 2013 ACM/ICPC 亚洲区 杭州站
- 第一步:Axure 使用svn多人协作产品开发(提交文件)
- python selenium右键另存为_手把手教你系列练习篇之1python+ selenium自动化测试(详细教程)...
- java textview多行_如何在java android中将ellipsize设置为textview的两行或多行
- windows java opencv怎么玩
- 基于单片机无线防丢报警器设计过程分享
- 使用MTK的SN writer工具写IMEI的方法
- RJ45-网口变压器及网口变压器-cpu之间的一些抗干扰防雷设计
- WIN10系统安装虚拟机以及CentOS7
- [Xilinx FPGA] #4 Xilinx FPGA 芯片命名规则与查询方法
- 在Element UI中表格根据数据动态变化显示表格的内容
- 面试到了“IT大佬”,怼得我哑口无言…
- [转载] 那些极度自律的孩子, 都拥有了开挂的人生
- 人教版数学课本插画暴露出的问题
- 前端自学第四天-总结
- 申请TexturePacker序列号