C_and_CPP 板


LINE

※ 引述《sbty173 (我愛單眼皮)》之銘言: : 各位前輩好 : 我最近用在做圖片的旋轉 用的是2003.net 的mfc寫 : 可是沒有什麼頭緒 : 去程式討論區發現有前輩做了一個類似的程式 : http://delphi.ktop.com.tw/topic.asp?topic_id=34152 : 他的button7 是作旋轉的 : 但他是用BCB做 : 內容如下 : void __fastcall TForm1::Button7Click(TObject *Sender) : { : Image2->AutoSize=true; : int angle=StrToInt(Edit2->Text); : Graphics::TBitmap *Bitmap1=new Graphics::TBitmap; : Graphics::TBitmap *Bitmap2=new Graphics::TBitmap; : Bitmap1->Assign(Image1->Picture->Bitmap); : float radians=(2*3.1416*angle)/360; //不懂為何這樣設定?? : float cosine=(float)cos(radians); : float sine=(float)sin(radians); : float Point1x=(-Bitmap1->Height*sine); : float Point1y=(Bitmap1->Height*cosine); : float Point2x=(Bitmap1->Width*cosine-Bitmap1->Height*sine); : float Point2y=(Bitmap1->Height*cosine+Bitmap1->Width*sine); : float Point3x=(Bitmap1->Width*cosine); : float Point3y=(Bitmap1->Width*sine); : float minx=min(0,min(Point1x,min(Point2x,Point3x))); : float miny=min(0,min(Point1y,min(Point2y,Point3y))); : float maxx=max(Point1x,max(Point2x,Point3x)); : float maxy=max(Point1y,max(Point2y,Point3y)); : int Bitmap2Width=(int)ceil(maxx-minx); : int Bitmap2Height=(int)ceil(maxy-miny); : Bitmap2->Height=Bitmap2Height; : Bitmap2->Width=Bitmap2Width; : for(int x=0;x<Bitmap2Width;x++) : { : for(int y=0;y<Bitmap2Height;y++) : { : int Bitmap1x=(int)((x+minx)*cosine+(y+miny)*sine); : int Bitmap1y=(int)((y+miny)*cosine-(x+minx)*sine); : if(Bitmap1x>=0&&Bitmap1x<Bitmap1->Width&&Bitmap1y>=0&&Bitmap1y<Bitmap1->Height) : { : Bitmap2->Canvas->Pixels[x][y]=Bitmap1->Canvas->Pixels[Bitmap1x][Bitmap1y]; : } : } : } : 我看不太懂為什麼要這樣做運算 : 不曉得前輩們可以幫我解釋一下嗎 : 還有請問語法有些我不太懂 要怎麼轉過來呢? 其實圖片的旋轉很簡單,用到的都是數學的公式而已!:) 把一張圖想成是放在一個數學座標上的圖來想,應該會比較好理解。 在數學的旋轉上面.... 如果我要將 (x, y) 的點,逆時鐘旋轉 30 度變成 (x' , y') 哪麼公式是... x' = cos30 * x - sin30 * y y' = sin30 * x + cos30 * y 看了上面的公式,直覺的做法就是用雙 for 將原圖全部的 pixel 跑一次... 然後算出旋轉後的新位置,存到新的陣列中。 但是這樣做你會發現.... for (i = 0; i < old_bmp_h; i++) for (j = 0; j < old_bmp_w; j++) { x' = cos(30度) * j - sin(30度) * i; y' = cos(30度) * j - sin(30度) * i; // cos() 裡面要傳入的是 "徑度" // radians=(2*3.1416*angle)/360; //不懂為何這樣設定?? // 就是在轉成徑度用的。 new_bmp[x'][y'] = old_bmp[i][j]; } 如此作完,結果一定很難看.... 因為 cos(30) * j - sin(30) * i 算出來的結果有可能是小數 如果說 x' = 30.1 那會被強制變成整數為 30 下一個 pixel 算出來 x' = 30.3 結果還是會是 30 所以,到最後的結果就會有很多旋轉前的 pixel 都填入同一個旋轉後的 pixel 而很多旋轉後的 pixel 沒有值填入。 因此!我們需要逆向思考! for (i = 0; i < new_bmp_h; i++) for (j = 0; j < new_bmp_w; j++) { x = ............... ; y = ............... ; // 倒過來個公式自己用數學代數算一下就出來了!:) new_bmp[i][j] = old_bmp[x][y]; } 這樣是把旋轉後的每一個 pixel 都跑過一次.... 反算應該要用旋轉前的哪一個 pixel 填入。 做到這樣,結果就會好很多了,但是會發現會有鋸齒狀。 所以有更好的演算法可以幫助你做的更好。 1. 最近鄰居法。 最簡單,但是效果非常有限。 2. biliner。 簡單,效過又好。 3. bicubic。 複雜,效過最好。 建議可以做到2就可以了!^^ 至於詳細的內容,可以用 google 找一下就可以找到了。^^ 2, 3 也是常常用在將圖片放大、縮小的時候。 --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.163.159.53
1F:→ qazq:反算的公式,發現原PO所貼的code裡面就有了 :) 09/27 21:59
※ 編輯: qazq 來自: 218.163.159.53 (09/27 22:02)
2F:推 moonls:寫的很清楚 !! 獲益良多 09/28 00:23
3F:推 renderer:推 09/28 10:40







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:iOS站內搜尋

TOP