好長(zhǎng)時(shí)間沒有寫東西了,并不是因?yàn)榍懊娴臇|西遭受了很多西紅柿和雞蛋,而是自己實(shí)在沒有什么真實(shí)的東西寫出來(lái)供大家參考。但是最近在幫一個(gè)朋友做一個(gè)項(xiàng)目的時(shí)候,遇到了在delphi中對(duì)圖像的簡(jiǎn)單處理,于是不停的從網(wǎng)上找資料,翻看csdn以前的帖子,從我搜索的結(jié)果發(fā)現(xiàn)很多人會(huì)在各種項(xiàng)目中遇到類似的圖片處理問(wèn)題,但是多數(shù)得到的答案似乎并不完整(因?yàn)楹芏喽紱]有結(jié)帖,也可能是個(gè)人習(xí)慣的問(wèn)題,呵呵,希望大家讀了我這個(gè)文章之后,能夠家開結(jié)帖速度)。于是我把我遇到的問(wèn)題和解決方案寫在下面,供大家參考,同時(shí)歡迎大家繼續(xù)拍磚。
在正式內(nèi)容之前要把我要解決的問(wèn)題寫在前面,同時(shí)也讓讀者有一個(gè)好的定位,從而不會(huì)因?yàn)槲以谔幚磉^(guò)程中的拙劣手段而感到惱火。這里主要解決的問(wèn)題是在Delphi中將用掃描儀掃描得到的圖片進(jìn)行90度旋轉(zhuǎn),從而得到適合使用的圖片,并且由于不能正確把握?qǐng)D片的大小,因此要對(duì)圖片進(jìn)行簡(jiǎn)單的縮放。而我的解決方法也完全是根據(jù)此要求進(jìn)行,因?yàn)閷?duì)于效率、圖片處理之后的清晰度考慮的不是很多,同時(shí)帶來(lái)的好處就是程序看起來(lái)很簡(jiǎn)單。
首先,我沒有掃描儀,因此我不知道使用掃描程序(已經(jīng)提供)得到的圖片是什么格式,而在Delphi的幫助中說(shuō)“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”,所以我的第一步就是要把我的片轉(zhuǎn)化為TBitmap來(lái)處理。在轉(zhuǎn)化格式的同時(shí),我將圖片的實(shí)際大小改變,以適合后面選取部分圖像的需要。函數(shù)如下:
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;
我想這段代碼并不是很復(fù)雜,ImageCert是一個(gè)TImage控件放在Form上,唯一可能陌生的就是第八句,但是大家可以從Delphi的幫助中得到很到說(shuō)明,我在這就不再翻譯了(我的建議就是多看幫助)。同時(shí)應(yīng)該指出的是第三句作用是很關(guān)鍵的,如果去掉這一句同時(shí)你的圖片格式不是bmp的話,就會(huì)出現(xiàn)“只有bitmap才能才能修改”的錯(cuò)誤。
第二步就是實(shí)現(xiàn)圖片的旋轉(zhuǎn),因?yàn)槌绦蛞笾皇敲看涡D(zhuǎn)90度即可,因此這里也比較容易處理。處理的手段就是按照像素進(jìn)行替換。實(shí)現(xiàn)過(guò)程如下:
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;
這段程序也沒有什么好講的,但是幾個(gè)高度和寬度的設(shè)置令我是分的煩悶,總是覺得多做的點(diǎn)什么,但是卻偏偏去不掉任何一行,如果哪位有興趣可以嘗試一下,最好把結(jié)果也告訴我一聲。而且在這個(gè)里面由于TImage和TBitmap都有各自的canvas,所以使用哪一個(gè)可能也是值得研究的,但是由于時(shí)間有限就沒有在嘗試了。
至于在部分取圖的過(guò)程中,我是用了一個(gè)TShape,然后用將brush的style設(shè)置成bsclear,在ImageCert的onMouseMove中安排這個(gè)TShap的位置,這樣做不是很靈敏,因?yàn)楫?dāng)鼠標(biāo)在TShape上面時(shí)則不會(huì)起到作用,所幸影響不大。同時(shí)我在TShape的OnMouseDown事件中取出TShape下面的部分圖片。這個(gè)時(shí)候如果你的圖片沒有做過(guò)縮放處理,就會(huì)發(fā)現(xiàn)取出的圖片和我們看到的位置不相符(當(dāng)然是在TImage沒有正確顯示圖片大小的情況下)。
可以肯定這個(gè)方法不是很好的方法,但是至少它解決了問(wèn)題。
啰里啰唆,不知所謂。
版權(quán)所有:idilent 網(wǎng)站轉(zhuǎn)載請(qǐng)注明作者 其他轉(zhuǎn)載方式請(qǐng)與作者聯(lián)系(idilent@yahoo.com.cn)。
|
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!