由於工作需要,研究了一下點陣圖的檔案格式。發現網路上的資料大多不夠齊全,或者範例太含糊。我將所有找到的資料消化/整理/翻譯之後如下,希望對需要的人有幫助:

*******************************************
《簡介》

點陣圖(bitmap)格式是 Windows 採用的圖像檔案儲存格式,在 Windows 環境下運行的所有圖像處理軟件都支持這種格式。Windows 3.0 以前的 BMP 格式與顯示設備有關,因此稱為設備相關點陣圖(Device-Dependent Bitmap, DDB)格式。Windows 3.0 以後的 BMP 格式則與顯示設備無關(Device-Independent Bitmap, DIB),目的是為了讓 Windows 能夠在任何類型的顯示設備上顯示點陣圖檔案。點陣圖檔案的預設副檔名是 BMP 或 bmp。

*******************************************
《點陣圖檔案結構》

點陣圖檔案由四個部份組成:
  1. Bitmap File Header
  2. Bitmap Info Header
  3. Color Table (Palette)
  4. Bitmap Array

Note: 以下欄位資料皆為 little-endian! Little-Endian 的意思是:若某個欄位值為 0x1234,當你將BMP檔案用 UltraEdit 之類的純文字編輯器打開時,則你看到的值會是 0x3412,這是 Intel 制定的儲存方式,把值小的位元組(0x34)存在前面;詳情可參考 Big Endian 和 Little Endian 架構的說明

  Shift Name Size
(bytes)
Content
Bitmap
File
Header
0000h Identifier (ID) 2 'BM'【註1】
0002h File Size 4 整個點陣圖檔案的大小(單位:byte)
0006h Reserved 4 保留欄位
000Ah Bitmap Data Offset 4 點陣圖資料開始之前的偏移量(單位:byte)
Bitmap
Info
Header
000Eh Bitmap Header Size 4 Bitmap Info Header 的長度【註2】
0012h Width 4 點陣圖的寬度,以像素(pixel)為單位
0016h Height 4 點陣圖的高度,以像素(pixel)為單位【註3】
001Ah Planes 2 點陣圖的位元圖層數【註4】
001Ch Bits Per Pixel 2 每個像素的位元數
1:單色點陣圖(使用 2 色調色盤)
4:4 位元點陣圖(使用 16 色調色盤)
8:8 位元點陣圖(使用 256 色調色盤)
16:16 位元高彩點陣圖(不一定使用調色盤)
24:24 位元全彩點陣圖(不使用調色盤)
32:32 位元全彩點陣圖(不一定使用調色盤)
【註5】
001Eh Compression 4 壓縮方式【註6】
0:未壓縮
1:RLE 8-bit/pixel
2:RLE 4-bit/pixel
3:Bitfields
0022h Bitmap Data Size 4 點陣圖資料的大小(單位:byte)【註7】
0026h H-Resolution 4 水平解析度(單位:像素/公尺)【註8】
002Ah V-Resolution 4 垂直解析度(單位:像素/公尺)
002Eh Used Colors 4 點陣圖使用的調色盤顏色數【註9】
0032h Important Colors 4 重要的顏色數【註10】
Palette 0036h Palette N*4 調色盤資料。
每個索引值指定一種顏色:0x00RRGGBB
其中最高位元組保留為零
Bitmap
Array
- Bitmap Data - 點陣圖資料【註11】

【註1】此欄原本有多種識別碼,用來識別點陣圖的類型:
    'BM' - Windows 3.1x, 95, NT, ...
    'BA' - OS/2 Bitmap Array
    'CI' - OS/2 Color Icon
    'CP' - OS/2 Color Pointer
    'IC' - OS/2 Icon
    'PT' - OS/2 Pointer
    不過既然 OS/2 並不普及,目前皆在 Windows 上作業,因此 ID 全都是 'BM'。

【註2】此欄原本有多種數值,依作業系統種類而定:
    28h - Windows 3.1x, 95, NT, ...
    0Ch - OS/2 1.x
    F0h - OS/2 2.x
    以目前 Windows 常用的點陣圖來說,此欄位數值通常是 28h。
    但因為微軟已經制定出了新的點陣圖格式,其中的 Bitmap Info Header 結構變化較大,長度加長,所以最好不要直接使用常數 28h,而是應該從實際檔案中讀取這個數值,才能確保程式相容性。

