试一小刀,基本上可以用Form上的Canvas来作,
基本思路大概是
1。先创建一个Tbitmap
2。然后在用From.Canvas.Draw(x,y,tbitmap.canvas)来画。
我这里有篇文章希望对你有所帮助!
发信人: icecream (会说话的哑巴), 信区: Delphi
标 题: Delphi中图像的像素级操作
发信站: 武汉白云黄鹤站 (Wed Apr 12 08:30:14 2000), 站内信件
李莹
一般的可视性编程语言,如VB本身只具有图像的一般显示功能, 加上简单的图像伸缩处理
, 在进行一些图像复杂的特技显示时必须借助于Windows的有关API 函数。但Delphi为用
户提供了更为完善的图像处理能力, 依靠它本身的功能完全可以实现图像的像素级操作
。本文介绍了Delphi中像素级图像操作的基本原理、应用和实例。
一、基本原理
在Delphi中有很多控件具有CANVAS属性, 即所谓的画布, 利用这一属性可以在控件的表
面进行图形图像处理工作, 其中有一个CopyRect命令, 具体参数格式:
Copyrect(Dest:TRect;Canvas:Tcanvas;Source:TRect);
其中
est:目标画布矩形 Canvas:源画布 Source:源矩形,其功能是把图像从一个源矩形
RECT内,复制到目标矩形RECT内, 复制的图像具有自动伸缩性质。从这个命令的表面看只
能进行图像的全部或部分复制功能,其实如果把矩形RECT定义成只有一个像素大小, 即可
以从源图像中取出一个像素点, 即进行图像的像素级操作, 比如:Rect(0,0,1,1)可指定
某图像源的左上角第一个像素。
二、像素级操作的应用
图像的像素级操作可广泛应用在图像的特技显示效果制作工作中, 并且可以实现较为复
杂的图像处理工作, 举例如下:
1.图像的旋转: 在Delphi中利用其他方法显示图像时,比如利用图像框IMAGE 或者DRAW命
令, 只能按原图的方向显示, 进行图像的旋转显示必须以像素为单位进行处理,重新安排
像素的排列位置, 比如按先横向后纵向的方式读取原图像,然后按先纵向后横向的方式
写像素,最终将形成旋转90度的图像,按同样的原理可形成旋转180度或270度的图像。
2.图像尺寸的改变: 图像尺寸的改变在Windows 中好象并不需要像素级操作, 利用图像
框的伸缩性可以简单地完成这一工作, 但利用像素操作改变图像尺寸是图像放大或缩小
操作的根本, 并且可以具有更高的精确和更高的灵活性。比如横纵向均每隔一点取一像
素, 连续写在目标画布上, 即可使图像缩小到原来的四分之一;而读出一点像素后, 在
目标画布上连续写两点以上, 即可实现图像的放大显示。
3.图像的多次抽点显示: 如果对一个图像第一次均匀地显示其中的一些像素点, 形成模
糊的图像轮廓, 然后逐渐再显示一些像素点, 使图像逐渐清晰, 最终显示完整的图像,
将是一种美观的图像显示效果; 同样利用相反的操作, 在一个图像上逐渐写上与图像底
色相同的点, 使图像逐渐模糊, 最终消失, 这也是像素操作的巧妙利用。
4.图像的镜像形成: 镜像即原图像的反射效果, 有水平和垂直镜像之分, 镜像的形成比
较简单, 一般只需要对称交换一个图像的左右或上下像素即可, 所以严格的说,实现此操
作不需要像素操作, 而使用“像素条”操作就可以了, 具体方法是从源图像的一个边缘
开始定义宽度为1 的素条, 然后在目标画布的另一边缘位置向相反方向写,这样可形成满
意的镜像。
三、演示程序
下面的程序需要在窗体From1 内安放五个Button和一个OpenDialog, 然后按下述程序在
相应事件中填入程序代码,此程序运行之后, 需要通过按钮5 选择一个BMP位图文件,之后
按钮1实现图像的旋转变换, 按钮2 实现图像抽点显示, 分四次逐渐显示出完整图像,按
钮3实现图像的缩小显示, 按钮4实现图像的镜像显示。以上程序在Windows 95、Delphi
2.0环境下通过。
//定义变量
var
Form1: TForm1;
bitmap:tbitmap;
i,j,m,n,numm:integer;
rect1,rect2,rect3:trect;
//建立Bitmap
procedure TForm1.FormActivate(Sender: TObject);
begin
bitmap:=tbitmap.create;
OpenDialog1.filter:='Bitmap file(*.bmp)|*.bmp';
end;
// 旋转显示
procedure TForm1.Button1Click(Sender: TObject);
begin
form1.repaint;
for j:=0 to bitmap.height do
for i:=0 to bitmap.width do
begin
with rect1 do
begin
left:=i;
top:=j;
right:=i+1;
bottom:=j+1;
end;
with rect3 do
begin
left:=j;
top:=i;
right:=j+1;
bottom:=i+1;
end;
canvas.copyrect(rect3,bitmap.canvas,rect1);
end;
end;
//抽点逐渐显示
procedure TForm1.Button2Click(Sender: TObject);
begin
form1.repaint;
for n:=0 to 1 do
for m:=0 to 1 do
for j:=0 to bitmap.height div 2 do
for i:=0 to bitmap.width div 2 do
begin
with rect1 do
begin
left:=2*i+m;
top:=2*j+n;
right:=2*i+1+m;
bottom:=2*j+1+n;
end;
with rect3 do
begin
left:=2*i+m;
top:=2*j+n;
right:=2*i+1+m;
bottom:=2*j+1+n;
end;
canvas.copyrect(rect3,bitmap.canvas,rect1);
end;
end;
//缩小四分之一
procedure TForm1.Button3Click(Sender: TObject);
begin
form1.repaint;
for j:=0 to bitmap.height div 2 do
for i:=0 to bitmap.width div 2 do
begin
with rect1 do
begin
left:=2*i;
top:=2*j;
right:=2*i+1;
bottom:=2*j+1;
end;
with rect3 do
begin
left:=i;
top:=j;
right:=i+1;
bottom:=j+1;
end;
canvas.copyrect(rect3,bitmap.canvas,rect1);
end;
end;
//镜像显示
procedure TForm1.Button4Click(Sender: TObject);
begin
form1.repaint;
for i:=0 to bitmap.width do
begin
with rect1 do
begin
left:=i;
top:=0;
right:=i+1;
bottom:=bitmap.height;
end;
with rect2 do
begin
left:=(bitmap.width)-i-1;
top:=0;
right:=(bitmap.width)-i;
bottom:=bitmap.height;
end;
canvas.copyrect(rect2,bitmap.canvas,rect1);
end;
end;
//打开图像文件
procedure TForm1.Button5Click(Sender: TObject);
begin
if OpenDialog1.Execute then
bitmap.loadfromfile(OpenDialog1.filename);
Form1.Canvas.Draw(0,0, Bitmap);
end;
--