程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 在Delphi中實現圖片的旋轉、縮放

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

編輯:Delphi

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved