其他语言

位置:IT落伍者 >> 其他语言 >> 浏览文章

在Delphi中实现图片的旋转、缩放


发布日期:2018年03月19日
 
在Delphi中实现图片的旋转、缩放
好长时间没有写东西了并不是因为前面的东西遭受了很多西红柿和鸡蛋而是自己实在没有什么真实的东西写出来供大家参考但是最近在帮一个朋友做一个项目的时候遇到了在delphi中对图像的简单处理于是不停的从网上找资料翻看csdn以前的帖子从我搜索的结果发现很多人会在各种项目中遇到类似的图片处理问题但是多数得到的答案似乎并不完整(因为很多都没有结帖也可能是个人习惯的问题呵呵希望大家读了我这个文章之后能够家开结帖速度)于是我把我遇到的问题和解决方案写在下面供大家参考同时欢迎大家继续拍砖

在正式内容之前要把我要解决的问题写在前面同时也让读者有一个好的定位从而不会因为我在处理过程中的拙劣手段而感到恼火这里主要解决的问题是在Delphi中将用扫描仪扫描得到的图片进行度旋转从而得到适合使用的图片并且由于不能正确把握图片的大小因此要对图片进行简单的缩放而我的解决方法也完全是根据此要求进行因为对于效率图片处理之后的清晰度考虑的不是很多同时带来的好处就是程序看起来很简单

首先我没有扫描仪因此我不知道使用扫描程序(已经提供)得到的图片是什么格式而在Delphi的帮助中说A bitmap is a powerful graphics object used to create manipulate (scale scroll rotate and paint) and store images in memory and as files on a disk所以我的第一步就是要把我的片转化为TBitmap来处理在转化格式的同时我将图片的实际大小改变以适合后面选取部分图像的需要函数如下

procedure TMainFormChangeImageFormate;

var Bitmap : TBitmap;

Zoom : Integer;

begin

Bitmap := TBitmapCreate; //

try

with ImageCert do begin

BitmapAssign(PictureGraphic); //

Picture := nil; //

Zoom := Max(BitmapWidth div WidthBitmapHeight div Height)+; //

Width := BitmapWidth div Zoom; //

Height := BitmapHeight div Zoom; //

CanvasStretchDraw(Rect(WidthHeight)Bitmap); //

end;

finally

BitmapFree;

end;

end;

我想这段代码并不是很复杂ImageCert是一个TImage控件放在Form上唯一可能陌生的就是第八句但是大家可以从Delphi的帮助中得到很到说明我在这就不再翻译了(我的建议就是多看帮助)同时应该指出的是第三句作用是很关键的如果去掉这一句同时你的图片格式不是bmp的话就会出现只有bitmap才能才能修改的错误

第二步就是实现图片的旋转因为程序要求只是每次旋转度即可因此这里也比较容易处理处理的手段就是按照像素进行替换实现过程如下

procedure TMainFormRotateImage;

var xy : Integer;

TmpBitMap : TBitmap;

begin

TmpBitMap := TBitmapCreate;

try

TmpBitMapAssign(ImageCertPictureGraphic);

with ImageCert do begin

PictureBitmapHeight := TmpBitMapWidth;

PictureBitmapWidth := TmpBitMapHeight;

for x:= to Height do

for y:= to Width do

CanvasPixels[TmpBitMapHeightxy] := TmpBitMapCanvasPixels[yx];

Height := TmpBitMapWidth;

Width := TmpBitMapHeight;

end;

finally

TmpBitMapFree;

end;

end;

这段程序也没有什么好讲的但是几个高度和宽度的设置令我是分的烦闷总是觉得多做的点什么但是却偏偏去不掉任何一行如果哪位有兴趣可以尝试一下最好把结果也告诉我一声而且在这个里面由于TImage和TBitmap都有各自的canvas所以使用哪一个可能也是值得研究的但是由于时间有限就没有在尝试了

至于在部分取图的过程中我是用了一个TShape然后用将brush的style设置成bsclear在ImageCert的onMouseMove中安排这个TShap的位置这样做不是很灵敏因为当鼠标在TShape上面时则不会起到作用所幸影响不大同时我在TShape的OnMouseDown事件中取出TShape下面的部分图片这个时候如果你的图片没有做过缩放处理就会发现取出的图片和我们看到的位置不相符(当然是在TImage没有正确显示图片大小的情况下)

可以肯定这个方法不是很好的方法但是至少它解决了问题

啰里啰唆不知所谓

               

上一篇:Delphi的位操作以及嵌入式汇编[2]

下一篇:用Delphi打造图形界面的Ping程序