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

worldblog發表於2007-08-17
在Delphi中實現圖片的旋轉、縮放 (轉)[@more@]

好長時間沒有寫東西了,並不是因為前面的東西遭受了很多蕃茄和雞蛋,而是自己實在沒有什麼真實的東西寫出來供大家參考。但是最近在幫一個朋友做一個專案的時候,遇到了在中對影像的簡單處理,於是不停的從網上找資料,翻看csdn以前的帖子,從我搜尋的結果發現很多人會在各種專案中遇到類似的圖片處理問題,但是多數得到的答案似乎並不完整(因為很多都沒有結帖,也可能是個人習慣的問題,呵呵,希望大家讀了我這個文章之後,能夠家開結帖速度)。於是我把我遇到的問題和解決方案寫在下面,供大家參考,同時歡迎大家繼續拍磚。

在正式內容之前要把我要解決的問題寫在前面,同時也讓讀者有一個好的定位,從而不會因為我在處理過程中的拙劣手段而感到惱火。這裡主要解決的問題是在Delphi中將用掃描器掃描得到的圖片進行90度旋轉,從而得到適合使用的圖片,並且由於不能正確把握圖片的大小,因此要對圖片進行簡單的縮放。而我的解決方法也完全是根據此要求進行,因為對於、圖片處理之後的清晰度考慮的不是很多,同時帶來的好處就是看起來很簡單。

首先,我沒有掃描器,因此我不知道使用掃描程式(已經提供)得到的圖片是什麼格式,而在Delphi的幫助中說“A bitmap is a powerful graphics 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 網站轉載請註明作者 其他轉載方式請與作者聯絡(to:idilent@.com.cn">idilent@yahoo.com.cn)。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-963682/,如需轉載,請註明出處,否則將追究法律責任。

相關文章