?? 新建 文本文檔.txt
字號:
實現圖片的旋轉和縮放2008-05-17 14:06第一步就是要把我的片轉化為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沒有正確顯示圖片大小的情況下)。
可以肯定這個方法不是很好的方法,但是至少它解決了問題。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -