讀取圖檔資料失敗~ |
尚未結案
|
metals258
一般會員 發表:1 回覆:2 積分:0 註冊:2007-10-21 發送簡訊給我 |
我使用getc去讀取BMP檔內的RBG資料
從位置36H開始讀取 但是發現只要記憶體中有出現"1A"這個資料 會導致後面讀的資料全部變成-1 另外我的irr[200][200] igg ibb 這三個矩陣 想設成大一點 不過超過300時會出現stack overflow問題 這個程式要怎麼改才能解決呢? 謝謝 [code cpp] #include #include #include #include <math.h><br />#include FILE *fpi, *fper; void main() { char strtmp[10]; int i,j,wide,line,size,tmp3,tmp1,tmp2,linem=0,widem=0; int ibb[200][200],igg[200][200],irr[200][200]; //for(q=0;q<5,q ) for(i=0;i<200;i ) for(j=0;j<200;j ) {ibb[i][j]=0;igg[i][j]=0;irr[i][j]=0;} //strcpy(current_file_name,"matrixA_720-480.bmp"); //strcpy(output_file_name,"matrixA_720-480.ppm"); fpi = fopen ("matrixA_720-480.bmp", "r"); fper = fopen ("matrixA_720-480.ppm", "w"); for(i=0;i<50;i ) { if(i==18) { tmp1=' ';tmp2=' ',tmp3=' '; fscanf(fpi,"%c",&tmp1); fscanf(fpi,"%c",&tmp2); tmp3 = tmp2 << 8 ; tmp3 |= tmp1; wide=int(tmp3); //圖寬 } if(i==20) { tmp1=' ';tmp2=' ';tmp3=' '; fscanf(fpi,"%c",&tmp1); fscanf(fpi,"%c",&tmp2); tmp3 = tmp2 << 8 ; tmp3 |= tmp1; line=int(tmp3); //圖長 printf("%d ,%d\n",wide,line); } fscanf(fpi,"%c",strtmp); } size=wide*line; //圖大小 fprintf(fper,"P3\n"); fprintf(fper,"%d %d\n",wide,line); fprintf(fper,"255\n"); // if(line>=180)linem=180; // else linem=line; // if(wide>=180)widem=180; // else widem=wide; // while(widem>0||linem>0) // { for(i=0;i for (j=0;j //fscanf(fpi,"%c %c %c",&ibb[i][j],&igg[i][j],&irr[i][j]);//取BMP RGB值 ibb[i][j]=getc(fpi); igg[i][j]=getc(fpi); irr[i][j]=getc(fpi); } fscanf(fpi,"%c %c",&tmp1,&tmp2); } for(i--;i>=0;i--) for (j=0;j fprintf(fper,"= = = ",irr[i][j],igg[i][j],ibb[i][j]); //存PPM RGB值 } // if(line<0 && wide>0)line =180; // if(wide<0 && line>0)wide =180; // if(line>=180)linem=180; // else linem=line; // if(wide>=180)widem=180; // else widem=wide; // } fclose(fpi); fclose(fper); } [/code] |
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
(1)圖檔中長寬值各佔一個 int (4 bytes)
(2)irr, igg, ibb最好根據所得到的圖檔長寬值, 動態配置 (3)r, g, b單一顏色, 每個值只需 1 byte, 用int造成浪費 個人建議, 僅供參考............^_^ [code cpp] void __fastcall TForm1::Button1Click(TObject *Sender) { FILE *fh; int w, h; int ibb[200][200],igg[200][200],irr[200][200]; memset(&ibb,0,sizeof(ibb)); memset(&igg,0,sizeof(igg)); memset(&irr,0,sizeof(irr)); if((fh=fopen("TEST.BMP","r"))!=NULL){ fseek(fh,18,0); fread(&w,sizeof(w),1,fh); ////// fseek(fh,22,0); fread(&h,sizeof(h),1,fh); Label1->Caption = IntToStr(w); Label2->Caption = IntToStr(h); fclose(fh); } } [/code]
編輯記錄
jow 重新編輯於 2007-10-23 23:14:52, 註解 無‧
|
metals258
一般會員 發表:1 回覆:2 積分:0 註冊:2007-10-21 發送簡訊給我 |
我照著大大的大概意思
縮減了很多程式碼了 讀取方式也改用絕對位置做隨機存取 由後面開始一次讀RBG寫GBR方式 但是很奇怪的事 小圖可以 但換成大圖後 會變成很奇怪的圖案 甚至有些圖顏色會被拉的很長很長 不知道是哪邊還有錯誤 像這張圖 讀出來轉成ppm檔就會有錯誤 http://metals753.myweb.hinet.net/test.bmp [code cpp] #include #include void main() { FILE *fh,*fper; int w, h,i,j,n; int all=0; int tmp[3]; for(i=0;i<=2;i ) tmp[i]=0; fper = fopen ("testopen.ppm", "w"); if((fh=fopen("TEST.BMP","r"))!=NULL) { fseek(fh,18,0); fread(&w,sizeof(w),1,fh); //w ////// fseek(fh,22,0); fread(&h,sizeof(h),1,fh); printf("%dx%d\n",w,h); fprintf(fper,"P3\n"); fprintf(fper,"%d %d\n",w,h); fprintf(fper,"255\n"); all=w*h*3 h*2 54; for(n=1;n<=h;n ) { fseek(fh,all-w*3-2,0); for(i=0;i for(j=0;j<=2;j ) { fread(&tmp[j],1,1,fh); } fprintf(fper,"= = = ",tmp[2],tmp[1],tmp[0]); //印出RBG } all=w*h*3 h*2 54-(w*3 2)*n; } fclose(fh); fclose(fper); } }[/code] |
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
|
metals258
一般會員 發表:1 回覆:2 積分:0 註冊:2007-10-21 發送簡訊給我 |
===================引 用 暗黑破壞神 文 章=================== 你用這種宣告方式。會用 stack. 你改用 new, malloc 配置動態的,就可以避開這個問題了。 不然你也可以去改 project 的設定。把 stack 開大一點。 這個就要自己找一下了。 ===================引 用 metals258 文 章=================== 另外我的irr[200][200] igg ibb 這三個矩陣 想設成大一點 不過超過300時會出現stack overflow問題 我已經換另外一種寫法了(3樓) 不需要用到大的矩陣 但是不知道問題在哪 讀出來的圖檔 顏色會被拉長 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |