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

被指標搞混了, 請幫幫忙!

尚未結案
tracychen
一般會員


發表:7
回覆:9
積分:3
註冊:2003-08-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-09-18 17:27:21 IP:211.21.xxx.xxx 未訂閱
請問各位大大:    我在一個Form上加了一個可以load *.tif檔的元件(EBW16Image1) 圖檔是順利load進來了 但我想要讀取影像上每個像素的值並存成.txt檔的部分 卻一直有問題 function   GetPixel: void(long, long, long*) GetPixel(i,j,紀錄像素(i,j)值的陣列的指標)-->應該是這麼說吧!?    不知道是哪裡搞混了? 程式跑的N久的  當在那裡 請各位大大幫忙!    程式如下:    void __fastcall TForm1::btnOpenClick(TObject *Sender) {            if (OpenDialog1->Execute())         {                 EBW16Image1->Load((WideString)(OpenDialog1->FileName.c_str()));         }         else         {                 ShowMessage("Cannot open the file!");                 return;         }            w = EBW16Image1->ImageWidth;         h = EBW16Image1->ImageHeight;            long *data = (long*)malloc(sizeof(long)*w*h);         for (int i = 0; i < w*h; i++)                 data[i] = 0;            for (int j = 0; j < h; j++ )         {                 for (int i = 0; i < w; i++)                 {                         EBW16Image1->GetPixel(i,j,&data[j*w+i]);                 }         }            FILE *out;         out = fopen("D:\test.txt","w+");         for (int i = 0; i < w*h; i++)                 fprintf(out, "   %d", data[i]);         fclose(out);            free(data); }
tracychen
一般會員


發表:7
回覆:9
積分:3
註冊:2003-08-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-09-18 18:09:11 IP:211.21.xxx.xxx 未訂閱
不好意思 路徑設錯了 應該是 FILE *out; out = fopen("D:\\test.txt","w "); 可以執行了 但跑得實在是太久了(好幾分鐘!) 不知道哪裡有問題?
JerryKuo
版主


發表:42
回覆:571
積分:322
註冊:2003-03-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-09-18 18:14:30 IP:61.230.xxx.xxx 未訂閱
你好:    不知道這是不是bug?
fprintf(out, " %ld", data[i]);
還有GetPixel()好像需要蠻久時間的
tracychen
一般會員


發表:7
回覆:9
積分:3
註冊:2003-08-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-09-18 18:49:29 IP:211.21.xxx.xxx 未訂閱
謝謝JerryKuo的回應! 我把輸出格式換成"%ld"結果與"%d"一樣 應該不是bug run的時間實在好久喔! 而且我load的資料是從CCD camera所擷取的10 bits format data 照理說值的範圍應該是從0~1023 但我所寫出的.txt檔中的數值竟高達10000~20000 真不曉得哪裡有問題? 請各位大大幫幫頭大的我!
JerryKuo
版主


發表:42
回覆:571
積分:322
註冊:2003-03-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-09-18 19:18:48 IP:61.230.xxx.xxx 未訂閱
引言: 謝謝JerryKuo的回應! 我把輸出格式換成"%ld"結果與"%d"一樣 應該不是bug run的時間實在好久喔! 而且我load的資料是從CCD camera所擷取的10 bits format data 照理說值的範圍應該是從0~1023 但我所寫出的.txt檔中的數值竟高達10000~20000 真不曉得哪裡有問題? 請各位大大幫幫頭大的我!
還是你把data的資料型態換成整數看看
Royce520
高階會員


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-09-18 23:22:01 IP:61.230.xxx.xxx 未訂閱
tracychen 你好,   我想你會這段程式碼基本上沒有什麼錯   會花很多時間 是因為有幾個原因:    (1) 你要看 *.tif 檔案的大小 通常是十幾二十 MB 的檔案...     所以 檔案全部讀入 就要花不少時間    (2) 要看圖檔的長度與寬度... 如果是 1xxx * 1xxx 的大小,     算算就知道要多少次動作; 因此, GetPixel(...) 這個函數     會被叫用很多次....他很花時間的    (3) 10 bit 理論值是在 0 ~ 1023, 不過資料通常是儲存在依個 WORD     中, 所以他會做一個處理... 那就是 wData << 6 .... 這樣資料     數值就變大了.... 也因此... 你也不需要宣告 long 來存取資料     一般用 WORD 就夠了.... 當然 要看你的 tif 格式囉    *真實的事物最美, 簡單的道理最好, 我能體會的 太少* 發表人 - royce520 於 2003/09/18 23:23:28
------
不要忘記呼吸,不要忘記編程! ∩__∩
tracychen
一般會員


發表:7
回覆:9
積分:3
註冊:2003-08-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-09-19 10:53:45 IP:211.21.xxx.xxx 未訂閱
謝謝Royce520的回應 我將輸出格式改成以下 for (int i = 0; i < w*h; i ) fprintf(out, " %d", data[i]>>6); 輸出的值就對了! 真是太感謝你的解答!^_^ 但GetPixel()實在是太花時間了 我的影像大小是1388*1040 而且我一次可能要處理上百張影像資料 所以用目前這要方式做似乎不太可行 請問還有其他的方式嗎?
tracychen
一般會員


發表:7
回覆:9
積分:3
註冊:2003-08-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-09-19 15:53:47 IP:211.21.xxx.xxx 未訂閱
謝謝各位大大的回應! 我的問題已順利解決了! 我不使用GetPixel() 而改用另一個function :GetImagePointer()來得到每個像素的指標 而且效率改善很多    謝謝各位大大的幫助!    程式如下:    if (OpenDialog1->Execute())         {                 EBW16Image1->Load((WideString)(OpenDialog1->FileName.c_str()));         }         else         {                 ShowMessage("Cannot open the file!");                 return;         }            w = EBW16Image1->ImageWidth;         h = EBW16Image1->ImageHeight;            vector data; data.resize(w*h); for (int i = 0; i < w*h; i ) data[i] = 0; for (int j = 0; j < h; j ) { unsigned short *ptr = (unsigned short*)EBW16Image1->GetImagePointer(0,j); for (int i = 0; i < w; i ) data[j*w i] = (ptr[i]>>6); } FILE *out; out = fopen("D:\\test.txt","w "); for (int i = 0; i < w*h; i ) fprintf(out, " %d", data[i]); fclose(out); int Max = (data[0]); int Min = (data[0]); for (int i = 0; i < w*h; i ) { if ((data[i]) > Max) Max = data[i]; if ((data[i]) < Min) Min = data[i]; } Label1->Caption = Max; Label2->Caption = Min; Image1->Picture->Bitmap->Width = w; Image1->Picture->Bitmap->Height = h; for (int j = 0; j < h; j ) { Byte *ptr = (Byte*)Image1->Picture->Bitmap->ScanLine[j]; for (int i = 0; i < w; i ) ptr[i] = 255*((data[j*w i])-Min)/(Max-Min); } String filename = "D:\\test.bmp"; Image1->Picture->SaveToFile(filename);
系統時間:2024-06-26 23:32:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!