Difference between revisions of "SAVEIMAGE"

From QB64.org wiki
Jump to: navigation, search
m
 
Line 8: Line 8:
 
* Screen or Image width and height calculations are automatically made using the image handle value.
 
* Screen or Image width and height calculations are automatically made using the image handle value.
 
* Use an image handle value of 0(zero) to get a screen shot of the entire active program screen.  
 
* Use an image handle value of 0(zero) to get a screen shot of the entire active program screen.  
* '''Note: SCREEN 0 text mode cannot be screen saved in Qbasic or QB64!'''
+
* '''Note: SCREEN 0 text mode cannot be screen saved in Qbasic or QB64.'''
  
  
Line 73: Line 73:
  
 
''See also:''
 
''See also:''
* [[_LOADIMAGE]], [[_ICON]] {{text|(Icons can be used in GL only!)}}
+
* [[_LOADIMAGE]], [[_ICON]], [[$EXEICON]]
 
* [[SCREEN (statement)]]
 
* [[SCREEN (statement)]]
 
* [[TYPE]], [[MKI$]], [[MKL$]]
 
* [[TYPE]], [[MKI$]], [[MKL$]]
Line 81: Line 81:
 
* [[SaveIcon32]] {{text|(converts any image to icon)}}
 
* [[SaveIcon32]] {{text|(converts any image to icon)}}
 
* [[Bitmaps]], [[Icons and Cursors]]
 
* [[Bitmaps]], [[Icons and Cursors]]
* [[Embedding Icons in EXE]] {{text|(Icons visible in Windows Explorer)}}
 
  
  
 
{{PageNavigation}}
 
{{PageNavigation}}

Latest revision as of 03:52, 22 January 2020

The SAVEIMAGE SUB program to create Bitmaps of other type Images or Screenshots


Bitmaps are image files with the .BMP file name extension.


  • Bitmaps can be 1, 4, 8 or 24/32 bits per pixel(BPP) color palettes. QB64 is capable of working with high color bitmaps.
  • Screen or Image width and height calculations are automatically made using the image handle value.
  • Use an image handle value of 0(zero) to get a screen shot of the entire active program screen.
  • Note: SCREEN 0 text mode cannot be screen saved in Qbasic or QB64.


The following example uses a SUB program created to save a 32 bit JPEG image as a bitmap using QB64's graphic functions:

Module Demo Code: Change the _LOADIMAGE filename to an image file you can access.

i& = _LOADIMAGE("nice.jpg",32) ' loads a 32 bit .JPG file image SaveImage i&, "nice" 'saves it as .BMP file "nice.bmp" 'SaveImage 0, "screenshot" 'saves entire program screen as "screenshot.bmp" END

SUB SaveImage (image AS LONG, filename AS STRING) bytesperpixel& = _PIXELSIZE(image&) IF bytesperpixel& = 0 THEN PRINT "Text modes unsupported!": END IF bytesperpixel& = 1 THEN bpp& = 8 ELSE bpp& = 24 x& = _WIDTH(image&) y& = _HEIGHT(image&) b$="BM????QB64????"+MKL$(40)+MKL$(x&)+MKL$(y&)+MKI$(1)+MKI$(bpp&)+MKL$(0)+"????"+STRING$(16, 0) 'partial BMP header info(???? to be filled later) IF bytesperpixel& = 1 THEN FOR c& = 0 TO 255 ' read BGR color settings from JPG image + 1 byte spacer(CHR$(0)) cv& = _PALETTECOLOR(c&, image&) ' color attribute to read. b$ = b$ +CHR$(_BLUE32(cv&))+CHR$(_GREEN32(cv&))+CHR$(_RED32(cv&))+CHR$(0) 'spacer byte NEXT END IF MID$(b$, 11, 4) = MKL$(LEN(b$)) ' image pixel data offset(BMP header) lastsource& = _SOURCE _SOURCE image& IF ((x& * 3) MOD 4) THEN padder$ = STRING$(4 - ((x& * 3) MOD 4), 0) FOR py& = y& - 1 TO 0 STEP -1 ' read JPG image pixel color data r$ = "" FOR px& = 0 TO x& - 1 c& = POINT(px&, py&) 'POINT 32 bit values are large LONG values IF bytesperpixel& = 1 THEN r$ = r$ + CHR$(c&) ELSE r$ = r$ + LEFT$(MKL$(c&), 3) NEXT px& d$ = d$ + r$ + padder$ NEXT py& _SOURCE lastsource& MID$(b$, 35, 4) = MKL$(LEN(d$)) ' image size(BMP header) b$ = b$ + d$ ' total file data bytes to create file MID$(b$, 3, 4) = MKL$(LEN(b$)) ' size of data file(BMP header) IF LCASE$(RIGHT$(filename$, 4)) <> ".bmp" THEN ext$ = ".bmp" f& = FREEFILE OPEN filename$ + ext$ FOR OUTPUT AS #f&: CLOSE #f& ' erases an existing file OPEN filename$ + ext$ FOR BINARY AS #f& PUT #f&,,b$ CLOSE #f& END SUB

Code by Galleon
This SUB program can also be Included with any program!


SUB Explanation: b$ and d$ assemble the entire string of data to create a bitmap file. Some of the bitmap header info is placed later using a MID$ (statement) to add final header numerical data converted to ASCII characters by MKI$ or MKL$.

After the header, the RGB color settings are created using ASCII characters read backwards as Blue, Green, Red and CHR$(0) as a spacer. MKL$ places the byte values in reverse order too. Bitmaps and icons require that format. LEFT$ trims off the _ALPHA byte.

The actual image is read as pixel attributes from the image bottom to the top for proper formatting with zero padding when necessary.

* Note: 32-bit images will be saved as 24-bit BMP files. All palette indexed images/modes will be saved as 256 color BMP files. Text modes cannot be saved. As QB64 has no official _SAVEIMAGE command yet and QBASIC programs to save screen-shots don't work in QB64 yet this is a very useful alternative.


See also:



Navigation:
Go to Keyword Reference - Alphabetical
Go to Keyword Reference - By usage
Go to Main WIKI Page