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

為什麼這段線性內插法的程式碼 , 空間不會爆

答題得分者是:istillloving
kobebryant81
一般會員


發表:15
回覆:15
積分:6
註冊:2007-05-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-01-12 14:46:03 IP:114.32.xxx.xxx 訂閱
各位好 , 我參考了jerryKuo版主發表的作品
http://delphi.ktop.com.tw/board.php?cid=168&fid=921&tid=34733
擷取裡頭這段程式碼


[code cpp]
dX = (double)w/(double)newW;
dY = (double)h/(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 - (float)ix; fy = y - (float)iy;
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]
假設 原始 寬高為5 , 放大2倍後 newW=10 , newH =10,
當 i 與 j 等於 newW-1 , newH-1時 , ix = 4 , iy=4
此時 執時此行 nclr2 = GetRValue(Bmp->Canvas->Pixels[ix 1][iy]);
ix 1=5 照理說空間不就爆了, 最多只到Bmp->Canvas->Pixels[4][4] (5*5影像) ... 但我執行卻不會出錯
只是放大後的圖在最右邊和最下面兩行的像素值不知讀到哪裡的值 , 會出現其他像素值
我很好奇為什麼空間不會爆呢??
謝謝解答
編輯記錄
kobebryant81 重新編輯於 2010-01-12 17:07:51, 註解 無‧
kobebryant81 重新編輯於 2010-01-12 17:10:05, 註解 無‧
istillloving
高階會員


發表:33
回覆:182
積分:183
註冊:2008-10-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-01-13 10:31:46 IP:140.127.xxx.xxx 訂閱
說真的

我也是用這個雙線性內插

但是不是不爆 是不到重要關頭他才不爆

所以還是乖乖加上判斷式吧


[code cpp]
/**** 雙線性內插 ****/
dX = (double)ww/(double)newW;
dY = (double)hh/(double)newH;

for(j = 0 ; j < newH ; j )
{
for(i =0 ; i < newW ; i )
{
XX = dX*(double)i;
YY = dY*(double)j;

ix = (int)XX; iy = (int)YY;
fx = XX - (double)ix; fy = YY - (double)iy;

// Bilinear 加上邊界判斷式
if( (ix nclr1 = NBmp[ix ww*iy];
else if( (ix>=ww)&&(iy nclr1 = NBmp[ww-1 ww*iy];
else if( (ix=hh) )
nclr1 = NBmp[ix ww*(hh-1)];
else
nclr1 = NBmp[ww-1 ww*(hh-1)];

if( (ix 1 nclr2 = NBmp[ix 1 ww*iy];
else if( (ix 1>=ww)&&(iy nclr2 = NBmp[ww-1 ww*iy];
else if( (ix 1=hh) )
nclr2 = NBmp[ix 1 ww*(hh-1)];
else
nclr2 = NBmp[ww-1 ww*(hh-1)];

if( (ix nclr3 = NBmp[ix ww*(iy 1)];
else if( (ix>=ww)&&(iy 1 nclr3 = NBmp[ww-1 ww*iy];
else if( (ix=hh) )
nclr3 = NBmp[ix ww*(hh-1)];
else
nclr3 = NBmp[ww-1 ww*(hh-1)];

if( (ix 1 nclr4 = NBmp[ix 1 ww*(iy 1)];
else if( (ix 1>=ww)&&(iy 1 nclr4 = NBmp[ww-1 ww*iy];
else if( (ix 1=hh) )
nclr4 = NBmp[ww-1 ww*(hh-1)];
else
nclr4 = NBmp[ww-1 ww*(hh-1)];


clr=(double)((1-fy)*((1-fx)*nclr1 fx*nclr2) fy*((1-fx)*nclr3 fx*nclr4));

RBmp[i newW*j] =((clr)>WBN)?255.0:0.0;
}
}
/**** 雙線性內插 **END**/

[/code]





===================引 用 kobebryant81 文 章===================
各位好 , 我參考了jerryKuo版主發表的作品
http://delphi.ktop.com.tw/board.php?cid=168&fid=921&tid=34733
擷取裡頭這段程式碼


[code cpp]
dX = (double)w/(double)newW;
dY = (double)h/(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 - (float)ix; fy = y - (float)iy;
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]
假設 原始 寬高為5 , 放大2倍後 newW=10 , newH =10,
當 i 與 j 等於 newW-1 , newH-1時 , ix = 4 , iy=4
此時 執時此行 nclr2 = GetRValue(Bmp->Canvas->Pixels[ix 1][iy]);
ix 1=5 照理說空間不就爆了, 最多只到Bmp->Canvas->Pixels[4][4] (5*5影像) ... 但我執行卻不會出錯
只是放大後的圖在最右邊和最下面兩行的像素值不知讀到哪裡的值 , 會出現其他像素值
我很好奇為什麼空間不會爆呢??
謝謝解答
------
恩...
kobebryant81
一般會員


發表:15
回覆:15
積分:6
註冊:2007-05-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-01-13 21:04:54 IP:122.124.xxx.xxx 訂閱
謝謝您的回應~~
系統時間:2024-04-26 23:27:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!