English Deutsch Français Italiano Español Português 繁體中文 Bahasa Indonesia Tiếng Việt ภาษาไทย
所有分類

我想要用C語言寫一個能讀bmp檔並去檔頭轉存為raw檔的程式,很急用請高手幫幫忙。或有人先教我或提供我一個能大量批次轉換bmp->raw的方法,我試過photoshop但都無法順利轉檔成功(一張轉檔ok但批次轉就有問題),希望能越詳細回答越好,拜託幫幫忙。11/20前要,贈送20點。

2006-11-18 00:14:12 · 1 個解答 · 發問者 阿祥仔 1 in 電腦與網際網路 程式設計

FOR Jacob Lee
你說的bmp是指讀bmp檔的程式ㄇ??那能幫我註解程式中哪些是檔頭哪些是資料部份ㄇ??(盡量詳細)

你說有lib不用寫??不大懂能解釋一下ㄇ?,謝謝、感激

2006-11-18 10:19:53 · update #1

FOR Jacob Lee
我最主要目地是要對圖片資料做處理,我的圖是640*480的灰階bmp圖檔,我必須知道圖檔的起始位置跟相關資料,麻煩你幫忙囉!!

2006-11-18 20:31:56 · update #2

FOR Jacob Lee
我執行會有error,請問是甚麼問題還有那我要真正對圖片資料處理時我資料的起始點要怎麼取得ㄚ??
還是能請你寄檔給我連妳能執行的灰階圖讓我測試一下ㄇ??我信箱:loranse1018@hotmail.com
真是感激不盡

2006-11-19 04:40:28 · update #3

readbmp.c
d:\program files\microsoft visual studio\myprojects\readbmp\readbmp.c(40) : warning C4018: '!=' : signed/unsigned mismatch

2006-11-19 04:40:58 · update #4

Linking...
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/readbmp.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

readbmp.exe - 2 error(s), 1 warning(s)

2006-11-19 04:41:05 · update #5

它說有錯是這行 if (fread(tmp_buf, 1, (size_t)hed[8]-1, f) != hed[8]-1) // read error?

2006-11-19 04:42:02 · update #6

我很努力想把你說的東西結合在一起但不知道是我弄錯就是有問題(我寫主程式把妳昨天回答那個int read_bmp(char *filename, unsigned char ***bmp, int *height, int *width)用呼叫fun的方式還是我誤會了ㄇ??)

2006-11-19 20:20:17 · update #7

那能請幫我把妳說的東西結合主程式部份只要幫我秀出buf[i][j](data)出來就好。拜託你了...弄了好幾小時還是不行..快哭出來ㄌ..>"<

2006-11-19 20:23:45 · update #8

1 個解答

raw 檔的規格我不知道
我知道 BMP 的,且有寫好的。
你要嗎?
不過我知道有 Graphic 的 Lib可以用,不用寫!
你要哪個?

2006-11-18 21:30:56 補充:
Graphic Library
只要 #include,給它你要的東東,它就幫你做了。如:(說明用的,不太正確)
*read_bmp(filename, &width, &height, &colorDepth, &bmpSize);
傳回 圖型陣列 的指標、圖寬、圖高、色度、圖型陣列的大小

我寫的讀 BMP 的只完成了讀黑白、256色和某色(忘了,要查一下)三種色的部份。
超過這三種色度,還沒完成。

