Re: [分享] BMP讀取與寫入

看板C_and_CPP作者 (啤酒肚)時間13年前 (2011/04/07 17:41), 編輯推噓4(403)
留言7則, 5人參與, 最新討論串2/2 (看更多)
小程式用物件導向,殺雞用牛刀。 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
原po有處理不同depth之圖檔 自然會比較複雜
04/07 17:52, 1F

04/07 19:14, , 2F
我可以吐槽可讀性零分 + 沒處理對齊嗎 XDD
04/07 19:14, 2F

04/07 20:03, , 3F
這蠻有可讀性+有效率 排版就別太過於要求了 BBS嘛
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
記得不同bpp下的對齊數好像不同說@_@"
04/07 20:55, 4F

04/07 20:56, , 5F
是不同 不過windows/linux/mac都是四
04/07 20:56, 5F

04/07 20:58, , 6F
不同bpp(8, 16, 24, 32)都一樣是四,該這樣才完整。
04/07 20:58, 6F

04/07 22:08, , 7F
抱歉好像是小弟自己記錯了喵....Orz
04/07 22:08, 7F
文章代碼(AID): #1DdORC7- (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1DdORC7- (C_and_CPP)