線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3300
推到 Plurk!
推到 Facebook!

Bitmap任意角度旋轉

答題得分者是:RaynorPao
TikiLee509
一般會員


發表:7
回覆:3
積分:2
註冊:2003-02-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-20 11:12:32 IP:216.127.xxx.xxx 未訂閱
如何才能把一張Bitmap做任意角度旋轉?有這方面的參考資料嗎?
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-20 11:15:06 IP:203.73.xxx.xxx 未訂閱
引言: 如何才能把一張Bitmap做任意角度旋轉?有這方面的參考資料嗎? < face="Verdana, Arial, Helvetica"> TikiLee509 你好: 請參考以下的連結文章
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
TikiLee509
一般會員


發表:7
回覆:3
積分:2
註冊:2003-02-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-20 12:02:33 IP:216.127.xxx.xxx 未訂閱
很詳細的資料,謝謝版主
clarkkent
初階會員


發表:29
回覆:83
積分:32
註冊:2003-01-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-26 15:47:40 IP:61.59.xxx.xxx 未訂閱
想進一步請教一下 因為上述的旋轉都是以某一角旋轉,請問 如果是想以圖片中心為旋轉點呢? 該如何改進 謝謝您 如果此文章違反版規 還請版主告知並刪除 Just do it
------
JUST DO IT
JerryKuo
版主


發表:42
回覆:571
積分:322
註冊:2003-03-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-26 17:24:56 IP:61.220.xxx.xxx 未訂閱
RaynorPao提供的文章就已經有你想要的資料.. 只是不知道你有沒有注意到你的影像矩陣索引值(x,y) 都是正值,所以影像的原點在影像的左上角(0,0) 而一般影像旋轉都是根據原點旋轉的,你只要把影像 的原點移到你希望的影像中心點,就能得到你想要的 旋轉方式
clarkkent
初階會員


發表:29
回覆:83
積分:32
註冊:2003-01-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-26 20:43:59 IP:211.74.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-03-27 09:10:43 IP:61.220.xxx.xxx 未訂閱
以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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2010-01-30 01:28:07 IP:59.116.xxx.xxx 訂閱
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;xWidth;x )
{
for(int y=0;yHeight;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)為旋轉點吧?
編輯記錄
3215009 重新編輯於 2010-01-30 01:29:16, 註解 無‧
3215009 重新編輯於 2010-01-30 01:32:57, 註解 無‧
3215009 重新編輯於 2010-01-30 01:51:50, 註解 無‧
3215009 重新編輯於 2010-01-30 02:05:05, 註解 無‧
系統時間:2024-05-20 18:30:14
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!