当前位置: 首页 > 编程日记 > 正文

Delphi 之Copyrect的使用

http://cqujsjcyj.iteye.com/blog/380970

Copyrect的使用(图片复制、放大、以及做图片放大镜等)
一、从一个选取一个区域中的图象到另一个图象组件中的固定区域
procedure TForm1.Button1Click(Sender: TObject);
var
  rtDest, rtSource: TRect;
  rtIndex: Integer;
begin
  rtDest := Rect(0, 0, 200, 200); //在图象二中选取的区域,定义的坐标是相对于Image2的
  rtSource := Rect(0, 0, 50 , 41);//在图象一中选取的区域,定义的坐标是相对于Image1的
  Image2.Canvas.CopyRect(rtDest,.Canvas,rtSource);
 end;
注意:
1、 区域(Rect)坐标的定义,是相对于它的父控件。
2、 可以起到图象放大作用。如果图象一的选取区域小于图象二中的选取区域,那么图一选取区域中的图象,拉伸填充到图象二中的选取区域。(图象区域相同的复制不会造成图象失真,如果变大或者变小,就容易造成失真)
3、 相片的拷贝只限于BMP图片

二、如果要拷贝非bmp图片可以用以下方法
procedure TForm1.Button3Click(Sender: TObject);
var
      Bitmap:   TBitmap;
      MyRect,   MyOther:   TRect;
  begin
      MyRect   :=   Rect(0,0,900,900);
      MyOther   :=   Rect(0,0,300,300);
      Bitmap   :=   TBitmap.Create;
      bitmap.Assign(Image1.picture.Graphic);//转换文件格式成bmp后保存到bitmap中,这样就能用CopyRect了
      Image2.Canvas.BrushCopy(MyOther,   bitmap,   MyRect,   clBlack);  //这行与下行的意思基本相同,选择其一即可
      Image2.Canvas.CopyRect(MyOther,bitmap.Canvas,MyRect);
      Bitmap.Free;
  end;
end.
三、如何将外部图形保存在bitmap里面呢?
例子程序
var
  b: bmp;
begin
  b.b := TBitmap.Create;
  b.b.Assign(Image1.picture.Bitmap);
end;


【图象列表】:
var
  ImageList: TList;
begin
  ImageList := TList.Create;
  ImageList.Add(Image1.Picture.Bitmap);
  Image2.Picture.Bitmap := TBitMap(ImageList.Items[0]);
end;

四、实现图象局部放大的原理和方法

研究了好几个小时,试过了各种函数,想做图片分辨率的调整,不是效果与期望不符就是运行出错,差一点准备发飚,自己写一个抽样缩小和插值放大的函数,却鬼使神差地看了下被我忽略这篇文章……我的妈呀,快搞疯了,不过就是这么一句话而已!

·算法原理
 
在Delphi中,可利用类Tcanvas的CopyRect方法实现图象的放大和缩小。其功能是将源画布上的一个指定矩形区域(简称源矩形)内的象素,拷贝到目的画布上的一个指定矩形区域(简称目的矩形)中。亦可称之为象素块复制,如图1所示。  
由CopyMode属性确定拷贝的模式。在直接拷贝模式(cmSrcCopy)下,当源矩形与目的矩形相等时,图象不变;若源矩形大于目的矩形,图象则缩小;而当源矩形小于目的矩形时,图象便被放大(在目的矩形中扩展)。源矩形与目的矩形大小之比,决定图象的缩放倍数。CopyRect方法声明如下:  
Procedure CopyRect(const Dest: TRect; Canvas: TCanvas; const Source:   Trect);  
其中参数,Dest为目的矩形,Canvas是源画布,Source为源矩形。
·实现步骤
   ·新建应用程序主目录C:\Magnifier及其子目录Images,将事先制作好的位图图象Picture.bmp存入Images目录?纠校琍icture.bmp的大小为260*310象素。
  ·启动Delphi IDE,新建项目Magnifier.dpr,主窗体单元命名为Main.pas,存入C:\Magnifier目录。在主窗体上放置一个TPanel组件,并在其中加入两个TImage组件。两个TImage组件分别命名为ForeImage和BackImage,前者重叠于后者之上,并且都装入Picture.bmp位图。

·在主单元Main.pas的implementation段声明常量和变量:
  
const  
sSide=30;   
dSide=45;  
var  
msHide: Boolean;  
OldX, OldY, NewX, NewY: Integer;  
DestRect, SourceRect : TRect;   
其中,常量sSide和dSide用以控制"放大镜"的大小和放大倍数;变量msHide控制光标(鼠标)的隐藏和打开;其它变量用以确定放大部位。
·建立主窗体MainForm的OnCreate事件,加入下列语句,以初始化变量及设置复制模式:
  
msHide:=True;  
Canvas.CopyMode:=cmSrcCopy;
  ·创建主窗体MainForm的OnKeyPress事件处理程序,在其begin与end之间输入语句"Close;",当按任意键时结束程序运行。
  ·定义过程ImageCopy,用于处理图象的放大和恢复,当移动鼠标时调用。这是实现图象局部放大最重要的过程,源代码如下。
  
procedure TMainForm.ImageCopy(BoxCenterX,   BoxCenterY, BoxSide: Integer);  
begin  
with SourceRect do  
begin  
Left:=BoxCenterX-BoxSide;  
Top:=BoxCenterY-BoxSide;  
Right:=BoxCenterX+BoxSide;  
Bottom:=BoxCenterY+BoxSide;  
end;  
with DestRect do  
begin  
Left:=BoxCenterX-dSide;  
Top:=BoxCenterY-dSide;  
Right:=BoxCenterX+dSide;  
Bottom:=BoxCenterY+dSide;  
end;  
ForeImage.Canvas.CopyRect(DestRect, BackImage.Canvas, SourceRect);  
end;  
注意,别忘了在Main.pas的"type"中声明过程ImageCopy。
  ·创建ForeImage的OnMouseMove事件处理程序,当鼠标在图象上移动时,获取其位置,并作为过程调用的实参。此时,光标隐藏,"放大镜"出现。随着"放大镜"的移动,图象新的部位被放大,滑过的部位又恢复原状。以下为begin与end之间的代码:
  
NewX:=X;  
NewY:=Y;  
if msHide then  
begin  
OldX:=NewX;  
OldY:=NewY;  
msHide:=False;  
ShowCursor(False);   
end else  
begin  
ImageCopy(OldX, OldY, dSide);  
end;  
ImageCopy(NewX, NewY, sSide);  
OldX:=NewX;  
OldY:=NewY; 
·建立主窗体MainForm的OnMouseMove事件处理程序,当鼠标移开图象时,"放大镜"隐藏,光标重新出现。源代码片段如下:
if not msHide then
begin
msHide:=True;
ShowCursor(True);
ImageCopy(OldX, OldY, dSide); 
end;
·技术剖析
以上介绍了利用了画布的CopyRect方法,将图象以象素块从后台隐藏的TImage组件画布上向前台TImage组件的画布上拷贝,以实现图象的放大与恢复的技术。由于这一技术的采用,在图象放大前不需要存储象素,此后直接从后台TImage组件画布上恢复图象。不仅节省了内存资源,也确保了对图象的局部进行平滑、无闪烁地放大。同时,程序源代码也简洁、明了。


五、一个放大镜的原程序

procedure TMainForm.ImageCopy(BoxCenterX, BoxCenterY, BoxSide: Integer);
begin
with SourceRect do
begin
Left:=BoxCenterX-BoxSide;
Top:=BoxCenterY-BoxSide;
Right:=BoxCenterX+BoxSide;
Bottom:=BoxCenterY+BoxSide;
end;

with DestRect do
begin
Left:=BoxCenterX-dSide;
Top:=BoxCenterY-dSide;
Right:=BoxCenterX+dSide;
Bottom:=BoxCenterY+dSide;
end;

ForeImage.Canvas.CopyRect(DestRect, BackImage.Canvas, SourceRect);
end;

转载于:https://www.cnblogs.com/tc310/p/5192737.html

相关文章:

Redis初学:8(Hash类型)

Hash&#xff08;哈希&#xff09;类型 简介 Redis中的hash是一个键值对集合。它是一个String类型的field和value的映射表&#xff0c;所以它特别适合用来存储对象。 如下图&#xff1a; Redis中的hash类似于Java中的Map<String,Object>。 底层数据结构 Hash类型对…

在JLabel上显示图片,并且图片自适应JLabel的大小

本文转载地址&#xff1a; http://blog.csdn.net/xiaoliangmeiny/article/details/7060250 在写《Core Java》上的示例代码时&#xff0c;其中有一个FileChooserTest是打开一张图片&#xff0c;并在Label上显示出来&#xff0c;但是这个示例程序有缺点&#xff0c;由于窗口的大…

适合编程的字体

编程字体从美观和易辩上来说&#xff0c;Deja Vu 是我最喜欢的免费字体家族之一&#xff0c;基于Vera字体家族。 非常容易辨别小写字母L&#xff0c;小写字母I和数字1&#xff1b;字母o&#xff0c;O和数字0. 还有几款比较受欢迎的字体&#xff0c;列在下面&#xff0c;挑选…

Blender和Substance Painter复古相机创作学习教程

时长2h 30m 1280X720 MP4 大小解压后&#xff1a;2G 含课程文件 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; Blender 3D和Substance Painter中的复古相机创作 课程获取&#xff1a;Blender和Substance Painter复古相机创作学习教程-云…

