好长时间没有写东西了,并不是因为前面的东西遭受了很多西红柿和鸡蛋,而是自己实在没有什么真实的东西写出来供大家参考。但是最近在帮一个朋友做一个项目的时候,遇到了在delphi中对图像的简单处理,于是不停的从网上找
资料,翻看csdn以前的帖子,从我
搜索的结果发现很多人会在各种项目中遇到类似的
图片处理问题,但是多数得到的
答案似乎并不完整(因为很多都没有结帖,也可能是个人习惯的问题,呵呵,希望大家读了我这个文章之后,能够家开结帖速度)。于是我把我遇到的
问题和解决方案写在下面,供大家参考,同时欢迎大家继续拍砖。
在正式内容之前要把我要解决的问题写在前面,同时也让读者有一个好的定位,从而不会因为我在处理过程中的拙劣手段而感到恼火。这里主要解决的问题是在Delphi中将用扫描仪扫描得到的图片进行90度旋转,从而得到适合使用的图片,并且由于不能正确把握图片的大小,因此要对图片进行简单的缩放。而我的解决方法也完全是根据此要求进行,因为对于效率、
图片处理之后的清晰度考虑的不是很多,同时带来的好处就是
程序看起来很简单。
首先,我没有扫描仪,因此我不知道使用扫描
程序(已经提供)得到的图片是什么格式,而在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 TMainForm.ChangeImageFormate;
var Bitmap : TBitmap;
Zoom : Integer;
begin
Bitmap := TBitmap.Create; //1
try
with ImageCert do begin
Bitmap.Assign(Picture.Graphic); //2
Picture := nil; //3
Zoom := Max(Bitmap.Width div Width,Bitmap.Height div Height)+1; //4
Width := Bitmap.Width div Zoom; //5
Height := Bitmap.Height div Zoom; //6
Canvas.StretchDraw(Rect(0,0,Width,Height),Bitmap); //7
end;
finally
Bitmap.Free;
end;
end;
我想这段代码并不是很复杂,ImageCert是一个TImage控件放在Form上,唯一可能陌生的就是第八句,但是大家可以从Delphi的帮助中得到很到说明,我在这就不再翻译了(我的建议就是多看帮助)。同时应该指出的是第三句作用是很关键的,如果去掉这一句同时你的
图片格式不是bmp的话,就会出现“只有bitmap才能才能修改”的错误。
第二步就是实现
图片的旋转,因为
程序要求只是每次旋转90度即可,因此这里也比较容易处理。处理的手段就是按照像素进行替换。实现过程如下:
procedure TMainForm.RotateImage;
var x,y : Integer;
TmpBitMap : TBitmap;
begin
TmpBitMap := TBitmap.Create;
try
TmpBitMap.Assign(ImageCert.Picture.Graphic);
with ImageCert do begin
Picture.Bitmap.Height := TmpBitMap.Width;
Picture.Bitmap.Width := TmpBitMap.Height;
for x:=0 to Height do
for y:=0 to Width do
Canvas.Pixels[TmpBitMap.Height-x,y] := TmpBitMap.Canvas.Pixels[y,x];
Height := TmpBitMap.Width;
Width := TmpBitMap.Height;
end;
finally
TmpBitMap.Free;
end;
end;
这段
程序也没有什么好讲的,但是几个高度和宽度的设置令我是分的烦闷,总是觉得多做的点什么,但是却偏偏去不掉任何一行,如果哪位有兴趣可以尝试一下,最好把结果也告诉我一声。而且在这个里面由于TImage和TBitmap都有各自的canvas,所以使用哪一个可能也是值得研究的,但是由于时间有限就没有在尝试了。
至于在部分取图的过程中,我是用了一个TShape,然后用将brush的style设置成bsclear,在ImageCert的onMouseMove中安排这个TShap的位置,这样做不是很灵敏,因为当鼠标在TShape上面时则不会起到作用,所幸影响不大。同时我在TShape的OnMouseDown事件中取出TShape下面的部分图片。这个时候如果你的图片没有做过缩放处理,就会发现取出的图片和我们看到的位置不相符(当然是在TImage没有正确显示
图片大小的情况下)。
可以肯定这个方法不是很好的方法,但是至少它解决了问题。
啰里啰唆,不知所谓。
版权所有:idilent 网站转载请注明作者 其他转载方式请与作者联系(idilent@yahoo.com.cn)。