【註3】高度可能為負值,負值表示掃瞄方向由上而下。
    但若高度是負值時,此點陣圖將不能被壓縮!(也就是說 Compression 欄位總是為 0)

【註4】未知的功能...永遠被設為 1

【註5】16 及 32 位元點陣圖是否使用調色盤必須由 Compression 欄位的數值決定
    請參考 Bitfields 的解說。

【註6】點陣圖壓縮方式有以下四種:BI_RGBBI_RLE8BI_RLE4,以及BI_BITFIELDS

  1. None (BI_RGB)
    表示此點陣圖資料沒有壓縮,不使用調色盤。

  2. RLE 8bpp (BI_RLE8)
    每個像素為 8 bit 的 RLE 壓縮編碼(Run-Length Encoding)(總共可使用 256 色)。
    有「編碼模式」(Encoded Mode)和「絕對模式」(Absolute Mode)兩種方法,
    可在同一幅圖檔中的任何地方交錯使用。

    「編碼模式」:由兩個位元組(byte)組成。
           第一個位元組指定 "Length"(使用相同顏色的像素數目),
           第二個位元組指定 "Run"(此像素使用的調色盤索引)。
           若第一個位元組為零,則表示特殊意義:
           0x0000 - 表示此列結束
           0x0001 - 表示此點陣圖檔案結束
           0x0002 - 表示其後的兩位元組分別表示
                 下個像素位置與目前像素位置的水平/垂直偏移量。
           0x000x - 表示絕對模式。

    「絕對模式」:第一個位元組為 0x00,第二個位元組為 0x03 ~ 0xFF 之間的數值。
           其中第二個位元組表示後續資料的長度(單位為 byte),
           後續資料的每個位元組都表示單一像素的調色盤索引值。

    每一模式的編碼長度都必須與字邊界對齊(word-aligned),也就是 2 的倍數。
    使用「編碼模式」時,由於每組編碼皆為兩個位元組,所以毋需多加處理;
    但是使用「絕對模式」時,則必須在最後補上適當的 0x00 以使資料長度對齊 2 的倍數。

    下面是一個 BI_RLE8 的例子:

    03 01 05 02 00 03 00 01 02 00 02 01 00 02 05 01 02 03 00 00 09 02 00 01

    這些資料可解讀為:

    壓縮資料 解壓縮之後的資料
    03 01 01 01 01
    05 02 02 02 02 02 02
    00 03 00 01 02 00 00 01 02(最後的 00 是為了 word-aligned 才補上的)
    02 01 01 01
    00 02 05 01 從目前位置右移 5 像素之後,向下移一列
    02 03 03 03
    00 00 此列結束
    09 02 02 02 02 02 02 02 02 02 02
    00 01 此點陣圖結束

    上述資料的圖形如下:

  3. RLE 4bpp (BI_RLE4)
    每個像素為 4-bit 的 RLE 壓縮編碼(總共可使用 16 色)。
    同樣也有「編碼模式」與「絕對模式」,且可以在同一圖檔中任何地方使用任一模式。

    「編碼模式」:由兩個位元組組成。
           第一個位元組指定像素數目,
           第二個位元組包含兩個調色盤索引:
           第一個像素使用高 4 位元的索引值、
           第二個像素使用低 4 位元的索引值、
           第三個像素又使用高 4 位元的索引值,以此類推。
           若第一個位元組為零,則表示特殊意義:
           0x0000 - 表示此列結束
           0x0001 - 表示此點陣圖檔案結束
           0x0002 - 表示其後的兩位元組分別表示
                 下個像素位置與目前像素位置的水平/垂直偏移量。
           0x000x - 表示絕對模式。

    「絕對模式」:第一個位元組為 0x00,第二個位元組表示後續資料的長度(單位為 byte)。
           後續資料的每個位元組都含有兩個調色盤索引值(高 4 及低 4 位元),
           每個索引值對應一個像素。

    每一模式的編碼長度仍然必須與字邊界對齊(word-aligned)。
    使用「編碼模式」時,由於每組編碼皆為兩個位元組,所以毋需多加處理;
    但是使用「絕對模式」時,則必須在最後補上適當的 0 以使資料長度對齊 2 的倍數。

    下面是一個 BI_RLE4 的例子:

    03 11 05 02 00 05 01 23 10 00 02 22 00 02 05 01 02 13 00 00 09 10 00 01

    這些資料可解讀為:

    壓縮資料 解壓縮之後的資料
    03 11 1 1 1
    05 02 0 2 0 2 0
    00 05 01 23 10 00 0 1 2 3 1(最後的 0 00 是為了 word-aligned 才補上的)
    02 22 2 2
    00 02 05 01 從目前位置右移 5 像素之後,向下移一列
    02 13 1 3
    00 00 此列結束
    09 10 1 0 1 0 1 0 1 0 1
    00 01 此點陣圖結束

    上述資料的圖形如下:

  4. Bitfileds (BI_BITFIELDS)
    只有當「Bit Per Pixel」欄位的數值為 16 或 32 時,才會使用 BI_BITFIELDS 這種格式。
    使用 BI_BITFIELDS 時,點陣圖檔中原本的調色盤位置會被三個 DWORD 佔據,
    分別代表 R、G、B 三個顏色分量的遮罩(mask)。
    例如:
    1. Bit_Per_Pixel = 16, Compression = BI_RGB(無壓縮),
      則每個像素的 16 位元之中:
      最低 5 位元表示藍色分量,
      中間 5 位元表示綠色分量,
      接著的高 5 位元則是紅色分量,
      最高的 1 位元保留不使用。
      此格式即為 RGB555 格式。
    2. Bit_Per_Pixel = 16, Compression = BI_BITFIELDS,
      紅、綠、藍的 mask 分別為 0xF800, 0x07E0, 0x001F,
      則每個像素的 16 位元之中:
      最低 5 位元表示藍色分量,
      中間 6 位元表示綠色分量,
      最高 5 位元則是紅色分量,
      此格式即為 RGB565 格式。

