BMPSAVE

From Liberty BASIC Family
Jump to navigation Jump to search
Supported in Just BASIC Supported in Liberty BASIC Not supported in Liberty BASIC 5 Not supported in Run BASIC

Description

Saves a bitmap to disk.

Syntax

  1. bmpsave "name", "filename.bmp"

Hints

The bitmap to save can be one that is loaded with loadbmp or captured with getbmp.
A Gotcha. The bitmap is saved to disk using the bit depth (bits per pixel - BPP) of the user's display setting. Have in mind that other users might have another BPP (32 vs 24 for example). It will matter if you are reading them back as binary data.

These commands are generally used when working with bitmaps:

Example

nomainwin

WindowWidth=400
WindowHeight=300

    open "Bmpsave Test" for graphics_nf_nsb as #g
    #g "trapclose [quit]"

    'fill background with color
    #g "fill cyan"
    'print some text
    #g "font arial 36"
    #g "down;color lightgray;backcolor cyan; place 20 150"
    #g "\DO NOT COPY"
    'capture the displayed image with alias 'noCopy'
    #g "getbmp noCopy 0 0 390 270"
    'save image to disk as bmp file
    bmpsave "noCopy", "nocopy.bmp"
    wait

[quit]
    'remove image from memory
    unloadbmp "noCopy"
    close #g
    end

Useful Procedures

With GETBMP, this function allows to read color of a point in graphicbox / graphic window.

Warning. Because it saves pixel to file on disk, it's pretty slow - my tests shows about 500 pixels per second on 3GHz box. Just be aware of it.

'GetPixelValue$ returns a string with the RGB values of the pixel
'in coordinates x and y in window/graphicbox names handle$ (e.g, "#main.graph")
function GetPixelValue$(x, y, handle$)

'Grab a 1*1 bitmap
    #handle$, "getbmp gpv "; x; " "; y; " "; 1; " "; 1

'Save in a bmp file
    bmpsave "gpv", "getpvaluetemp.bmp"

'Open the file for string input and get it's full contents
    open "getpvaluetemp.bmp" for input as #gpv
    s$ = input$(#gpv, lof(#gpv))
    close #gpv

'Check if user's display is 32-bit, and read the red-green-blue values
'If display 16 bit, then colors are masked. So some last (3 for red, 2 for green, 3 for blue) bits always 0
'That means that you did not get 255 255 255 for white - (248 252 248) instead. You have to experiment
'otherwise function returns nothing (support for other display types could be added (?))
    bpp =  asc(mid$(s$, 29, 1))
    select case bpp
    case 32
        red = asc(mid$(s$, 69, 1))
        green = asc(mid$(s$, 68, 1))
        blue = asc(mid$(s$, 67, 1))
    case 16
        bytes = asc(mid$( s$, 67, 1)) + 256*asc(mid$( s$, 68, 1))
        red =  (bytes AND 63488) /256       '0xF800
        green =  (bytes AND 2016) / 32 * 4  '0x7E0
        blue =  (bytes AND 31) * 8          '0x1F
    end select

'concatenate the return value, delete temporary file and free memory
    GetPixelValue$ = str$(red)+" "+str$(green)+" "+str$(blue)
    kill "getpvaluetemp.bmp"
    unloadbmp "gpv"
end function