又是費經千辛萬苦阿...終於給他寫出來了!!(小小抒發,馬上回歸正題吧~)
這次的作業是把一張八位元灰階圖片的每個位元切平面顯示出來,我所使用的方法為,利用ScanLine[i]的方式把圖片每一列的第一個點的記憶體位址取出給一個型態為Byte的陣列指標當做起始位置,另一方面也宣告一個指標來接收你將來要顯示的圖片的起始記憶體位置,接著跑圖片的三倍寬度次數,利用記錄原始圖片值的陣列,把這一列上的每個點和某位元平面值做and運算,如果為該位元平面的點,就把用來顯示圖片的一維陣列對應位置的值設成255,如果不是的話就設成0。(這個部分不知道為什麼要跑圖片寬的三倍,我用原始圖片寬度時,只會出現1/3寬的圖片結果,等待高手指點。)
以上就是整個程式中比較重要的部分,其它像是個位元平面的值,可能就要去網路上搜尋一下了。那麼現在就來展示一下實作成果:
開啟圖片↓
第一位元平面↓
第二位元平面↓
第三位元平面↓
第四位元平面↓
第五位元平面↓
第六位元平面↓
第七位元平面↓
第八位元平面↓
以上就是我的實作結果,下面提供程式內ScanLine的語法:
-----------------------------------------------------------------
Byte *Ptr;
Ptr = (Byte *)Image->Picture->Bitmap->ScanLine[Index];
-----------------------------------------------------------------
補充:
後來為了解決上述的疑問,在網路上找到了一些資料,像是某個網站中所提到如果圖片為24bits的bmp圖片,那麼scanline所讀的那一列的pixel排列會為:
B1 G1 R1 B2 G2 R2 ... Bn Gn Rn
如此排列,後來我去看了一下我的圖片格式,是為24bits的bmp圖片,因為當初使用小畫家存圖時,存成8bits的bmp圖片會失真,4bits也會,如下圖所示:
8bits bmp picture↓
4bits bmp picture↓
所以最後就把它存成24bits的格式了,這也就是為甚麼需要三倍寬度的原因。
沒有留言:
張貼留言