Bitmap任意角度旋轉 |
答題得分者是:RaynorPao
|
TikiLee509
一般會員 發表:7 回覆:3 積分:2 註冊:2003-02-04 發送簡訊給我 |
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
|
TikiLee509
一般會員 發表:7 回覆:3 積分:2 註冊:2003-02-04 發送簡訊給我 |
|
clarkkent
初階會員 發表:29 回覆:83 積分:32 註冊:2003-01-23 發送簡訊給我 |
|
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
|
clarkkent
初階會員 發表:29 回覆:83 積分:32 註冊:2003-01-23 發送簡訊給我 |
引言: RaynorPao提供的文章就已經有你想要的資料.. 只是不知道你有沒有注意到你的影像矩陣索引值(x,y) 都是正值,所以影像的原點在影像的左上角(0,0) 而一般影像旋轉都是根據原點旋轉的,你只要把影像 的原點移到你希望的影像中心點,就能得到你想要的 旋轉方式謝謝您的回應 不好意思再次請教一下 如果有一張圖是(假設是3x3的圖,每個數字代表一個pixel) 123 1這點的座標為(1,1) 456 5這點的座標為(2,2) 789 9這點的座標為(3,3) 上述的那個方法是以1順時針旋轉 這樣子有可能您旋轉後的大小有可能會超出原來的大小,所以需要計算 < >< >Q一、我將角度加大到超過九十度後會有部分被切掉看不到! < >< >Q二、如果現在以上圖的5為旋轉中心,則會變成 (將原來1移到5的位置,但座標改變了) 123 1這點的座標為(2,2) 456 5這點的座標為(3,3) 789 9這點的座標為(4,4) 而我之前想請教的是如果我是以5為中心旋轉,假設順時針旋轉九十度 應該變成 741 7這點的座標為(1,1) 852 5這點的座標為(2,2)←旋轉前、後座標都沒變 963 9這點的座標為(3,3) 我改了以下兩行 int SrcBitmapx=(int)((x minx十10)*cosine (y miny)*sine); int SrcBitmapy=(int)((y miny十10)*cosine-(x minx)*sine); 結果變成整張圖原點座標移到(10,10)再旋轉,即原來的(0,0)→(10,10) 這與我的要求不符合 是我改錯地方了嗎? 請指教 如果此文章違反版規 還請版主告知並刪除 Just do it
------
JUST DO IT |
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
以3x3的影像做說明
矩陣座標值,影像的原點在(0,0)
(0,0),(1,0),(2,0)
(0,1),(1,1),(2,1)
(0,2),(1,2),(2,2)
而實際你要的旋轉方式,原點在中心點(1,1)的位置
根據原點做旋轉,將原本(1,1)改成(0,0),旋轉計算
後的圓心是不是才會不動,所以其他就要跟著(1,1)
改成如下:
(-1,-1),(0,-1),(1,-1)
(-1, 0),(0, 0),(1, 0)
(-1, 1),(0, 1),(1, 1)
套入旋轉的函數,旋轉90度,原本的影像變為
123 369
456 -> 258
789 147
因為要存入原來的影像矩陣,所以處理後的坐標要再還原
每個座標再位移(1,1),放入影像矩陣.這樣就得到你想要
的。
|
3215009
一般會員 發表:1 回覆:1 積分:0 註冊:2005-12-01 發送簡訊給我 |
float p1x=(OrgBitmap->Width*cosine);
float p1y=(-OrgBitmap->Width*sine); float p2x=(OrgBitmap->Height*sine); float p2y=(OrgBitmap->Height*cosine); float p3x=(OrgBitmap->Width*cosine OrgBitmap->Height*sine); float p3y=(OrgBitmap->Height*cosine-OrgBitmap->Width*sine); float minx=min(0,min(p1x,min(p2x,p3x))); float miny=min(0,min(p1y,min(p2y,p3y))); float maxx=max(0,max(p1x,max(p2x,p3x))); float maxy=max(0,max(p1y,max(p2y,p3y))); float newWidth =maxx-minx; float newHeight=maxy-miny; DestBitmap->Width =newWidth; DestBitmap->Height=newHeight; for(int x=0;x { for(int y=0;y { int OrgBitmapx=(x minx)*cosine-(y miny)*sine; int OrgBitmapy=(y miny)*cosine (x minx)*sine; DestBitmap->Canvas->Pixels[x][y]=OrgBitmap->Canvas->Pixels[OrgBitmapx][OrgBitmapy]; } } 兩個迴圈裡的程式碼看不太懂,OrgBitmapx=(x minx)*cosine-(y miny)*sine; OrgBitmapy=(y miny)*cosine (x minx)*sine; 有哪位高手能解釋一下?謝謝 圖片旋轉是以(0,0)為旋轉點吧? |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |