BMP秀圖

\       BMP轉換

fload FileIO.f

\  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.buf

0 value BMP \ BMP檔案檔頭

0 value BMP.fSize

0 value BMP.ScanLineWidth

: 解讀_BMP的檔頭 ( ard --- )

    cls

        >r

r@ BMP.fType+ W@ cr dup emit 256 / emit

        r@ BMP.fSize+ @ cr ." 檔案總長為  " . ." bytes !"

        r@ BMP.fOffBits+ W@ cr ." 儲存檔案中實際圖像資料到檔頭的距離為  " . ." bytes !" 

        r@ BMP.Size+ @ cr ." 圖像基本資料結構總長為     " . ." bytes !"

        r@ BMP.Planes+ W@ cr ." 顯像色平面數目為   "  .

        r@ BMP.BitCount+ W@ cr ." 像素的色彩數目為   " .        

        r@ BMP.Compression+ @ cr ." 檔案壓縮方式代碼為   " .

        r@ BMP.Width+ @ dup cr ." 圖像的寬度為   " .  ." dots !"

        r@ BMP.Height+ @ dup cr ." 圖像的高度為   " . ." dots !" 

              3 * * cr ." 圖像的實際大小為   " . ." bytes !"   

        r@ BMP.SizeImage+ @ cr ." 圖像的存放大小為   " . ." bytes !"            

        r@ BMP.X_PelsPerMeter+ @ cr ." 圖像的水平密度為   "  dup . ." dot/公尺 或 "  254 * 10000 / . ." dot/inch !"

        r@ BMP.Y_PelsPerMeter+ @ cr ." 圖像的垂直密度為   "  dup . ." dot/公尺 或 "  254 * 10000 / . ." dot/inch !"                     

        r@ BMP.ClrUsed+ @ cr ." 實際使用顏色數目為   " . 

        r@ BMP.ClrImportant+ @ cr ." 重要顯示顏色數目為   " .                                        

r>drop

;

\

0 value WindowSize_W

0 value WindowSize_H

400 value WindowPosition_X

300 value WindowPosition_Y

ColorObject TheNextColor \ 使用 顏色物件

                

:Object 秀圖     <Super Window \ 宣告 秀圖

: 顏色變更 ( R G B --- )

        rgb NewColor: TheNextColor 

        TheNextColor ?ColorCheck

LineColor: dc

        ;

        

: 畫點  ( x y --- )

TheNextColor SetPixel: dc

        ;

       

:M StartSize:   ( -- w h )      \ 此物件的大小

WindowSize_W WindowSize_H

        ;M

:M StartPos:    ( -- x y )      \ 物件在 桌面的位置

WindowPosition_X WindowPosition_Y

        ;M

:M WindowTitle: ( -- Zstring )  \ 此物件的標題

        z" 秀圖"

        ;M

:M On_Paint:    { \ temp$ -- }  \ all window refreshing is done by On_Paint:

WindowSize_H  0 do

WindowSize_W 0 do

BMP.fSize j  1 + BMP.ScanLineWidth * - i  3 * +  bmp.buf +  >r

r@  2 + c@

r@  1 + c@

r>  0 + c@

顏色變更

i j 畫點


loop

loop

;M

:M On_Init:     ( -- )          \ things to do at the start of window creation

                On_Init: super             \ do anything superclass needs

                ;M

;Object


: BMP秀圖 ( --- )

    cls

        來源檔案選單 r/w 開檔 to BMP

        BMP 檔案大小? drop to BMP.fSize 

        BMP.fSize allocate drop to BMP.buf

BMP.buf BMP.fSize BMP 讀檔 drop                              

BMP 關檔


BMP.buf 解讀_BMP的檔頭

bmp.buf BMP.fSize+ @ to BMP.fSize

   bmp.buf BMP.Width+ @ to WindowSize_W

        bmp.buf BMP.Height+ @ to WindowSize_H  

bmp.buf BMP.SizeImage+ @ bmp.buf BMP.Height+ @ / to BMP.ScanLineWidth


start: 秀圖

;

BMP秀圖