【註7】若沒有壓縮(Compression 欄位為 0),則此欄數值可設為 0。
    (我發現許多繪圖軟體根本不看此欄數值,隨便填寫也無所謂,圖檔仍可正常開啟)

【註8】若要換算為 dpi,則將此欄數值要除以39.37(吋/公尺)
    例如,此欄數值若為 2834 (pixels per meter),
    則 2834 ÷ 39.37 = 72 (pixels per inch) = 72 dpi

【註9】此欄表示圖檔實際使用的顏色數目,若數值為 0,表示使用所有調色盤顏色。
    如果此欄數值並非「可用顏色的最大值」或者「零」,則需注意調色盤尺寸的計算。

    例如,在 4 bpp bitmap 中,調色盤預設尺寸應是 16*4 bytes,
    但若 Used Color 欄位數值並非 16 或 0,則調色盤尺寸應是 Used_Color_Number * 4 (bytes)。

【註10】當此欄的值等於「顏色數」或者為 0 時,表示所有顏色都一樣重要。

【註11】緊跟在調色盤之後的就是點陣圖資料陣列。
    每一掃描列的長度取決於圖檔的寬度及顏色深度(Color Depth),
    但是每一掃描列的長度必需是 4 byte 的倍數(DWORD-aligned)!
    正常的點陣圖掃描列是由底向上儲存的:
    陣列中的第一個 byte 表示全圖左下角的像素,而最後一個 byte 則表示全圖右上角的像素。
    但如果是正向掃描(Height 欄位為負值),則掃描方向則是由上而下。


整理 by chiapei@gmail.com



創作者介紹
創作者 瘋小貓 的頭像
瘋小貓

瘋小貓的華麗冒險

瘋小貓 發表在 痞客邦 留言(56) 人氣()


留言列表 (56)

