人人做人人澡人人爽欧美,国产主播一区二区,久久久精品五月天,羞羞视频在线观看免费

當(dāng)前位置:蘿卜系統(tǒng)下載站 > 技術(shù)開發(fā)教程 > 詳細(xì)頁(yè)面

在Delphi中完成圖片的旋轉(zhuǎn)、縮放

在Delphi中完成圖片的旋轉(zhuǎn)、縮放

更新時(shí)間:2022-08-30 文章作者:未知 信息來(lái)源:網(wǎng)絡(luò) 閱讀次數(shù):

好長(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)收藏一下本站!

本類教程下載

系統(tǒng)下載排行

網(wǎng)站地圖xml | 網(wǎng)站地圖html
主站蜘蛛池模板: 千阳县| 新民市| 金秀| 年辖:市辖区| 扬中市| 鄢陵县| 土默特右旗| 多伦县| 巴青县| 诸暨市| 巨鹿县| 乐至县| 孝义市| 天气| 山西省| 大兴区| 商南县| 安岳县| 梁山县| 普陀区| 涡阳县| 郎溪县| 军事| 宁夏| 诏安县| 饶河县| 靖宇县| 白沙| 新乡市| 石河子市| 巫溪县| 甘南县| 莱西市| 陇西县| 垦利县| 寿宁县| 铜鼓县| 平昌县| 中方县| 三亚市| 汕尾市|