ThirtyTwoBit MEM SUB
Jump to navigation
Jump to search
Attention!! - This page is outdated and provided for reference and/or education only.
(Return to historic Table of Contents)
Starting with QB64-PE v3.9.0 the functionality described here was superseded by _SAVEIMAGE.
Fast Bitmap Export routine using memory for use with 32-bit color images ONLY
Code by Steve McNeill
SUB for 32 BIT COLOR IMAGES ONLY!
Wiki Pages
Main Page with Articles and Tutorials
QB64 specific keywords (alphabetical)
Original QBasic keywords (alphabetical)
QB64 OpenGL keywords (alphabetical)
Keywords by Usage
Got a question about something?
Frequently Asked Questions about QB64
QB64 Phoenix Edition Community Forum
Links to other QBasic Sites:
Pete's QBasic Forum
Pete's QBasic Downloads
PRINT "This program will create a 32 bit bitmap of the desktop!" PRINT " IN 2 SECONDS..." _DELAY 2 picture& = _SCREENIMAGE x1% = 0: y1% = 0 x2% = _WIDTH(picture&) - 1 y2% = _HEIGHT(picture&) - 1 SaveBMP32 x1%, x2%, y1%, y2%, picture&, "ScreenShot.bmp" |
SUB SaveBMP32 (x1%, x2%, y1%, y2%, image&, Filename$) TYPE BMPFormat ' Description Bytes QB64 Function ID AS STRING * 2 'File ID("BM" or 19778 AS Integer) 2 CVI("BM") Size AS LONG ' Total Size of the file 4 LOF Blank AS LONG ' Reserved 4 Offset AS LONG ' Start offset of image pixel data 4 (add one for GET) Hsize AS LONG ' Info header size (always 40) 4 PWidth AS LONG ' Image width 4 _WIDTH(handle&) PDepth AS LONG ' Image height (doubled in icons) 4 _HEIGHT(handle&) Planes AS INTEGER ' Number of planes (normally 1) 2 BPP AS INTEGER 'Bits per pixel(palette 1, 4, 8, 24) 2 _PIXELSIZE(handle&) Compression AS LONG ' Compression type(normally 0) 4 ImageBytes AS LONG ' (Width + padder) * Height 4 Xres AS LONG ' Width in PELS per metre(normally 0) 4 Yres AS LONG ' Depth in PELS per metre(normally 0) 4 NumColors AS LONG ' Number of Colors(normally 0) 4 2 ^ BPP SigColors AS LONG ' Significant Colors(normally 0) 4 END TYPE ' ' Total Header bytes = 54 DIM BMP AS BMPFormat DIM x AS LONG, y AS LONG DIM temp AS STRING * 3 DIM m AS _MEM, n AS _MEM DIM o AS _OFFSET m = _MEMIMAGE(image&) 'get image information from memory handle DIM Colors8%(255) IF x1% > x2% THEN SWAP x1%, x2% IF y1% > y2% THEN SWAP y1%, y2% _SOURCE image& pixelbytes& = 4 OffsetBITS& = 54 'no palette in 24/32 bit BPP% = 24 NumColors& = 0 '24/32 bit say zero BMP.PWidth = (x2% - x1%) + 1 BMP.PDepth = (y2% - y1%) + 1 ImageSize& = BMP.PWidth * BMP.PDepth BMP.ID = "BM" BMP.Size = ImageSize& * 3 + 54 BMP.Blank = 0 BMP.Offset = 54 BMP.Hsize = 40 BMP.Planes = 1 BMP.BPP = 24 BMP.Compression = 0 BMP.ImageBytes = ImageSize& BMP.Xres = 3780 BMP.Yres = 3780 BMP.NumColors = 0 BMP.SigColors = 0 Compression& = 0 WidthPELS& = 3780 DepthPELS& = 3780 SigColors& = 0 f = FREEFILE n = _MEMNEW(BMP.Size) 'allocate memory for file data _MEMPUT n, n.OFFSET, BMP 'place bitmap header in memory o = n.OFFSET + 54 'offset after header for RGB color data ' 'run memory reads without error checking! $CHECKING:OFF y = y2% + 1 w& = _WIDTH(image&) DO y = y - 1: x = x1% - 1 DO x = x + 1 _MEMGET m, m.OFFSET + (w& * y + x) * 4, temp 'read 3 color bytes _MEMPUT n, o, temp 'place into n memory after o offset o = o + 3 'increase offset 3 bytes per loop LOOP UNTIL x = x2% LOOP UNTIL y = y1% $CHECKING:ON _MEMFREE m OPEN Filename$ FOR BINARY AS #f t$ = SPACE$(BMP.Size) _MEMGET n, n.OFFSET, t$ PUT #f, , t$ _MEMFREE n CLOSE #f END SUB |
See also