2009年12月10日 星期四

HW4

這次作業與上次的大同小異,不過這次是要讀取BMP檔裡面的RAW值,並將它顯示出來。搭配之前所學的freed,fseek讀取RGB不是問題。

1

Program Name:SourceBMP
Version:         0.02 alpha
                    0.03 alpha(98.12.3更新)
編譯完成的程式檔可以從這裡下載

功能:
不透過LoadFromFile,直接讀取BMP圖檔的RAW值
修正:
(98.12.3) 修正fseek遇到控制字元問題,並將圖正確顯示

這個作業總共出現了兩種版本的程式寫法
第一種為「點讀取法」透過兩層for迴圈讀取每個點的RGB值

一開始實作時,一直出現個很奇怪的情況,顏色無法正確的顯示,後來查WIKI的資料才發現原來RAW的儲存方式不是RGB而是倒著回來的BGR,更改一下RGB輸出的方式就顯示正確了

用RGB的順序讀取
2
用BGR的順序讀取
3

翻文件同時也發現了RAW檔儲存的順序是圖片的左下角到右上角

在製作讀取程式時跟老師討論到調色盤(Palette)的事情
3png

之前一直不知道調色盤的作用,與老師討論過後才了解到調色盤是用來儲存整個BMP的顏色資訊索引值,可以應用在BMP檔的壓縮上面
BMP檔壓縮方法是假設有個圖有紅紅藍藍綠綠
傳統RGB方是個別存在54byte以後的空間,但這樣檔案會很大
透過索引值方式將紅藍綠存在54byte以後當成參考值
在原本存顏色資訊的地方指定索引值的位置再透過RLE壓縮法就能做到無損壓縮BMP

至於RLE是什麼?查WIKI的資料它叫「變動長度編碼法」直接解是太抽象我用例子解釋一下
假設有筆資料為AAAAABBBBCCCC總共需要13個位元儲存
RLE的方式為將資料改成另一種表示法
AAAAABBBBCCCC → 5A4B4C 只需要 6個位元就可以儲存了
再透過演算反解壓縮資料就能還原為原始資料

至於詳細的實作方式還在研究中

第二種為上次上課老師提到用ScanLine一次讀取一列的方式,比第一種方式快很多
原本的點搜尋法讀取大圖檔時非常的慢

98.12.03補充:
透過將fopen讀取指修正避免fseek遇到無法讀取的RGB值(控制字元)
這是原本的寫法fopen(“text.bmp”,“r”);
新的寫法為fopen(“text.bmp”,“rb”);
加了這個b讓fopen以binary的方式讀取檔案
用原本的r模式是以文字的方式讀取檔案
但是檔案中可能會遇到一些控制字元(例如空白等)
會造成讀取錯誤
所以之前第一次實做時才發生了fseek不會往下跳的情況
透過b模式強制fopen用二進位的方式讀取(直接讀資料不轉換字元)就可以順利讀檔正確了

沒有留言:

張貼留言