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

讀取圖檔資料失敗~

尚未結案
metals258
一般會員


發表:1
回覆:2
積分:0
註冊:2007-10-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-10-21 20:38:22 IP:218.167.xxx.xxx 訂閱
我使用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]
編輯記錄
metals258 重新編輯於 2007-10-21 20:40:05, 註解 無‧
metals258 重新編輯於 2007-10-21 20:41:38, 註解 無‧
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-10-22 08:26:41 IP:123.193.xxx.xxx 訂閱
(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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-10-27 14:35:24 IP:218.167.xxx.xxx 訂閱
我照著大大的大概意思
縮減了很多程式碼了
讀取方式也改用絕對位置做隨機存取
由後面開始一次讀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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-10-27 15:20:45 IP:211.77.xxx.xxx 未訂閱
你用這種宣告方式。會用 stack.
你改用 new, malloc 配置動態的,就可以避開這個問題了。
不然你也可以去改 project 的設定。把 stack 開大一點。
這個就要自己找一下了。
===================引 用 metals258 文 章===================
另外我的irr[200][200] igg ibb 這三個矩陣 想設成大一點
不過超過300時會出現stack overflow問題

metals258
一般會員


發表:1
回覆:2
積分:0
註冊:2007-10-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-10-27 16:40:53 IP:218.167.xxx.xxx 訂閱

===================引 用 暗黑破壞神 文 章===================
你用這種宣告方式。會用 stack.
你改用 new, malloc 配置動態的,就可以避開這個問題了。
不然你也可以去改 project 的設定。把 stack 開大一點。
這個就要自己找一下了。
===================引 用 metals258 文 章===================
另外我的irr[200][200] igg ibb 這三個矩陣 想設成大一點
不過超過300時會出現stack overflow問題

我已經換另外一種寫法了(3樓)
不需要用到大的矩陣
但是不知道問題在哪
讀出來的圖檔
顏色會被拉長

系統時間:2024-05-05 14:15:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!