阅读提示:

    《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图像处理 -- 彩色浮雕相关推荐

  1. Delphi图像处理 -- 灰色浮雕

    阅读提示:     <Delphi图像处理>系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM.     <C++图像处理>系列以代码清晰,可读性为主,全部使用C ...

  2. 如何用DELPHI区分彩色图和黑白图(多色与单色)??

    如何用DELPHI区分彩色图和黑白图(多色与单色)?? Delphi / Windows SDK/API http://www.delphi2007.net/DelphiMultimedia/html ...

  3. Delphi图像处理 -- 高保真反差

    阅读提示:     <Delphi图像处理>系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM.     <C++图像处理>系列以代码清晰,可读性为主,全部使用C ...

  4. 冈萨雷斯数字图像处理——彩色图像增强3实例

    冈萨雷斯数字图像处理--彩色图像增强3实例 实例一:基于直方图均衡化的彩色图像增强     要处理的图片:fruit.jpg               example1.m: clc; RGB=im ...

  5. Delphi图像处理 -- 图像合成

    阅读提示:     <Delphi图像处理>系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM.     <C++图像处理>系列以代码清晰,可读性为主,全部使用C ...

  6. Delphi图像处理 -- 最大值

    阅读提示:     <Delphi图像处理>系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM.     <C++图像处理>系列以代码清晰,可读性为主,全部使用C ...

  7. Delphi图像处理 -- USM锐化

    阅读提示:     <Delphi图像处理>系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM.     <C++图像处理>系列以代码清晰,可读性为主,全部使用C ...

  8. Delphi图像处理 -- 图像翻转(镜像)

    阅读提示:     <Delphi图像处理>系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM.     <C++图像处理>系列以代码清晰,可读性为主,全部使用C ...

  9. 彩色图像处理 彩色空间转换及代码实现

    一.彩色图像基础 为什么要研究彩色图像处理? 符合人类视觉特点:人类可以辨别几千种颜色色调和亮度:只能辨别几十种灰度层次. 有用的描绘子:简化目标物的区分:目标识别,根据目标的颜色特征. 彩色图像处理 ...

最新文章

  1. python学起来难吗-python学起来难吗
  2. 给定一个日期,算出上周五日期
  3. Java内存访问重排序的研究
  4. 使用squid在阿里云服务器(centos7)上搭建自己的代理服务器
  5. 2013 ACM/ICPC 亚洲区 杭州站
  6. 第一步:Axure 使用svn多人协作产品开发(提交文件)
  7. python selenium右键另存为_手把手教你系列练习篇之1python+ selenium自动化测试(详细教程)...
  8. java textview多行_如何在java android中将ellipsize设置为textview的两行或多行
  9. windows java opencv怎么玩
  10. 基于单片机无线防丢报警器设计过程分享
  11. 使用MTK的SN writer工具写IMEI的方法
  12. RJ45-网口变压器及网口变压器-cpu之间的一些抗干扰防雷设计
  13. WIN10系统安装虚拟机以及CentOS7
  14. [Xilinx FPGA] #4 Xilinx FPGA 芯片命名规则与查询方法
  15. 在Element UI中表格根据数据动态变化显示表格的内容
  16. 面试到了“IT大佬”,怼得我哑口无言…
  17. [转载] 那些极度自律的孩子, 都拥有了开挂的人生
  18. 人教版数学课本插画暴露出的问题
  19. 前端自学第四天-总结
  20. 申请TexturePacker序列号

热门文章

  1. yocto-poky
  2. 使用EFR32作为Zigbee/Thread的sniffer的用法
  3. 人脸核身--第二篇--启用 H5人脸认证
  4. 开发一个全功能的 Word Add-in
  5. 金朝阳——软件测试试题11道题目分析答案
  6. 超好用,18 个 Jupyter Notebook 使用技巧助你快速腾飞
  7. 批量将MP3或者m4a转为wav格式
  8. python数据可视化之美源码_Python数据可视化之美-专业图
  9. 出自阿里P8之手的这份微服务架构实践手册,为何能霸榜GitHub一周
  10. vlc播放海康威视摄像头rtsp rtmp视频教程