全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1105
推到 Plurk!
推到 Facebook!

我要將Byte指標轉成int指標,但結果不對

尚未結案
vittel
一般會員


發表:13
回覆:14
積分:5
註冊:2003-09-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-09-26 23:32:48 IP:140.114.xxx.xxx 未訂閱
新手發問,若有不盡理想之處,請各位多多包涵..    我的程式是要從256色灰階圖檔中,選取一區域,存進一陣列..
//因為原本的程式有點私人的問題,所以我還是不便將全部程式貼上
//問題只是在指標轉換過去有問題而已,所以應該不需要全部的程式
//x,y為選取區域的起點座標,m為x方向長度,n為y方向長度
Graphics::TBitmap *tempbitmap;
tempbitmap= Image1->Picture->Bitmap;  //假設已經讀取一張圖了
int** ImagePointer_Pointer0;          
//因為這裡是別人的要求,我只能用int陣列
ImagePointer_Pointer0 = new int*[n];
*ImagePointer_Pointer0 = new int[m];
Byte *ptr;
for(int index=0;indexScanLine[y index];
    ImagePointer_Pointer0[index]=(((int*)ptr) x); 
}
//到這裡應該就可以把選取的區域都存進陣列裡了,
//但是下面用迴圈取出這個區域第一列的值,用指標取的值很怪,
//只會一直遞加,從陣列讀出來的值變好大..    ptr=(Byte*)tempbitmap->ScanLine[y];
for(int j=0; jLines->Append(IntToStr(*((int*)ptr) x j));
    Memo1->Lines->Append(IntToStr(ImagePointer_Pointer0[0][j]));
}
我已經想好久實在想不到該怎麼辦,難道只能把陣列改成Byte**嗎.. 煩請各位大大幫我解答..
RaynorPao
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-09-27 00:14:21 IP:61.221.xxx.xxx 未訂閱
引言: 新手發問,若有不盡理想之處,請各位多多包涵.. 我的程式是要從256色灰階圖檔中,選取一區域,存進一陣列..
//因為原本的程式有點私人的問題,所以我還是不便將全部程式貼上
//問題只是在指標轉換過去有問題而已,所以應該不需要全部的程式
//x,y為選取區域的起點座標,m為x方向長度,n為y方向長度
Graphics::TBitmap *tempbitmap;
tempbitmap= Image1->Picture->Bitmap;  //假設已經讀取一張圖了
int** ImagePointer_Pointer0;          
//因為這裡是別人的要求,我只能用int陣列
ImagePointer_Pointer0 = new int*[n];
*ImagePointer_Pointer0 = new int[m];
Byte *ptr;
for(int index=0;indexScanLine[y index];
    ImagePointer_Pointer0[index]=(((int*)ptr) x); 
}
//到這裡應該就可以把選取的區域都存進陣列裡了,
//但是下面用迴圈取出這個區域第一列的值,用指標取的值很怪,
//只會一直遞加,從陣列讀出來的值變好大..    ptr=(Byte*)tempbitmap->ScanLine[y];
for(int j=0; j
//    Memo1->Lines->Append(IntToStr(*((int*)ptr) x j));
    Memo1->Lines->Append(IntToStr((int)*(ptr x j)));
    Memo1->Lines->Append(IntToStr(ImagePointer_Pointer0[0][j]));
}
我已經想好久實在想不到該怎麼辦,難道只能把陣列改成Byte**嗎.. 煩請各位大大幫我解答..
vittel 你好: 試試看以上這樣子寫可不可以呢?? --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
Royce520
高階會員


發表:18
回覆:157
積分:100
註冊:2002-09-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-09-27 04:00:05 IP:61.230.xxx.xxx 未訂閱
vittel 你好,
  個人的觀點 ... 你po的這段程式有幾個問題,
