【BMP】以WinHex/PHP解析bmp


【目的】

  • 利用WinHex/Php解析基本的BMP格式。

【準備】

  • 使用小畫家繪製兩張16x16單色bmp格式的圖。
    一張全部為黑(black.bmp),一張全部為白(white.bmp)。
    image image
  • 先打開BMP File Format(BMP.tpl)(http://www.x-ways.net/winhex/templates/index.html),將內容先存入剪貼簿,抄錄如下
    template "BMP File Format (with Palette)"
    
    // Template by Khomenko Volodymyr, Ukraine.
    
    description "Structure of a BMP image file"
    appliesto file
    
    requires 0x00    "42 4D"     // 'BM'
    
    begin
        section    "BMP File Header"
            read-only char[2]    "BMP_ID"        // 00
            uint32    "File size"                // 02
            uint32    "Reserved"                 // 06
            uint32  "ImageDataOffset"            // 0A
        endsection
    
        section    "BMP Info Header"
            uint32    "HeaderSize"               // 0E
            uint32    "Width"                    // 12
            uint32    "Height"                   // 16
            uint16    "Planes"                   // 1A
            uint16    "BPP"                      // 1C
            uint32    "CompessionMethod"         // 1E
            uint32    "ImageSize"                // 22
            uint32    "XPixelsPerMeter"          // 26
            uint32    "YPixelsPerMeter"          // 2A
            uint32    "PaletteSize"              // 2E
            uint32    "ColorsImportant"          // 32
        endsection
    
        section    "Palette(If PaletteSize=0 then no palette)"
            numbering 0
    
            {
                byte "B[~]"
                byte "G[~]"
                byte "R[~]"
                byte "A[~]"
    
            } [PaletteSize]
        endsection
    end

【步驟】

  1. WinHex本身沒提供解析bmp的能力,要加入這種樣板。
  2. 打開WinHex(目前我是用v15.4)。
  3. View | Template Manager(Alt+F12) | New
    image
  4. 貼上剛剛存入剪貼簿的內容。Check Syntax | Save | Close。 
    image
  5. 這是white.bmp mapping結果,基本資料以32bits(資料+Padding)一組,目前是
    16bits(0xFF) 加上 16bits(0x00,Padding)。16x16的圖剛好是 0x3E~0x7D共64bytes(橙色框框)。
    image
  6. 另外根據 Bitmap data(http://en.wikipedia.org/wiki/BMP_file_format),
    有兩個地方是特別要注意的。
    image 
    6.1 資料排列方式是左下開始到右上,而不是一般常說的右上到左下
    6.2 Pixel是 BGR 排列,而不是一般常說的 RGB
    6.3 24Bits點陣圖 的話就是每個Pixel為 8(R) + 8(G) + 8(B)=24Bits
    6.4 由於會需要alignment,所以會補00 00(3C,3D)
    6.4 所以上面的圖一張就是
    (1,0) Red (00,00,FF)
    (1,1) White (FF,FF,FF)
    (0,0) Blue (FF,00,00)
    (0,1) Green (00,FF,00)

  7. 如果一直這樣看Raw Date的話,實在是有點麻煩。嘗試用php/imagecolorsforindex(ImageColorAt)來解析,但是由於php無法讀取bmp檔,所以先用小畫家將剛剛的檔案存成 test.png。
    <?php
    
    // open an image
    $im = imagecreatefrompng('test.png');
    
    // get a color
    for ($x=0;$x<2;$x++)
    {
      for ($y=0;$y<2;$y++)
        {
          $color_index = imagecolorat($im, $x, $y);
          // make it human readable
          $color_tran = imagecolorsforindex($im, $color_index);
          // what is it ?
          echo("XY[$x,$y]");
          print_r($color_tran);
        }
    }
    ?>
  8. 結果排列順序和我意料不同(x/y 和上面的表現方式不同,看來是一排一排讀),目前先留下記錄。
    $php dump.php 
    XY[0,0]Array
    (
        [red] => 0
        [green] => 0
        [blue] => 255
        [alpha] => 0
    )
    XY[0,1]Array
    (
        [red] => 255
        [green] => 0
        [blue] => 0
        [alpha] => 0
    )
    XY[1,0]Array
    (
        [red] => 0
        [green] => 255
        [blue] => 0
        [alpha] => 0
    )
    XY[1,1]Array
    (
        [red] => 255
        [green] => 255
        [blue] => 255
        [alpha] => 0
    )

【參考】

  1. WinHex 範本(模板)分享!
    http://jay-fva.blogspot.com/2010/02/winhex.html
  2. 點陣圖(Bitmap)檔案格式
    http://crazycat1130.pixnet.net/blog/post/1345538
  3. BMP file format
    http://en.wikipedia.org/wiki/BMP_file_format
  4. YUV
    http://zh.wikipedia.org/zh/YUV
  5. PNG文件結构分析
    http://www.elevatorsx.com/news.asp?Rep=NaN&id=126840
    http://www.elevatorsx.com/news.asp?Rep=NaN&id=126841
  6. The GIF File Format With C
    http://www.elevatorsx.com/news.asp?Rep=NaN&id=100089
  7. 影像處理上課資料
    http://web.meiho.edu.tw/~x00002174/95_2Course.htm
  8. WinHex
    http://zone-soft.com/index.php?newsid=1079
  9. 以php解析 bmp
    imagecreatefrom[BMP] http://www.webdeveloper.com/forum/showthread.php?t=194194
 

Ed32. Copyright 2008 All Rights Reserved Revolution Two Church theme by Brian Gardner Converted into Blogger Template by Bloganol dot com