熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

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

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

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

  首先我沒有掃描儀因此我不知道使用掃描程序(已經提供)得到的圖片是什麼格式而在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 TMainFormChangeImageFormate;
var Bitmap : TBitmap;
Zoom : Integer;
begin
Bitmap := TBitmapCreate; //
try
with ImageCert do begin
BitmapAssign(PictureGraphic); //
Picture := nil; //
Zoom := Max(BitmapWidth div WidthBitmapHeight div Height)+; //
Width := BitmapWidth div Zoom; //
Height := BitmapHeight div Zoom; //
CanvasStretchDraw(Rect(WidthHeight)Bitmap); //
end;
finally
BitmapFree;
end;
end;

  我想這段代碼並不是很復雜ImageCert是一個TImage控件放在Form上唯一可能陌生的就是第八句但是大家可以從Delphi的幫助中得到很到說明我在這就不再翻譯了(我的建議就是多看幫助)同時應該指出的是第三句作用是很關鍵的如果去掉這一句同時你的圖片格式不是bmp的話就會出現只有bitmap才能才能修改的錯誤

  第二步就是實現圖片的旋轉因為程序要求只是每次旋轉度即可因此這裡也比較容易處理處理的手段就是按照像素進行替換實現過程如下

procedure TMainFormRotateImage;
var xy : Integer;
TmpBitMap : TBitmap;
begin
TmpBitMap := TBitmapCreate;
try
TmpBitMapAssign(ImageCertPictureGraphic);
with ImageCert do begin
PictureBitmapHeight := TmpBitMapWidth;
PictureBitmapWidth := TmpBitMapHeight;
for x:= to Height do
for y:= to Width do
CanvasPixels[TmpBitMapHeightxy] := TmpBitMapCanvasPixels[yx];
Height := TmpBitMapWidth;
Width := TmpBitMapHeight;
end;
finally
TmpBitMapFree;
end;
end;

  這段程序也沒有什麼好講的但是幾個高度和寬度的設置令我是分的煩悶總是覺得多做的點什麼但是卻偏偏去不掉任何一行如果哪位有興趣可以嘗試一下最好把結果也告訴我一聲而且在這個裡面由於TImage和TBitmap都有各自的canvas所以使用哪一個可能也是值得研究的但是由於時間有限就沒有在嘗試了

  至於在部分取圖的過程中我是用了一個TShape然後用將brush的style設置成bsclear在ImageCert的onMouseMove中安排這個TShap的位置這樣做不是很靈敏因為當鼠標在TShape上面時則不會起到作用所幸影響不大同時我在TShape的OnMouseDown事件中取出TShape下面的部分圖片這個時候如果你的圖片沒有做過縮放處理就會發現取出的圖片和我們看到的位置不相符(當然是在TImage沒有正確顯示圖片大小的情況下)

  可以肯定這個方法不是很好的方法但是至少它解決了問題

  啰裡啰唆不知所謂


From:http://tw.wingwit.com/Article/program/Delphi/201311/24976.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.