發表留言
  • Skyer
  • 實在感謝啊
    這篇對我實在有用..

    終於搞定 16bit RGB565 了.
  • 很高興有人從此得到幫助
    祝你工作順利! :)

    瘋小貓 於 2007/05/10 13:02 回覆

  • FireHouse
  • 很棒的整理

    比我在其他網站看到的 BMP file format 解釋詳盡多了,
    借我收錄一下,感謝您的分享!
  • Thanks!!
  • 這資料真是酷斃了
    雖然花了很久才達到目標
    但是如果沒了這篇
    真的不知如何下手
    真是謝謝你啦^^
    正在嘗試SetDIBitsToDevice囧
  • hao
  • 感謝你的整理

    因為這篇完整的介紹
    才讓我順利解決影像處理的作業
    大感謝
  • jack
  • 很感謝站主分享這一份資料。真的對剛要介入這個作業的小弟我
    非常有幫助。

    不過,可否請問版大如果bitmap的深度只有1bit(黑白圖檔), 那麼讀取點陣圖陣列的方式會有所不同嗎?
  • 我不知道哩,你試試看囉~(用『小畫家』存一個單色 bmp 檔,然後用 UltraEdit 之類的編輯器打開來看看)

    瘋小貓 於 2008/01/29 23:47 回覆

  • usefun
  • digital transfer bmp

    想請問大大你知要怎麼把01digital 訊號寫成.bmp的file嗎?
  • 你連問題都問不好,我要怎麼回答呢?

    瘋小貓 於 2008/02/11 17:24 回覆

  • genest
  • 請問一個問題

    因為最近在研究bmp的東西.因此有緣拜訪這個網站,感謝大大的無私分享,讓我受益良多.可是我有一個小問題.就是我在小畫家開一個圖檔,然後存成24位元點陣圖檔(*.bmp),他的格式裡面就沒有Palette,如果用有palteet的方法去解會有問題.請問大大有關這一類型的檔案我們要怎麼樣去區隔他呢?感恩喔.
  • 24-bit 本來就沒有 palette,請仔細閱讀 Bits Per Pixel 那個欄位(註五)。

    瘋小貓 於 2008/03/15 07:52 回覆

  • genest
  • 感謝

    感謝大大的回應.我剛剛再檢查一遍.發現是我會錯意,24是沒有調色盤的.感謝大大的指正.還有可以再請教一個問題嗎.請問大大你有聽過EMSBMP這種格式嗎?
  • 不好意思沒有耶。我不當工程師很久了..... :p

    瘋小貓 於 2008/03/17 12:15 回覆

  • genest
  • 喔喔.那可以請教大大,當初讓你離開這個地獄的原因是什麼呢?還有可以分享一下轉跑道的心得嗎..^^" 感恩喔.
  • 原因啊...就覺得累了煩了啊。目前的跑道是無所事事的家庭主婦。沒什麼特別的心得。

    瘋小貓 於 2008/03/18 13:15 回覆

  • genest
  • 再問一個問題..^^"

    在RLE解壓縮的時候,會有一個位移的指令(0x0002),我想請問在位移的之間的顏色要填什麼呢?index=0的顏色還是有背景顏色呢?以小貓的範例來看,看起來像是先把整個buffer填成index=0的顏色後再來decode,請問是這樣嗎.感恩..^^
  • ㄟ這個細節我也忘了,你要不要自己用小畫家做實驗試看看?

    瘋小貓 於 2008/04/01 14:42 回覆

  • Chris
  • 關於Palette

    您好, 我正在把一個received 16-bit bitmap data加上一個header. But I find difficulty to write the "palette part". I'm not sure how to write that part. I tried to add "00 F8 00 00 E0 07 00 00 1F 00 00 00" before the "bitmap array" part. However, the whole pic filtered in yellow. 請問Palette part 怎樣寫才對? 急問. 謝謝!
  • 1. 你的調色盤只有 12 bytes,所以只有3個顏色?
    2. 你的 bitmap data offset 欄位正確嗎?(否則可能指到錯誤的調色盤)
    3. 你的 bits per pixel 欄位對嗎?compression 欄位有選對壓縮方式嗎?
    4. 請善用各種工具軟體,自己培養 debug 能力。憑你幾句話我就能抓出 bug 的話,我就發了.....
    5. 很抱歉你是急問,但是上網問我絕對比你問身邊的同事/同學慢得多。

    瘋小貓 於 2008/04/21 02:29 回覆

  • chris
  • 再問一下....

    很興奮你這麼快就給我回覆了!!!

    1. 其實也不清楚是否就這樣就可以把 (0x000000F8,0x0000E007,0x00001F00) 直接加到data和header之間, 但就姑且一試, 結果現在仍未做得到
    2. 現在的offset應該是指到對的位置...有check過
    3. compression..我用的是c328r camera module, user manual說應該是rgb565的,
    所以就用了bitfield, 但bits per pixel就不太清楚該如何定下...可否賜教?
    4. 不好意思...因為對著一堆16位數子有點時間了,希望可以問一下...
    5. 我們也抱歉...其實你提供的資料真的很有用, 也幫了我們不少, 謝謝你!!!!!^^
  • 如果你是使用 16 bpp + bitfields 格式,那你就不是使用調色盤,而是在調色盤位置填入顏色的遮罩(mask)。(我說過了上網問我絕對比你問身邊的同事/同學慢得多嘛,你看我們雞同鴨講了一堆,我到現在才知道你根本不是要填調色盤)
    紅、綠、藍的 mask 應分別為 0xF800, 0x07E0, 0x001F, 這樣就是 RGB565 格式。(我有點忘了 little-endian 和 big-endian 的轉換..也許你原本填的是對的,也許有高位低位錯置,請自己再檢查。)

    最重要的問題:你現在到底是 encode 還是 decode 有問題?

    c328r 我不知道是什麼東西,我文中的表格是標準 bitmap 格式,也許這個相機有自己的特殊格式。

    瘋小貓 於 2008/04/21 02:33 回覆

  • khchung
  • 謝謝您...

    解說的好清楚...
    最近工作上需要,將YUV420的格式轉成RGB565,想要將RGB565做成bmp檔案,以方便直接在PC上show出來。
    運氣真好,一google馬上就連到這兒來,目前RGB555及RGB565已可正常運作。
    非常感謝您。:)
  • Arik
  • 感謝你

    感謝你的熱心發表, 讓我工作順利許多.
    可否請教一下, 為何我256 色的BMP 檔中, 純紅是的值0xFC 而不是0xE0呢(RRRGGGBB)?
  • 問題問不清楚,無法回答。

    瘋小貓 於 2008/05/24 15:03 回覆

  • jimmy
  • 好詳細,謝謝你。
  • James
  • 感謝

    解釋得很詳細,幫助很多,謝謝 :)
  • 言
  • 請問關於bmp

    請問我用C語言的fopen去開啟bmp檔作處理,處理完後要如何存成另一個檔案的bmp檔呢?
  • fwrite 啊,不然咧?請原諒我真的看不懂你想問什麼啊.... XD

    瘋小貓 於 2008/08/07 05:00 回覆

  • 言
  • 關於BMP圖檔

    我也是認為fwrite,不過測試後發現了一個很奇怪的問題,我是用BCB寫的,程式碼如下:
    int main(int argc, char* argv[])
    {
    unsigned char *temp1;
    FILE *fp,*fp2 ;
    //int i,j,k,x = 50,y = 60,m,n;
    int width = 0,height = 0;

    int counter_1,i,j;

    fp=fopen("c:\\111.bmp","rb");
    fseek(fp,18,0);
    fread(&width,sizeof(width),1,fp);
    fseek(fp,22,0);
    fread(&height,sizeof(height),1,fp);
    fseek(fp,0,0); //bmp content
    printf("width is %d\n",width);
    printf("height is %d\n",height);

    temp1 = new unsigned char[height*width*3+54];
    counter_1=fread(temp1,sizeof(unsigned char),height*width*3+54,fp);
    fclose(fp);

    fp2 = fopen("c:\\test.bmp","wb");
    counter_1=fwrite(temp1,sizeof(unsigned char),height*width*3+54,fp2);
    fclose(fp2);
    free(temp1);
    getch();
    return 0;
    }


    我用小畫家隨便畫張圖後,檔名取為111.bmp放在C:\底下,然後執行完此程式後會出現test.bmp,可是他圖片用小畫家開啟右上角會多出一條黑線,用windows picture and fax viewer開啟會出現繪圖失敗??
  • 1. 基本上你要做的事情就是『複製檔案』,所以 111.bmp 和 test.bmp 應該要一模一樣對吧?

    2. 至於怎麼 debug....我建議你使用 UltraEdit 或 WinHex 之類的純文字編輯器,把兩個 bmp 檔案開啟為十六進位模式,兩個檔案比對一下,就知道你哪裡複製錯啦!

    3. 你的程式中寫到 height*width*3 +54 這個不知所以然的魔術數字,我得提醒你這可不一定是 file size,你可能沒抄完原本那個圖檔(或者多抄了一堆怪東西 -- 如果右上角出現黑線的話)。為什麼不直接用 fseek 找出正確的 file size 呢?或者,檔頭明明就有一個 file size 的欄位,為什麼不讀它呢?

    您是把這裡當做 C programming 課輔中心了是吧?

    瘋小貓 於 2008/08/08 15:21 回覆

  • 言
  • 關於BMP圖檔

    抱歉,給你帶來困擾,我只是學生,剛好看到這邊有講bmp的東西,所以想問問我碰到的問題,謝謝您的回答,謝謝
  • 言
  • 關於BMP圖檔

    至於你說的魔術數字我是想說一張bmp的大小應該是height*width*3 (RGB) 再加上標頭檔54,所以才會出現這個數字的,不過不知道為什麼這個數字會和size有差?
  • 很明顯你並沒有研讀上面這篇文章,所以才會誤以為所有BMP的檔案大小都應該是 H*W*3 + 54。
    你可以耐心讀完文章再來問為什麼嗎?
    我辛苦寫了一篇文,仔細介紹了 BMP 格式,但是你卻看都不看就來發問,這是令我覺得比較困擾的地方。

    瘋小貓 於 2008/08/09 00:23 回覆

  • 順子
  • 這個 BMP 的解說真是詳盡

    您的 BMP 解說真是詳盡,被布蘭登同學找到後,以饗同好。我相信這個 2006 年的資料,應該還可以在下一世紀繼續流傳。
  • 正所謂「Bitmap 恆久遠、一篇永流傳」嗎? XD
    (我之前真的沒有post在公司內部網站嗎?我記得我有留筆記才對....人老了真是記不清楚了..)

    瘋小貓 於 2008/09/27 04:21 回覆

  • 哭
  • 我想請問一下.. 例如我們平常開的BMP檔..是 8BIT 可是...我要顯示在螢幕上...TFT LCD是要讀取RGB的格式..就是R.B.G各8BIT (全部24BIT)請問...你知道如何從 8BIT 轉變成 24BIT ??
  • 我想請問一下..你有仔細讀上面的文件嗎?

    瘋小貓 於 2008/10/16 12:20 回覆

  • JFAN
  • 好詳盡的資料
    真是太感謝您了 :D
  • 大鳥先生
  • 請問...Palette 0036h Palette N*4 中 N代表什麼意思?
    如果是24位元BMP檔, N會是多少?
  • N是調色盤的顏色數目。黑白雙色的話N就等於2;256色的話N就等於256。
    24位元的BMP檔未使用調色盤,所以沒有N值(N=0)

    瘋小貓 於 2008/12/21 04:33 回覆

  • ryanlei
  • 這篇算是中文參考資料裡面整理很棒的,大推!
  • Kenyu
  • CrazyCat:
    請問從哪些欄判斷灰階圖呢?
    謝謝
  • 為了確定你知道你自己在問什麼,回答問題之前讓我先問你:
    什麼叫做「灰階」?一個像素(pixel)若用 RGB 三個值來表示,怎樣會是灰階(灰色)?

    如果你知道上面兩個問題的答案,那麼我對你的問題回答是:
    Bitmap 格式並沒有定義是否灰階。若調色盤(palette)的內容是灰階,圖就會是灰階。

    瘋小貓 於 2009/05/23 02:50 回覆

  • siriusjinn
  • 不好意思!可以借轉載我的無名嗎?我會附上轉載網址的!感謝
  • 請在文章頁首註明原文作者姓名及原文出處連結。

    瘋小貓 於 2009/06/16 01:22 回覆

  • tsuo
  • 關於點陣圖檔座標

    在註解11那邊

    請問我要如何將裡面的陣列資料取出來

    放進TXT檔內
  • 就用 fread 以 binary 讀出來、然後用 fwrite 以 text 寫到 txt 檔啊
    不然用 UltraEdit 之類的文字編輯器把圖檔開成 hex mode 然後 copy 到 txt 文件也可以

    瘋小貓 於 2009/07/05 16:38 回覆

  • tsuo
  • 謝謝回答~

    但我用二進位檔方式讀圖

    寫到txt檔上面卻是亂碼

    怎麼回事呢?..
  • 因為它的 ASCII code 就是亂碼啊,你要 copy 的是 hex code,不是 ASCII code。不是所有文字編輯器都
    有這種特殊的拷貝剪貼功能。也許 UltraEdit 沒有,我以前用的是 WinHex。記得交大好像有研發一個叫 text shop 還是什麼的也有這個功能。

    瘋小貓 於 2009/07/08 03:10 回覆

  • 布蘭登
  • 回應#21,有的有的,server裡面有收入放著。只是習慣不好,每次要看bitmap的東西,總是由google上手,總還是會回繞到這篇。真是可以細細回味,解百惑啊!!
  • Moon
  • 真是很清楚很詳細耶~
    另外...雖然很久了 , 但是#14 那個我知道他在說什麼 =.=
    沒有人說 256色是 (RRRGGGBB) 啊~~~
    應該是要對照調色盤.... 調色盤的n 值就是 代表有幾種顏色
    我用小畫家試存一個檔 0xfc 對應到 0xff000000
    轉換endian後, 是藍色呢....
  • 小松
  • jpg有header嗎?
  • 池田晶子的貓很可愛
  • 你寫的比wiki還好懂XD,整理得很棒
  • Madoka82
  • 感謝整理過的資訊

    多謝你整理的資訊可以讓我在幾分鐘內馬上了解 BMP 的 Header
    尤其是註解的部分很棒,謝謝 ;-)
  • :)

    瘋小貓 於 2009/10/19 15:38 回覆

  • deepking
  • 最近final project要用到
    感謝你整理的這麼有條理
    受益良多
  • 火雲狐仙
  • 回應#33 #34

    非常同意^^,到維基是沒可能幾分鐘就明白,版主大概也花了很多年的心血才弄成這編文章吧~~單單一方面的理解沒可能這麼詳細><
    另外,以上留言也提及256色的問題,我也想問個明白.就是24-bit的圖檔是8bit紅,8bit綠,8bit藍(不難理解),8-bit(256色)的灰階圖檔中, R=G=B ,所以灰階檔中FFFFFF(24-bit)不就會存成FF(8-bit)嗎?=.=",那為什麼版主說256色灰階圖會存調色板?不會多此一舉嗎?這可會使檔案大小增大呢><
  • 「256色灰階必須存調色盤」不是版主說了算的,這個格式本來就這麼規定。
    存調色盤可使此格式(256色)的靈活度增加,不必侷限於灰階。這是一個檔案格式之所以能被廣泛應用的重要特性 -- 通用於各種資料。

    256色的調色板佔用了 256*4 = 1024 byte = 1KB 的檔案大小;由於軟硬體的進步日新月異,「資料處理速度」勢必會與「資料量」一同成長,所以 1 KB 不管是在現代的電腦或網路上看來都微不足道。

    瘋小貓 於 2009/12/07 13:28 回覆

  • BBD
  • 請問C328這個影像模組如何取得@@感謝!!
  • 請參考 #12 的回覆。

    瘋小貓 於 2009/12/17 21:07 回覆

  • 老范
  • 我發現很多人不太瞭解:1/4/8 bpp 模式下,像素資料是「調色盤顏色的索引值」,需藉由這個索引值,再到調色盤中找到該像素代表的顏色,每個索引值代表一種顏色,調色盤會紀錄該顏色的RGB值。16/24/32 bppp 模式下,就不用調色盤了,因為像素資料的格式即為「RGB值」,差別在於 RGB 各色的寬度不同,如 RGB555, RGB565, RGB888等等。
  • Chris
  • 寫的很詳細, 感謝.
  • Grace
  • 好困擾

    你好
    請問為什麼我將bmp檔案轉成raw檔案後,使用photoshop看raw檔案顏色會失真,好像少了紅色,我驗證了header資料,也確定header為54bytes,無壓縮,那為什麼我將54bytes以後的取出存成raw檔案會失真呢?
  • 光憑這樣的敘述我怎麼會知道為什麼啊?:p

    你有研讀那 54 byte 的內容嗎?Bits Per Pixel 的值是多少?
    用 photoshop 打開 raw 檔時,檔案長寬和 channel number 給對了嗎?
    若手動把第一個 pixel 改成紅色(不要用小畫家,請用文字編輯器),然後再用 photoshop 打開看,那個 pixel 的顏色值是多少?

    瘋小貓 於 2010/04/22 00:15 回覆

  • Grace
  • 謝謝你喔

    我已經知道為什麼了,因為去掉header後若直接開,好像少了紅色,後來我把正確的和顏色失真的用ultraedit比較位元串,發現若是raw檔案,則原本RGB要把它變成BGR,也就是BR互換,這樣用photoshop開raw檔案才會是正確的顏色ㄝ,真是奇怪,不過你的網站真的幫助我好多,謝謝你喔
  • 夫夫
  • 這篇是網路上最簡單易懂的點陣圖解說。它幫我快速的完成了點陣圖的讀寫程式,受益頗多。大推
  • 哈哈~ 感謝愛用~ :P

    瘋小貓 於 2010/05/21 23:58 回覆

  • 2F
  • 也是在拆檔頭來這兒的
    感謝您精闢的解說
    而且..............達洋很可愛~~~
  • rogerK
  • 太謝謝你的分享 讓我學習到BMP非常多 感恩!!!!
  • 湯姆
  • 請問別種圖檔格式的這一種編碼您也有資料或是也會嗎?

    請問別種圖檔格式(如jpg,tiff等)的這一種16進位編碼內容的辨認方式,您也有資料或是也會嗎?因為小弟最近被指派要將這種編碼轉成資料流而且不只bmp檔格式,若蒙指導,感激不盡。
    湯姆
  • 我的指導是:請去查書吧,書上都寫得很清楚。
    不客氣。

    瘋小貓 於 2010/08/23 01:11 回覆

  • JJ
  • 版主不好意思請教,想編修多媒體播放機的韌體裡面的bmp背景圖檔格式(1280x720x24bit)蠻特殊的檔案頭為BMH  可以使用XP的小畫家載入識別編修雖只劃1條線但存成檔案後檔案會異常變大(由原來的1800k->2700k),再放入韌體裡面就會失效無法套用小畫家編修的bmp圖檔,所以不知是否此BMP原圖檔有特殊壓縮識別的限制,不知版主可否幫忙看看其格式有何特殊之處,或有哪套bmp軟體可以編修存檔後格式跟原圖檔一樣。
    ZIP壓縮7k檔案下載 https://sites.google.com/site/haha6699b/pic/bmp.zip
  • 用 UltraEdit 編修存檔就可以和原圖檔一樣了。

    瘋小貓 於 2010/09/10 12:21 回覆

  • JJ
  • 感謝版主的 明燈指引 有了 一線曙光,有下載UltraEdi 打開IMAGE_GBROWSER_BG_PAL2~3.bmp修改過的圖檔進入16進位模式(跟MadEdit v0.2.8 Bet也是一樣的)再存檔案檔案大小還是沒變維持2800k,還是不知要如何使用UltraEdit 修改原圖檔跟修改過的圖檔置換可否請版主再詳說一下,再附上已修改過的2個bmp背景圖檔大小為2800k的ZIP壓縮10k檔案下載 https://sites.google.com/site/haha6699b/pic/bmp1.ZIP
    是否也可煩請樓主佛心再幫忙一下置換一下16位進制的哪些位置可以讓修改過的bmp圖檔檔案恢復到1800k的大小而且也一樣顯示BMH格式的R2R2R2R2R...再mail給敝人,或可比對出來有何差異就知道學習到如何處理此種特殊格式的bmp圖檔了。
  • 「不知要如何使用UltraEdit 修改原圖檔」--> 你如果仔細研讀了我的文章,應該就知道了。

    瘋小貓 於 2010/09/11 02:04 回覆

  • JJ
  • 版主,當然有看版主整理過的資料,不過畢竟不是寫程式的人,有看沒有懂,只覺得應該...0002h File Size 4 整個點陣圖檔案的大小(單位:byte) ...此段是比較有關連的,但是在16位進制裡面找不到0002h的位置,最大進位不是只到0F...若要跑到0H不是就變成18進制了嘛?連結到 Big Endian 和 Little Endian 架構的說明...還是有看沒有懂
  • 你有沒有注意到 Shift 那一欄的每個數字後面都有個小寫 h?
    那個 h 只是 hex 的意思,0002 h 就是「16 進位的 0002」。

    瘋小貓 於 2010/09/11 11:19 回覆

  • Ant
  • 目前用c語言要把一張16bit BMP 轉成 24bit BMP 可是一直失敗....
    請問16bit BMP 是可以轉成24bit嗎 ?? 還是不行??
  • 可以。

    瘋小貓 於 2010/12/03 03:53 回覆

  • CT
  • 很感謝版主提供的資料,讓我可以順利替RGB565及RGB888的原始資料加入header file,感謝~感謝~ XD
  • 阿呆
  • 感謝~
    這篇BMP格式的說明,對我幫助很大,也是我找到說明最清楚的說明,感謝你的用心整理與發文。
  • 熊視網
  • 請問BMPZ檔=BMP?
  • kerker
  • 請問為甚麼 深度8位元 大小512*512的bmp檔,它的bitmap data會有 512*512 + 1024個bytes?
  • Roger
  • 因為調色盤大小為 256 * 4 =1024 , 所以 bitmap data 會有 512*512 + 1024 個 bytes

    PS. 256 是因為深度8位元 = 2 ^ 8 = 256
  • 新手
  • 大大您好
    想請教您如何在C#裡面
    利用bytearray建立檔頭
    看完這篇實用文之後還是沒甚麼頭緒
    感謝您的回覆
  • Eric
  • 寫得真好,
    謝謝指導。