\ BMP轉換
\ BMP 檔頭結構
: BMP.fType+ ( adr -- adr+ ) 0 + ; \ 固定為 s" BM"
: BMP.fSize+ ( adr -- adr+ ) 2 + ; \ 檔案長度
: BMP.fReserved1+ ( adr -- adr+ ) 6 + ; \ 固定為 0x0000
: BMP.fReserved2+ ( adr -- adr+ ) 8 + ; \ 固定為 0x0000
: BMP.fOffBits+ ( adr -- adr+ ) 10 + ; \ 儲存檔案中實際圖像資料到檔頭的距離
: BMP.Size+ ( adr -- adr+ ) 14 + ; \ 圖像基本資料結構的大小
: BMP.Width+ ( adr -- adr+ ) 18 + ; \ 圖像的寬度
: BMP.Height+ ( adr -- adr+ ) 22 + ; \ 圖像的高度
: BMP.Planes+ ( adr -- adr+ ) 26 + ;
: BMP.BitCount+ ( adr -- adr+ ) 28 + ; \ 像素的色彩數目
: BMP.Compression+ ( adr -- adr+ ) 30 + ;
: BMP.SizeImage+ ( adr -- adr+ ) 34 + ;
: BMP.X_PelsPerMeter+ ( adr -- adr+ ) 38 + ;
: BMP.Y_PelsPerMeter+ ( adr -- adr+ ) 42 + ;
: BMP.ClrUsed+ ( adr -- adr+ ) 46 + ;
: BMP.ClrImportant+ ( adr -- adr+ ) 50 + ;
0 value BMP \ BMP檔案檔頭
0 value BMP.fSize
0 value BMP.ScanLineWidth
create BMP.buf 71862 allot
\ BMP.fSize allocate drop to BMP.buf
: 影像處理
;
: BMP_Read_DotData
bmp.buf
BMP.fSize BMP_Y 1 + BMP.ScanLineWidth * - BMP_X 3 * + + >r
r@ 2 + c@ dup to BMP_R to BMP_0R \ R
r@ 1 + c@ dup to BMP_G to BMP_0G \ G
r> 0 + c@ dup to BMP_B to BMP_0B \ B
;
: BMP_Write_DotData
bmp.buf
BMP.fSize BMP_Y 1 + BMP.ScanLineWidth * - BMP_X 3 * + + >r
BMP_R r@ 2 + c!
BMP_G r@ 1 + c!
BMP_B r> 0 + c!
;
: BMP_畫點
BMP_R BMP_G BMP_B 顏色變更 BMP_X BMP_Y 畫點
;
: BMP_畫線
BMP_R BMP_G BMP_B 顏色變更 BMP_X BMP_Y BMP_X1 BMP_Y1 畫線
;
: BMP_繪圖
0 to BMP_Y
WindowSize_H 0 do
0 to BMP_X
WindowSize_W 0 do
BMP_DotData_Get
影像處理
BMP_畫點
BMP_X 1 + to BMP_X
loop
BMP_Y 1 + to BMP_Y
loop
;
圖檔更新方式
ma_hty(白老鼠(Gary)) 2005/3/12 上午 05:44:52:
甚麼說呢...
OpenGL 是沒有對圖檔的直接支援的, 它的 API 只是對應 3D Rendering 必需的, glut 也沒有, 每一次有人問關於讀取圖檔的問題, 我也會很懶散的說, 用外面的 library 吧.
但是, 讀取圖檔的功能, 縱然自己做出來的功能可能較差, 但是, 自己有能力處理, 才會安心的. 或是當成是個練習, 也是好事.
好吧, 就讓我們去寫程式讀圖檔.