討論區快速選單
知識庫快速選單
討論區最近新進100則主題 下載Alexa Toolbar讓你上網更有趣
[ 回上頁 ] [ 討論區發言規則 ]
請問有人知道~該如何讓圖片360度旋轉?
更改我的閱讀文章字型大小
作者 : chowu(chowu)
[ 貼文 11 | 人氣 1339 | 評價 0 | 評價/貼文 0 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/7/3 上午 08:02:04
請問有人知道~該如何讓圖片360度旋轉? 目的是想讓個圓盤能正逆轉顯示!! 麻煩指導一下!
作者 : avs(傳說)
[ 貼文 49 | 人氣 1 | 評價 410 | 評價/貼文 8.37 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人chowu註記此篇回應為很有道理 2008/7/3 上午 11:09:40
你可以使用Bitmap類別的RotateFlip方法
可以將圖片作90、180、270度的旋轉
如果要旋轉其他角度
可能就必需使用GDI+去畫了
作者 : dorkas(aming) VC++優秀好手遊戲程式設計卓越專家DirectX頂尖高手C++優秀好手貼文超過2000則
[ 貼文 2625 | 人氣 4536 | 評價 11810 | 評價/貼文 4.5 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人chowu註記此篇回應為很有道理 2008/7/3 下午 01:59:37

θ=角度
(x,y)=旋轉前座標
(x′ ,y′ )=旋轉後座標

x′ = x * cos θ – y * sin θ
y′ = y * cos θ + x * sin θ


把圖片上的2D陣列代進 x,y 得到x′,y′
然後把顏色值填入x′ y′


for (int y=0;y<height;y++)
{
   for (int x=0;x<width;x++)
   {
     int color=GetPixel(hBitmap,x,y);
     int ox=cos(angle)*x-sin(angle)*y;
     int oy=cos(angle)*y+sin(angle)*x;
     SetPixel(hBitmap,ox,oy,color);
    }
}



作者 : chowu(chowu)
[ 貼文 11 | 人氣 1339 | 評價 0 | 評價/貼文 0 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/7/3 下午 05:03:11
感謝網上各位大俠不吝指導~非常感謝~我試試看!
作者 : chowu(chowu)
[ 貼文 11 | 人氣 1339 | 評價 0 | 評價/貼文 0 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/7/3 下午 05:09:10
自請問一下>>把圖片上的2D陣列代進 x,y 得到x′,y′
然後把顏色值填入x′ y′

這句話是什麼意思~?? 謝謝
作者 : chowu(chowu)
[ 貼文 11 | 人氣 1339 | 評價 0 | 評價/貼文 0 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/7/3 下午 07:37:21
不知能否提供個範例~因為剛學c#~所以還很多不懂~麻煩善心幫忙一下~感恩!!
作者 : qazujm(joe) Visual Basic卓越專家C#優秀好手貼文超過1000則
[ 貼文 1491 | 人氣 2524 | 評價 8910 | 評價/貼文 5.98 | 送出評價 90 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人chowu註記此篇回應為很有道理 2008/7/3 下午 09:06:07
>自請問一下>>把圖片上的2D陣列代進 x,y 得到x′,y′
>然後把顏色值填入x′ y′
>這句話是什麼意思~?? 謝謝
>不知能否提供個範例~因為剛學c#~所以還很多不懂~麻煩善心幫忙一下~感恩!!
 
比如說,圖片左上角座標是(0, 0),右下角為(99, 99),所以圖片是100乘100的陣列,從(0, 0)到(99, 99)取出顏色值,例如座標(0, 0)旋轉某角度,代入aming大大的公式,產生新座標,假設是(2, 3),就要填入舊座標(0, 0)的顏色值,aming大大已經寫的很清楚了,這個公式可能會有些誤差,會產生白點,還需要微調!參考下列網址的說明,不過是用VB的語法,

http://kyovbdx.myweb.hinet.net/tutorials/DirectX/D3D/DXlesson04.htm
作者 : chowu(chowu)
[ 貼文 11 | 人氣 1339 | 評價 0 | 評價/貼文 0 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/7/3 下午 09:48:42
Bitmap source = new Bitmap(openFileDialog.FileName);
Bitmap result = new Bitmap(source.Width, source.Height);
for (int x = 0; x < source.Height; x++)
{
     for (int y = 0; y < source.Width; y++)
     {
     Color myColor = source.GetPixel(y, x);
     int ox =(int)(Math.Cos(angle) * x - Math.Sin(angle) * y);
     int oy =(int)(Math.Cos(angle) * y + Math.Sin(angle) * x);

     result.SetPixel(oy, ox, myColor);
     }
}
此行 result.SetPixel(oy, ox, myColor); 會拋出 "參數必須是正數且小於寬度。"的錯誤 ?? 可以請問為什麼??? 向給予的回覆各位大俠~說聲謝謝!!

作者 : qazujm(joe) Visual Basic卓越專家C#優秀好手貼文超過1000則
[ 貼文 1491 | 人氣 2524 | 評價 8910 | 評價/貼文 5.98 | 送出評價 90 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人chowu註記此篇回應為很有道理 2008/7/4 上午 07:09:04
Bitmap source = new Bitmap(openFileDialog.FileName);
Bitmap result = new Bitmap(source.Width, source.Height);
int centerX = source.Width/2
int centerY = source.Height/2

for (int y = 0; y < source.Height; y++)
{
     for (int x = 0; x < source.Width; x++)
     {
     int DistanceX = x - centerX
     int DistanceY = y - centerY
     Color myColor = source.GetPixel(x, y);
     int ox =centerX+(int)(Math.Cos(angle) * DistanceX - Math.Sin(angle) * DistanceY );
     int oy =centerY+(int)(Math.Cos(angle) * DistanceY + Math.Sin(angle) * DistanceX );
     result.SetPixel(ox, oy, myColor);
     }
}
>此行 result.SetPixel(oy, ox, myColor); 會拋出 "參數必須是正數且小於寬度。"的錯誤 ?? 可以請問為什麼??? 向給予的回覆各位大俠~說聲謝謝!!

因為xy座標,超過圖範圍了,x通常代表寬,y代表高,弄顛倒,結果應該會不對吧!上面我做了些小修改,請參考!如果還不行的話,應該要做邊界判斷,也就是ox, oy要>=0,小於寬度、高度。
if (ox >= 0) && (oy >= 0) && (ox < source.width) && (oy < source.height)
{
result.SetPixel(ox, oy, myColor);
}
作者 : chowu(chowu)
[ 貼文 11 | 人氣 1339 | 評價 0 | 評價/貼文 0 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/7/4 上午 08:18:48
非常感謝qazujm(joe) 大俠的指導,我試試看!!
作者 : chowu(chowu)
[ 貼文 11 | 人氣 1339 | 評價 0 | 評價/貼文 0 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/7/4 上午 09:13:27
圖像可以旋轉角度了~但是現在遇到個問題就是 需要花很多時間處理與影像出現許多白點~能否在指導一下如何改善??謝謝
作者 : dorkas(aming) VC++優秀好手遊戲程式設計卓越專家DirectX頂尖高手C++優秀好手貼文超過2000則
[ 貼文 2625 | 人氣 4536 | 評價 11810 | 評價/貼文 4.5 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人chowu註記此篇回應為很有道理 2008/7/4 上午 09:33:06
加快版
旋轉公式只是拿來算出四個角的座標
然後求出斜率用直線演算法去填色
作者 : chiuinan2(青衫)討論區板主 Visual C++ .NET卓越專家VC++一代宗師Visual Basic優秀好手資訊類作業求救卓越專家一般曠世奇才程式設計甘苦談優秀好手C++ Builder優秀好手上班族的哈拉園地優秀好手C++頂尖高手Assembly優秀好手貼文超過3000則人氣指數超過150000點
[ 貼文 3722 | 人氣 170106 | 評價 34280 | 評價/貼文 9.21 | 送出評價 125 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人chowu註記此篇回應為很有道理 2008/7/4 下午 01:23:54
1.旋轉需要注意一下中心點位置所在的問題 (先做平移運算)
2.圖像旋轉/縮放計算等, 不一定非得S->D, 也可以從D->S (S=來源點,D=目的點), 計算公式相同. 這樣就無需處理白點的問題了.
作者 : chowu(chowu)
[ 貼文 11 | 人氣 1339 | 評價 0 | 評價/貼文 0 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/7/4 下午 05:18:21
感謝各位大俠回覆!!
  
關於這回覆 => 加快版
旋轉公式只是拿來算出四個角的座標
然後求出斜率用直線演算法去填色
對小弟來說太深了~能有範例參考嗎?


關於這回覆 =>旋轉需要注意一下中心點位置所在的問題 (先做平移運算)
平移運算??小弟入世未深~~能有範例參考嗎?
作者 : chowu(chowu)
[ 貼文 11 | 人氣 1339 | 評價 0 | 評價/貼文 0 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/7/4 下午 06:34:25
再請問各位大俠~其實我的學習目標是能夠在視窗上有多個元件能夠偵測硬體電路能夠與元件同步旋轉~因為需要及時顯示~是否方向錯誤~請問是否只能用GDI+才可達成?? 各位大俠能給個指導嗎? 如果是使用GDI+該如何達到繪圖元件旋轉(正逆轉)的效果?? 感謝各位的回覆!
作者 : chiuinan2(青衫)討論區板主 Visual C++ .NET卓越專家VC++一代宗師Visual Basic優秀好手資訊類作業求救卓越專家一般曠世奇才程式設計甘苦談優秀好手C++ Builder優秀好手上班族的哈拉園地優秀好手C++頂尖高手Assembly優秀好手貼文超過3000則人氣指數超過150000點
[ 貼文 3722 | 人氣 170106 | 評價 34280 | 評價/貼文 9.21 | 送出評價 125 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人chowu註記此篇回應為很有道理 2008/7/4 下午 06:35:13
>旋轉公式只是拿來算出四個角的座標
>然後求出斜率用直線演算法去填色
>對小弟來說太深了~能有範例參考嗎?

直線演算法可在基礎的繪圖學中找到, 網路也有, 但... 無法用在圖像旋轉上, 空點的現象依然存在. 暫時不用管這個, 將來有興趣可去找來看看.

>關於這回覆 =>;旋轉需要注意一下中心點位置所在的問題 (先做平移運算)
>平移運算??小弟入世未深~~能有範例參考嗎?

joe給的例字裡就含了平移運算, 參考下面的說明, 再對照他的程式了解一下.

一般在做圖形處理時, 多半先平移至原點. 假設(x,y)為圖像的點, 而圖像要以(cx,cy)為中心旋轉, 那麼先平移到(cx,cy), 也就是以(cx,cy)為原點:

(x,y) = (x-cx,y-cy)

(x,y)便是以(cx,cy)為原點的新座標, 然後才開始做旋轉或其他運算. 運算完後, 必須平移回真正的原點, 假設(nx,ny)為運算後的座標, 則平移回真正原點變成:

(nx,ny) = (nx+cx,ny+cy)

實際要繪製的便是(nx,ny). joe程式裡的DistanceX,DistanceY相當於(x,y), 旋轉運算後的ox,oy便是(nx,ny), 但在旋轉運算式中, 已做了加上CenterX與加上CenterY的動作, 就是平移運算.

真正解決的方法是我寫的第2點. 前面諸位提供的程式與想法都是以來源點運算為主:

for 圖像中的每一點 (x,y)
{
   (nx,ny) = (x,y)旋轉後應畫的點
    if (nx,ny)在繪製範圍中 then 取出(x,y)的像素放到(nx,ny)
}

這樣的想法雖然沒錯, 但在任意角度的圖像旋轉中, 會因為計算後四捨五入問題, 造成有些繪製點沒繪製到, 而造成空白點的問題. 但換成以目的點運算為主便不會有此一問題:

算出圖像旋轉後在可繪製區的矩形範圍
for (前述範圍中的每一點nx,ny)
{
  (x,y) = (nx,ny)旋轉前在圖像中的點
   if (x,y)在圖像範圍中 then 取出 (x,y)的像素放到(nx,ny)
}

如果不會算旋轉後的矩形範圍, 可先用整個可繪製區範圍 (速度會較慢), 寫出來沒問題後再補上去. 要算出旋轉前的點, 其實就是反相旋轉, 將旋轉角度改為負值後, 按旋轉公式計算便可以了. 程式就暫不提供了, 先自己練習一下吧 (試著從joe的程式修改).

另外, cos, sin的運算速度很慢, 不要放在for迴圈裡, 用個變數記錄並提到外層, 這樣速度比較快些.

題外話: 圖像縮小時, 以目的點運算為主, 速度會比以來源點運算為主的快 (因為計算數較少).
作者 : chowu(chowu)
[ 貼文 11 | 人氣 1339 | 評價 0 | 評價/貼文 0 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/7/5 上午 08:24:51
感謝各位大俠回覆~我試試看!! 感恩啦!
 板主 : 小朱
 > C# - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - C# - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
C#
1 小朱 6260 
2 蹂躪 2700 
3 HKLN.net 2440 
4 marlon 2130 
5 joe 1260 
6 識丁 910 
7 好說 860 
8 愛睏魚 770 
9 總幹事 720 
10 Demonbane 600 
C#
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2014 程式設計俱樂部 http://www.programmer-club.com.tw/
0.109375