有關這個bilinear 公式 |
答題得分者是:istillloving
|
tsuo7727
一般會員 發表:4 回覆:7 積分:2 註冊:2009-04-17 發送簡訊給我 |
這篇文章http://delphi.ktop.com.tw/board.php?cid=168&fid=921&tid=34733 裡面利用bilinear 進行縮放 我看了裡面的程式 我取局部出來~ [code cpp] nclr1 = GetRValue(Bmp->Canvas->Pixels[ix][iy]); nclr2 = GetRValue(Bmp->Canvas->Pixels[ix 1][iy]); nclr3 = GetRValue(Bmp->Canvas->Pixels[ix][iy 1]); nclr4 = GetRValue(Bmp->Canvas->Pixels[ix 1][iy 1]); // Bilinear clrR=(byte)((1.0-fx)*(1.0-fy)*(double)nclr1 (fx)*(1.0-fy)*(double)nclr2 (1.0-fx)* (fy)*(double)nclr3 (fx)* (fy)*(double)nclr4);[/code] 裡面他的clrR 是針對相鄰四點的R值 去算 嗎? 相對的 G ,B 也是這樣? 再計算clrR 等號右邊怎麼會有一個 (byte) 什麼意思?? 以前用過一陣子 BCB 但我現在自己想用C語言寫 我在我的程式裡面 照著公式 把點陣圖的點放進去 但在後面算clrR時我把 byte 拿掉 不知道是不是因為這個關係而執行時有錯誤 新手第一次發表問題... 有地方不對 請原諒~"~....
------
繼續轉動 那最初的夢 |
ikk
尊榮會員 發表:4 回覆:413 積分:768 註冊:2003-06-30 發送簡訊給我 |
|
istillloving
高階會員 發表:33 回覆:182 積分:183 註冊:2008-10-09 發送簡訊給我 |
一般我們表示顏色強度是0~255
所以強制轉成byte的用意是這樣 ===================引 用 tsuo7727 文 章=================== 這篇文章http://delphi.ktop.com.tw/board.php?cid=168&fid=921&tid=34733 裡面利用bilinear 進行縮放 我看了裡面的程式 我取局部出來~ [code cpp] nclr1 = GetRValue(Bmp->Canvas->Pixels[ix][iy]); nclr2 = GetRValue(Bmp->Canvas->Pixels[ix 1][iy]); nclr3 = GetRValue(Bmp->Canvas->Pixels[ix][iy 1]); nclr4 = GetRValue(Bmp->Canvas->Pixels[ix 1][iy 1]); // Bilinear clrR=(byte)((1.0-fx)*(1.0-fy)*(double)nclr1 (fx)*(1.0-fy)*(double)nclr2 (1.0-fx)* (fy)*(double)nclr3 (fx)* (fy)*(double)nclr4);[/code] 裡面他的clrR 是針對相鄰四點的R值 去算 嗎? 相對的 G ,B 也是這樣? 再計算clrR 等號右邊怎麼會有一個 (byte) 什麼意思?? 以前用過一陣子 BCB 但我現在自己想用C語言寫 我在我的程式裡面 照著公式 把點陣圖的點放進去 但在後面算clrR時我把 byte 拿掉 不知道是不是因為這個關係而執行時有錯誤 新手第一次發表問題... 有地方不對 請原諒~"~....
------
恩... |
tsuo7727
一般會員 發表:4 回覆:7 積分:2 註冊:2009-04-17 發送簡訊給我 |
|
istillloving
高階會員 發表:33 回覆:182 積分:183 註冊:2008-10-09 發送簡訊給我 |
|
tsuo7727
一般會員 發表:4 回覆:7 積分:2 註冊:2009-04-17 發送簡訊給我 |
變成這樣的圖= = bilinear 程式碼在這 [code cpp] dX = (double)xsize/(double)newW; dY = (double)ysize/(double)newH; for(j = 0 ; j< newH ; j ){ for(i =0 ; i < newW ; i ) { x = dX*(double)i; y = dY*(double)j; ix = (int)x; iy = (int)y; fx = x - (double)ix; fy = y - (double)iy; nclr1= tar1 [3*(iy*xsize ix) 2]; nclr2= tar1 [3*(iy*xsize ix 1) 2]; nclr3= tar1 [3*(iy 1*xsize ix) 2]; nclr4= tar1 [3*(iy 1*xsize ix 1) 2]; clrR= (byte)((1.0-fx)*(1.0-fy)*(double)nclr1 (fx)*(1.0-fy)*(double)nclr2 (1.0-fx)* (fy)*(double)nclr3 (fx)*(fy)*(double)nclr4); nclr1= tar1 [3*(iy*xsize ix) 1]; nclr2= tar1 [3*(iy*xsize ix 1) 1]; nclr3= tar1 [3*(iy 1*xsize ix) 1]; nclr4= tar1 [3*(iy 1*xsize ix 1) 1]; clrG= (byte)((1.0-fx)*(1.0-fy)*(double)nclr1 (fx)*(1.0-fy)*(double)nclr2 (1.0-fx)* (fy)*(double)nclr3 (fx)* (fy)*(double)nclr4); nclr1= tar1 [3*(iy*xsize ix) 0]; nclr2= tar1 [3*(iy*xsize ix 1) 0]; nclr3= tar1 [3*(iy 1*xsize ix) 0]; nclr4= tar1 [3*(iy 1*xsize ix 1) 0]; clrB= (byte)((1.0-fx)*(1.0-fy)*(double)nclr1 (fx)*(1.0-fy)*(double)nclr2 (1.0-fx)* (fy)*(double)nclr3 (fx)* (fy)*(double)nclr4); *(tar 3 * (newW * j i) 2) = clrR; *(tar 3 * (newW * j i) 1) = clrG; *(tar 3 * (newW * j i) 0) = clrB; } } [/code] 還有個地方有問題 我如果用512 512 的圖下去 放大到1024 就會程式出錯 到1000 程式沒出錯 但會像上面那個圖 都會有一些斜線 到縮小 256 256 128 128 都正常 但是如果縮小像 200 200 其他這種數字 也一樣會跑出斜線 是程式哪邊出了什麼問題嗎??
------
繼續轉動 那最初的夢 |
istillloving
高階會員 發表:33 回覆:182 積分:183 註冊:2008-10-09 發送簡訊給我 |
您好:
我沒有試你的公式 但是我猜 [code cpp] nclr1= tar1 [3*(iy*xsize ix) 2]; nclr2= tar1 [3*(iy*xsize ix 1) 2]; nclr3= tar1 [3*(iy 1*xsize ix) 2]; nclr4= tar1 [3*(iy 1*xsize ix 1) 2]; [/code] 你必須要了解這種寫法 [code cpp] buff1[i][j]=buff2[i w*j] buff1[i 1][j]=buff2[i 1 w*j] buff1[i][j 1]=buff2[i w*(j 1)] [/code] 這是一維陣列和二維的用法 跟你的程式有些微的不同 看的出在哪嘛 ===================引 用 tsuo7727 文 章=================== 變成這樣的圖= = bilinear 程式碼在這 [code cpp] dX = (double)xsize/(double)newW; dY = (double)ysize/(double)newH; for(j = 0 ; j< newH ; j ){ for(i =0 ; i < newW ; i ) { x = dX*(double)i; y = dY*(double)j; ix = (int)x; iy = (int)y; fx = x - (double)ix; fy = y - (double)iy; nclr1= tar1 [3*(iy*xsize ix) 2]; nclr2= tar1 [3*(iy*xsize ix 1) 2]; nclr3= tar1 [3*(iy 1*xsize ix) 2]; nclr4= tar1 [3*(iy 1*xsize ix 1) 2]; clrR= (byte)((1.0-fx)*(1.0-fy)*(double)nclr1 (fx)*(1.0-fy)*(double)nclr2 (1.0-fx)* (fy)*(double)nclr3 (fx)*(fy)*(double)nclr4); nclr1= tar1 [3*(iy*xsize ix) 1]; nclr2= tar1 [3*(iy*xsize ix 1) 1]; nclr3= tar1 [3*(iy 1*xsize ix) 1]; nclr4= tar1 [3*(iy 1*xsize ix 1) 1]; clrG= (byte)((1.0-fx)*(1.0-fy)*(double)nclr1 (fx)*(1.0-fy)*(double)nclr2 (1.0-fx)* (fy)*(double)nclr3 (fx)* (fy)*(double)nclr4); nclr1= tar1 [3*(iy*xsize ix) 0]; nclr2= tar1 [3*(iy*xsize ix 1) 0]; nclr3= tar1 [3*(iy 1*xsize ix) 0]; nclr4= tar1 [3*(iy 1*xsize ix 1) 0]; clrB= (byte)((1.0-fx)*(1.0-fy)*(double)nclr1 (fx)*(1.0-fy)*(double)nclr2 (1.0-fx)* (fy)*(double)nclr3 (fx)* (fy)*(double)nclr4); *(tar 3 * (newW * j i) 2) = clrR; *(tar 3 * (newW * j i) 1) = clrG; *(tar 3 * (newW * j i) 0) = clrB; } } [/code] 還有個地方有問題 我如果用512 512 的圖下去 放大到1024 就會程式出錯 到1000 程式沒出錯 但會像上面那個圖 都會有一些斜線 到縮小 256 256 128 128 都正常 但是如果縮小像 200 200 其他這種數字 也一樣會跑出斜線 是程式哪邊出了什麼問題嗎??
------
恩...
編輯記錄
istillloving 重新編輯於 2009-08-05 16:55:47, 註解 無‧
|
tsuo7727
一般會員 發表:4 回覆:7 積分:2 註冊:2009-04-17 發送簡訊給我 |
===================引 用 istillloving 文 章=================== 您好: 我沒有試你的公式 但是我猜 [code cpp] nclr1= tar1 [3*(iy*xsize ix) 2]; nclr2= tar1 [3*(iy*xsize ix 1) 2]; nclr3= tar1 [3*(iy 1*xsize ix) 2]; nclr4= tar1 [3*(iy 1*xsize ix 1) 2]; [/code] 你必須要了解這種寫法 [code cpp] buff1[i][j]=buff2[i w*j] buff1[i 1][j]=buff2[i 1 w*j] buff1[i][j 1]=buff2[i w*(j 1)] [/code] 這是一維陣列和二維的用法 跟你的程式有些微的不同 看的出在哪嘛 --------------------------------------------------------- 我剛把我的單色點陣圖 把她轉成24位元之後 就正常了 只是縮放時的尺寸不能像我參考的程式 可以任意輸入而不會有斜線的效果 有點不太懂.. BUFF2 裡的東西 是否可麻煩稍微說明一下.. 感激...
------
繼續轉動 那最初的夢
編輯記錄
tsuo7727 重新編輯於 2009-08-06 12:44:53, 註解 無‧
|
istillloving
高階會員 發表:33 回覆:182 積分:183 註冊:2008-10-09 發送簡訊給我 |
tar1 [3*(iy 1*xsize ix) 0];
裡面 iy 1*xsize ix 和 (iy 1)*xsize ix 數學運算 先乘除後加減 假設影像大小是 3*3 那照你的設定來看的話 int xsize = 3; int ysize = 3; 一維陣列就是 new 出一條連續的記憶體( 講連續比較好理解 在實體記憶體可能是很多分段串起來的) 那二維陣列用矩陣來描述他是比較清楚的( 在實體也是串起來的 ) 那這兩個只是用法有點不一樣而已 假設 array1是二維 array2是一維 那我們要把3*3的影像存到這兩種陣列內 最基本的大小就是要3*3=9 宣告是這樣宣告的 double array1[xsize][ysize]; double *array2; array2 = new double[xsize*ysize]; 宣告完之後就是把影像存入陣列 [code cpp] for(j=0;j for(i=0;i array1[ i ][ j ]=Image[ i ][ j ]; array2[i xsize*j]=Image[ i ][ j ]; } } [/code] 這個for迴圈只有 3*3 的大小而已 用筆和紙給他run一次看看 你就能夠體會 i xsize*(1 j) i xsize*1 j 這兩個不一樣在哪了 參考
------
恩...
編輯記錄
istillloving 重新編輯於 2009-08-06 22:54:06, 註解 無‧
istillloving 重新編輯於 2009-08-06 22:54:43, 註解 無‧ istillloving 重新編輯於 2009-08-06 22:55:22, 註解 無‧ istillloving 重新編輯於 2009-08-06 22:57:45, 註解 無‧ istillloving 重新編輯於 2009-08-06 22:58:34, 註解 無‧ |
tsuo7727
一般會員 發表:4 回覆:7 積分:2 註冊:2009-04-17 發送簡訊給我 |
|
istillloving
高階會員 發表:33 回覆:182 積分:183 註冊:2008-10-09 發送簡訊給我 |
|
tsuo7727
一般會員 發表:4 回覆:7 積分:2 註冊:2009-04-17 發送簡訊給我 |
恩 我剛找到問題 修改過後
ok了 非常感激你 ^^" ----- 最近又用了一下自己的程式 發現放大的與縮小的 一小部分問題,其他還是可以正常縮放 不知道為什麼 放大或縮小成"某些範圍" 他寫出的圖檔會變成這樣 不知道從這邊可不可以看出 問題是在哪邊?
------
繼續轉動 那最初的夢 |
istillloving
高階會員 發表:33 回覆:182 積分:183 註冊:2008-10-09 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |