转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
在Delphi中实现图片的旋转、缩放         ★★★★

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

作者:闵涛 文章来源:闵涛的学习笔记 点击数:636 更新时间:2009/4/23 18:37:39

好长时间没有写东西了,并不是因为前面的东西遭受了很多西红柿和鸡蛋,而是自己实在没有什么真实的东西写出来供大家参考。但是最近在帮一个朋友做一个项目的时候,遇到了在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)。


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台