(1)
ImagePointer_Pointer0 = new int*[n];
*ImagePointer_Pointer0 = new int[m]; // 這裡配置記憶體是
// 在什麼地方要用的呢
Byte *ptr;
for(int index=0;indexScanLine[y index];
    ImagePointer_Pointer0[index]=(((int*)ptr) x); // 如果
// index 為 0, 哪麼 上面紅色那段配置 是不是不見了呢 
}    (2)
假設不考慮上面的問題, 哪麼你的 bitmap 的 pixel format 是什麼呢
Byte *ptr;
for(int index=0;indexScanLine[y index];
    ImagePointer_Pointer0[index]=(((int*)ptr) x);
// 假設是 pf24bit, 哪是代表像素是三個byte為一單位... 不過上面
// 這段程式碼 將他轉成int* 後再加上 x, 哪麼是不是就取到不正確
// 的資料呢...所以該是 =(int*)(ptr 3*x) 吧 
}    (>>>>>>>>>>> >
>    發表人 - 
        
------
不要忘記呼吸,不要忘記編程! ∩__∩
vittel
一般會員


發表:13
回覆:14
積分:5
註冊:2003-09-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-09-27 16:15:22 IP:210.66.xxx.xxx 未訂閱
vittel 你好,   個人的觀點 ... 你po的這段程式有幾個問題, (1) ImagePointer_Pointer0 = new int*[n]; *ImagePointer_Pointer0 = new int[m]; // 這裡配置記憶體是 // 在什麼地方要用的呢 //這裡我要配置記憶體給陣列ㄚ..這是學長這麼寫的..我想像這樣的話.. //ImagePointer_Pointer0 = new int[n][m];應該就可以了吧.. Byte *ptr; for(int index=0;indexScanLine[y index]; ImagePointer_Pointer0[index]=(((int*)ptr) x); // 如果 // index 為 0, 哪麼 上面紅色那段配置 是不是不見了呢 //嗯..這裡我就不太懂您的意思.. //我這行的意思就是把選取區域每行第一個位置的位址指給陣列的每行 //ImagePointer_Pointer0[index] index從0到n-1不就是每行第一個元素的位 //址 } (2) 假設不考慮上面的問題, 哪麼你的 bitmap 的 pixel format 是什麼呢 是pf8bit Byte *ptr; for(int index=0;indexScanLine[y index]; ImagePointer_Pointer0[index]=(((int*)ptr) x); // 假設是 pf24bit, 哪是代表像素是三個byte為一單位... 不過上面 // 這段程式碼 將他轉成int* 後再加上 x, 哪麼是不是就取到不正確 // 的資料呢...所以該是 =(int*)(ptr 3*x) 吧 } (3) 就如 包大人 說的, 有哪個錯誤 ptr=(Byte*)tempbitmap->ScanLine[y]; for(int j=0; jLines->Append(IntToStr(*((int*)ptr) x j)); Memo1->Lines->Append(IntToStr(ImagePointer_Pointer0[0][j])); } 所以 我想程式碼 可以參考這樣: Byte *ptr; for(int index=0;indexScanLine[y index]; ImagePointer_Pointer0[index]=(int*)(ptr 3*x); // 假設是 pf24bit } ... ptr=(Byte*)tempbitmap->ScanLine[y]; for(int j=0; jLines->Append(IntToStr(0x00FFFFFF & *((int*)(ptr 3*(x j))); //Memo1->Lines->Append(IntToStr(ImagePointer_Pointer0[0][j]));// 只是這樣寫是不行的 } 從以上的說明中 你應該可以了解 用 int 是一個不合用的方式... 你還是應該用 byte 的... byte** ImagePointer_Pointer0; ImagePointer_Pointer0 = new byte*[n]; 只要宣告這樣就可以了ㄚ..?好神奇.. 但是我的圖檔是8bit灰階的,所以我不能x3 這個陣列的值不管怎麼樣就是不對..沒辦法了..只能改成Byte**了 謝謝兩位不吝指教..謝謝..
Royce520
高階會員


發表:18
回覆:157
積分:100
註冊:2002-09-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-09-27 20:18:19 IP:61.230.xxx.xxx 未訂閱
vittel 你好,   如果你的 圖形個是 pf8bit 的話呢, 可以參考這樣寫    Graphics::TBitmap *tempbitmap; tempbitmap= Image1->Picture->Bitmap; Byte** ImagePointer_Pointer0;           ImagePointer_Pointer0 = new Byte*[n]; Byte *ptr; for(int index=0;indexScanLine[y index]; ImagePointer_Pointer0[index]=ptr x; } ... for(int j=0; jLines->Append(IntToStr(ImagePointer_Pointer0[y_pos][j])); } *真實的事物最美, 簡單的道理最好, 我能體會的 太少*
------
不要忘記呼吸,不要忘記編程! ∩__∩
系統時間:2024-06-26 10:48:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!