20160203.CCPP体系详解(0013天)

程序片段(01):数组.c02.数组初始化语法.c 内容概要:数组 ///01.数组.c #include <stdio.h> #include <stdlib.h>//01.采用容器结构存储数据的要点: // 1.必须为每个数据分配独立的存储空间 // 2.必须为每个数据分配独立的标识符(变量名称) //02.C语言之C99语法的…

Redis初学:9(Zset类型)

Zset&#xff08;有序集合&#xff09;类型 简介 Redis里面的有序集合Zset和集合Set非常相似&#xff0c;都是一个没有重复元素的字符串集合。 不同之处是有序集合Zset里面的每个成员都关联了一个评分&#xff08;score&#xff09;&#xff0c;这个score被用来按照从最低分到…

QQ和新浪微博登陆第三方的简单实现

一、微博登陆第三方 0、去开发平台完成开发者认证&#xff1a;http://open.weibo.com/developers/basicinfo 创建一个示例应用&#xff0c;获取APPKey 1、登陆有两种方式&#xff1a;jshtml和WBML部署。以jshtml为例&#xff0c;申请到APPKey之后&#xff0c;引入js,要替换掉ap…

matlab 取消figure显示时在屏幕最前

matlab 取消figure显示时在屏幕最前 matlab 取消figure显示时在屏幕最上层。 matlab运行代码或调试代码时&#xff0c;如果要显示图片figure或者画plot等&#xff0c;如果用的代码不合适&#xff0c; 会使得figure获取屏幕焦点&#xff0c;跑到屏幕最上方。如果跑代码的同时…

使用Blender Houdini轻松学习FX特效

大小&#xff1a;1G 含课程文件 时长1h 1280X720 MP4 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; 使用Blender & Houdini学习轻松的FX 信息: 使用Houdini和Blender轻松制作逼真的外汇模拟 Learn Easy FX with Blender & Houdin…

angular初步认识一

最近比较流行MVC前端框架开发&#xff0c;最近研究了一个框架AngularJS框架 不说那么多&#xff0c;先上例子&#xff0c;我是个代码控 <!DOCTYPE html> <html lang"en" ng-app"myApp"> <head><meta charset"UTF-8"><…

Redis初学:11(Redis的配置文件)

Redis的配置文件 Units单位 配置大小单位,开头定义了一些基本的度量单位&#xff0c;只支持bytes&#xff0c;不支持bit。 大小写不敏感&#xff0c;可以用大写也可以用小写。 Includes包含 类似jsp中的include&#xff0c;多实例的情况可以把公用的配置文件提取出来。 Ne…

目标跟踪之卡尔曼滤波---理解Kalman滤波的使用

http://www.cnblogs.com/jcchen1987/p/4371439.html转载于:https://www.cnblogs.com/pengkunfan/p/4372647.html

为什么对高斯分布的方差的极大似然估计是有偏的?

本文要证明为什么对高斯分布的方差的极大似然估计是有偏的。同时&#xff0c;也说明为什么求样本方差时&#xff0c;分母是N-1而不是N。 首先&#xff0c;明白两点&#xff0c;&#xff08;1&#xff09;极大似然法得到的高斯方差是什么形式&#xff08;2&#xff09;什么是有…

使用Blender中的几何节点创建程序对象

大小解压后&#xff1a;2.4G 持续时间3h 30m 1280X720 MP4 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; 使用Blender中的几何节点按程序创建对象 信息: 使用Blender中的几何节点按程序创建对象 开始在Blender中使用非破坏性技术和几何节…

Redis初学:14(Redis中的事务)

Redis中的事务 Redis的事务定义 Redis事务是一个单独的隔离操作&#xff1a;事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中&#xff0c;不会被其他客户端发送来的命令请求所打断。 Redis事务的主要作用就是串联多个命令防止别的命令插队。 Redis中的事务操…

接口两种实现方式

以前在用到接口时&#xff0c;从来没注意到接口分为隐式实现与显示实现。昨天在浏览博客时看到相关内容&#xff0c;现在根据自己的理解记录一下&#xff0c;方便日后碰到的时候温习温习。 通俗的来讲&#xff0c;“显示接口实现”就是使用接口名称作为方法名的前缀;而传统的实…

Android程序如何在代码中改变图片原有的颜色

最近一边找工作一边完善之前的项目。之前安卓初中级的项目是模仿酷狗音乐播放器的。下载一个apk文件&#xff0c;改后缀&#xff0c;解压&#xff0c;然后根据官方应用的布局&#xff0c;用得到的图片照着做出来。记得酷狗首页有好几种主要图标&#xff0c;解压后得到的白色加透…

“error : unknown filesystem”的解决办法

