Re: [分享] BMP讀取與寫入
小程式用物件導向,殺雞用牛刀。
int SaveAsBMP(const char *filename, char *image, int xsize, int ysize)
{
unsigned char header[54] = {
0x42, 0x4d, 0, 0, 0, 0, 0, 0, 0, 0,
54, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 24, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0
};
long file_size;
#ifdef ALIGN_WITH_FOUR
file_size = (long)( ( (xsize * 3 + 3)/ 4 )* 4) * ysize;
#else
file_size = (long)( xsize * 3 ) * ysize;
#endif
file_size += 54;
header[2] = (unsigned char)(file_size &0x000000ff);
header[3] = (file_size >> 8) & 0x000000ff;
header[4] = (file_size >> 16) & 0x000000ff;
header[5] = (file_size >> 24) & 0x000000ff;
long width = xsize;
header[18] = width & 0x000000ff;
header[19] = (width >> 8) &0x000000ff;
header[20] = (width >> 16) &0x000000ff;
header[21] = (width >> 24) &0x000000ff;
long height = -ysize;
header[22] = height &0x000000ff;
header[23] = (height >> 8) &0x000000ff;
header[24] = (height >> 16) &0x000000ff;
header[25] = (height >> 24) &0x000000ff;
char fname_bmp[128];
sprintf(fname_bmp, "%s", filename);
FILE *fp;
if (!(fp = fopen(fname_bmp, "wb")))
return -1;
fwrite(header, sizeof(unsigned char), 54, fp);
fwrite(image, sizeof(unsigned char), file_size, fp);
fclose(fp);
return 0;
}/*SaveAsBMP*/
完事。
頭的部份請參考 http://crazycat1130.pixnet.net/blog/post/1345538
※ 引述《erspicu (.)》之銘言:
: bmp讀取 (支援32bits,24its,8bit&4bit&1bit index colors)
: http://codepad.org/lQUOLnps
: bmp寫入 (寫出24bits格式的bmp檔)
: http://codepad.org/nzivNDp6
: 使用範例....
: http://codepad.org/jML46KFu
: bmp格式應該是所有影像檔中格式最單純的...
: 不過看到一些人好像為了bmp格式的讀取與寫入有些苦手
: 所以分享了我自己私人性質用的程式碼
: 其實很多程式已經有lib可以讀取bmp檔了
: 不過感覺支援的類型都不是很完整
: 所以乾脆自己看看文件重寫
: 自己寫的自己也最清楚怎麼用
: 話說bmp真的是非常單純的儲存格式
: 像是數位相機的raw data儲存格式
: 以adobe的DNG檔來說
: 複雜程度大概是bmp的n倍吧
: 光是那個表頭的資訊欄位就看了頭昏眼花了..
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.120.158.204
→
04/07 17:52, , 1F
04/07 17:52, 1F
推
04/07 19:14, , 2F
04/07 19:14, 2F
推
04/07 20:03, , 3F
04/07 20:03, 3F
他講的對齊是指bmp圖檔,橫方向的色塊數要是四的倍數
在windows還有 linux下有這對齊的要求。
嵌入式則不一定。 ( 德儀的 8051就沒)
好比 寬1024,3色 -> 是四的倍數
1366,3色-> 直接 1366*3為4098,要對齊為 4100。
我原本的代碼已做這修正(#ifdef ALIGN_WITH_FOUR)。
※ 編輯: DrStein 來自: 59.120.158.204 (04/07 20:53)
推
04/07 20:55, , 4F
04/07 20:55, 4F
→
04/07 20:56, , 5F
04/07 20:56, 5F
→
04/07 20:58, , 6F
04/07 20:58, 6F
推
04/07 22:08, , 7F
04/07 22:08, 7F
討論串 (同標題文章)