麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Delphi > 正文

在Delphi中實現圖片的旋轉、縮放

2019-11-18 18:30:11
字體:
來源:轉載
供稿:網友
 

好長時間沒有寫東西了,并不是因為前面的東西遭受了很多西紅柿和雞蛋,而是自己實在沒有什么真實的東西寫出來供大家參考。但是最近在幫一個朋友做一個項目的時候,遇到了在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沒有正確顯示圖片大小的情況下)。


上一篇:用DELPHI開發DirectX游戲

下一篇:NeHe的opengl教程delphi版(9)----星星

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

主站蜘蛛池模板: 日韩电影av在线 | 国产精品免费一区二区三区都可以 | 久久国产综合精品 | 国产精品啪一品二区三区粉嫩 | 国产激情精品一区二区三区 | 日韩电影一区二区三区 | 午夜视频观看 | 国产三级三级三级三级 | 黄色av网站免费 | 色999中文字幕 | 国产欧美精品综合一区 | 午夜影视一区二区 | 羞羞视频免费网站含羞草 | 欧美精品一区自拍a毛片在线视频 | va毛片 | 日韩一级毛毛片 | 亚洲影视在线观看 | 日本xxxx视频 | 成人三级黄色片 | 素人视频免费观看 | 亚洲一区二区三区精品在线观看 | av在线一区二区三区四区 | 久久羞羞视频 | 免费a级黄色片 | 一区二区三区黄色 | 成人免费在线观看视频 | 久久久久久久黄色片 | 日韩每日更新 | 国产青草网| 操网 | 久久久www成人免费毛片 | 午夜视频你懂的 | 一色桃子av大全在线播放 | 久久久久久精 | 精品99在线视频 | 亚洲人成网在线观看 | 草莓福利社区在线 | 国产成人在线一区 | 久色乳综合思思在线视频 | 性片网站| 久久免费视频一区二区三区 |