解决方法如下&#xff1a;1:首先使用ls命令显示出ubuntu分区的安装信息&#xff1a; 1 grub rescue>ls 一般会罗列出所有磁盘的分区信息&#xff0c;比如&#xff08;hd0,msdos1&#xff09;&#xff08;hd0,msdos2&#xff09;&#xff08;hd0,msdos4&#xff09;&#xff…

Blender创建三维教室场景学习教程 3D Classroom Environment Creation in Blender

流派:电子学习| MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;48.0 KHz 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09;|大小解压后:3.73 GB 含课程文件 |时长:4h 1m 从头到尾在Blender中创建一个完整的3D教室环境&#xff0c;在…

Redis初学16:主从复制

主从复制 简介 主机数据更新后根据配置和策略&#xff0c; 自动同步到备机的master/slaver机制&#xff0c;Master以写为主&#xff0c;Slave以读为主&#xff0c;如下图&#xff1a; 好处&#xff1a; 1.读写分离&#xff0c;性能扩展 2.容灾快速恢复 搭建 我这里准备了三…

UITableView数据的添加、删除、移动

数据的添加、删除4个步骤&#xff1a;1、现在导航视图上面添加一个按钮&#xff0c;可以是系统自带的编辑按钮editButtonItem2、实现方法让将要执行删除添加操作的表视图处于编辑状态3、指定表视图中哪些行可以处于编辑状态&#xff0c;默认所有行都可以进行编辑4、指定编辑样式…

Saltstack 用户管理

最近测试组来了一大波&#xff0c;最为公司测试那必须要有qa环境&#xff0c;测试组老大跟我关系很好&#xff0c;他们组不少人对Linux也很了解&#xff0c;平时弄个东西啥的也能自己搞定&#xff0c;软磨硬泡加上最近真的很忙给他们配置了jenkins和开了qa环境用户权限&#xf…

ubuntu 14.04 双显卡安装NVIDIA GPU驱动+CUDA+编译配置caffe

******************************** 安装ubuntu************************* 1.在bios里设置使用集成显卡 2.安装ubuntu 14.04&#xff0c;不要联网安装&#xff0c;否则很慢 *********************************安装 GPU驱动********************** 3.去NVIDIA官网下载run格式…

虚幻引擎虚拟现实开发基础学习教程

流派:电子学习| MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09;|大小解压后:3.93 GB |时长:5h 15m 了解如何使用Oculus Quest 2的蓝图在虚幻引擎4中从头开始构建基本的虚拟…

更换AppleWWDRCA.cer证书

从2月14号开始&#xff0c;上传AppStore时可能会碰到这个问题&#xff1a; Failed to locate or generate matching signing assets Xcode attempted to locate or generate matching signing assets and failed to do so because of the following issues. Missing iOS Distri…

Redis初学17:集群

集群 简介 Redis 集群实现了对Redis的水平扩容&#xff0c;即启动 N 个 redis 节点&#xff0c;将整个数据库分布存储在这 N 个节点中&#xff0c;每个节点存储总数据的 1/N 。 Redis 集群通过分区&#xff08;partition&#xff09;来提供一定程度的可用性&#xff08;avail…

怒刷web前端笔试面试题(一)

2019独角兽企业重金招聘Python工程师标准>>> 1.有这么一段HTML&#xff0c;请挑毛病&#xff1a; <P> 哥写的不是HTML&#xff0c;是寂寞。<br><br> 我说&#xff1a;<br>不要迷恋哥&#xff0c;哥只是一个传说 考点1&#xff1a;html和 …

libcudart.so.6.5 cannot open shared object file: no such file or directory

在matlab中运行程序是可能出现libcudart.so.6.5 libcublas.so.6.5 libcurand.so.6.5 等一系列libcu*.so.版本号 找不到的问题。 解决方案是在/usr/local/cuda-版本号/ 目录下搜索到程序找不到的那个文件&#xff0c;然后做一个软连接到matlab目录。 以找不到libcudart.so.6.…

Python中完整的机器学习数据科学课程

学习每个机器学习模型背后的数学&#xff0c;然后用Python实现它 你会学到: 开发机器学习模型 创建机器学习模型的模板 学习每个机器学习模型背后的数学 要求: Python或任何编程语言的基础 时长:8h 15m |视频:. MP4&#xff0c;1280720 30 fps |音频:AAC&#xff0c;44.1 kHz…

Android 高清加载巨图方案 拒绝压缩图片

Android 高清加载巨图方案 拒绝压缩图片 转载请标明出处&#xff1a; http://blog.csdn.net/lmj623565791/article/details/49300989&#xff1b; 本文出自:【张鸿洋的博客】 一、概述 距离上一篇博客有段时间没更新了&#xff0c;主要是最近有些私事导致的&#xff0c;那么就先…