2006-11-19 06:54:52 補充:
#include #include int read_bmp(char *filename, unsigned char ***bmp, int *height, int *width){    long *hed;    int i, j, k, w; unsigned char head[1079], l, mod, *tmp_buf;    FILE *f; hed = (long *) &head[2]; if ((f = fopen(filename, "rb"))  == NULL)  return 1; if (fread(head, 1, 54, f) != 54)  return 2; if (head[0] != 'B' || head[1] != 'M')          // BMP head  return 3; fseek(f, 0, SEEK_END); if (ftell(f) - hed[0])  return 4;        // file size != internal record mod = head[28];                // bit / pixel if (mod != 1 && mod != 8)  return 5;               // 不是 黑白 或 灰階 if (head[30])  return 6;               // 不會讀壓縮的 BMP *width  = hed[4],    *height = hed[5]; if ((tmp_buf = (unsigned char *) malloc(hed[8])) == NULL)  return 7;               // Not enough Memory if ( !(*bmp  = (unsigned char **)malloc(*height *sizeof(**bmp))))  return 8;               // Not enough Memory if ( (**bmp = (unsigned char *) malloc(*width * *height + 7))  == NULL)  return 9;               // Not enough Memory fseek(f, hed[2], SEEK_SET);          // to bmp data start if (fread(tmp_buf, 1, (size_t)hed[8]-1, f) != hed[8]-1)   // read error?  return 10;              // 讀檔有問題 for (w=i=0; i<*height; i++, w+=*width)   // Calculate index for speedup  (*bmp)[i] = &(**bmp)[w]; if (mod == 1) { w = (int) ( ((*width-1) >> 5) +1 ) << 2;  for (i=(int)(*height-1); i>=0; i--)  { for (j=0; j<*width-7; j+=8)   { l = tmp_buf[i*w + (j>>3)];    for (k=0; k<8; k++)    { (**bmp)[(*height-i-1)**width + j + k] = l & 128 ? 0 : 255;     l <<= 1;   } }   l = tmp_buf[i*w + (j>>3)];   for (k=0; k<(*width&7); k++)   { (**bmp)[(*height-i-1)**width + j + k] = l & 128 ? 0 : 255;    l <<= 1; } } } else if (mod == 8) { w = (int) (((*width-1)>>2) +1) << 2;  for (i=(int)(*height-1); i>=0; i--)  { k = *height - i -1;   for (j=0; j<*width; j++)    (*bmp)[k][j] = tmp_buf[i*w + j]; } } free(tmp_buf); if (fclose(f))     return 11; // 不能閉檔 return 0;                     // 成功}errhnd(); 是我用來處理錯誤的東東。你要自己寫。灰階的讀得進來。filename: 檔名bmp: 你宣告一個 unsigned char **xxx, 呼叫時, 用 &xxxint h, w; 傳回 BMP 檔的高、寬。像這樣用就可以了 read_bmp("asdf", &xxx, &h, &w);傳回 0 表示讀檔成功。程式確定能跑,但我改了錯誤處理,加上說明,希望沒改壞你試試。若你說的 raw 只是要圖檔陣列,寫出 你的 xxx 就可以了有問題再問。 ^_^ 加油!

2006-11-19 10:37:18 補充:
你要自己加個主程式啊!! 大致像下面那樣:
int main()
{int i, j, h, w;
unsigned char **buf;

i = read_bmp("檔名", &buf, &h, &w);
if (i) return i; // 有問題

for (i=0; i for (j=0; j { // buf[i][j] 就是一個一個由上而下、由左而右的圖點內容。
// 尤其你的是灰階,最簡單,一個byte 就是一個點。
}
return 0;
}

2006-11-19 10:37:33 補充:
compiler 要是對 if (fread(... 那列有意見,不讓你跑,
在那列的 tmp_buf前加上 (void *) 就好了。

至於 signed/unsigned mismatch ,你要告訴我是哪一列。
但那應該只是 警告,不是錯誤。

2006-11-19 10:50:05 補充:
想幫你把 raw 寫好了都不行:
1. 真的沒空。
2. 這是重點:剛查了一下:raw 沒有統一的規格!!
  所以,你要知道你用的 raw 是哪一家的規格!!

2006-11-19 11:32:45 補充:
忘了告訴你,在我示範的 main 裡也忘了寫!

用完了 buf,要把它 free 掉!!!!
free 的方式和〝順序〞如下:
free(*buf); free(buf);

你若不 free,多開幾個大圖後就會...

2006-11-20 15:19:31 補充:
intmain(int argc, char **argv)
{ int i, j, h, w;
unsigned char **bmp;

if (argc != 2) return 1;
read_bmp(argv[1], &bmp, &h, &w);

printf("%s, size: (%d,%d)\n", argv[1], h, w);

2006-11-20 15:21:51 補充:
for (i=0; i { for (j=0; j printf("%03d ", bmp[i][j]);
printf("\n");
}

free(*bmp); free(bmp);

return0;
}

上面那個 intmain int main 才對

這個 main 改自我今年 5/12 幫人寫的程式,他要的是 RGB ,你的是灰階,應該沒改壞才對。

用法:
命令 BMP檔名

2006-11-20 15:22:24 補充:
上面那個 intmain 是 int main 才對!

2006-11-19 01:54:52 · answer #1 · answered by ? 7 · 0 0

fedest.com, questions and answers