SAVEIMAGE: Difference between revisions

From QB64 Phoenix Edition Wiki
Jump to navigation Jump to search
m (QBasic capitalisation)
Tag: visualeditor
No edit summary
Line 7: Line 7:
* Bitmaps can be 1, 4, 8 or 24/32 bits per pixel(BPP) color palettes. QB64 is capable of working with high color bitmaps.
* 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.
* 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 14: Line 14:


: Module Demo Code: Change the _LOADIMAGE filename to an image file you can access.
: Module Demo Code: Change the _LOADIMAGE filename to an image file you can access.
{{CodeStart}} '' ''
{{CodeStart}}
i& = {{Cl|_LOADIMAGE}}("nice.jpg",32) ' loads a 32 bit .JPG file image
i& = {{Cl|_LOADIMAGE}}("nice.jpg",32) ' loads a 32 bit .JPG file image
SaveImage i&, "nice"      'saves it as .BMP file "nice.bmp"
SaveImage i&, "nice"      'saves it as .BMP file "nice.bmp"
Line 20: Line 20:
{{Cl|END}}
{{Cl|END}}
{{CodeEnd}}
{{CodeEnd}}
{{CodeStart}} '' ''
{{CodeStart}}
{{Cl|SUB}} SaveImage (image {{Cl|AS}} {{Cl|LONG}}, filename {{Cl|AS}} {{Cl|STRING}})
{{Cl|SUB}} SaveImage (image {{Cl|AS}} {{Cl|LONG}}, filename {{Cl|AS}} {{Cl|STRING}})
bytesperpixel& = {{Cl|_PIXELSIZE}}(image&)
bytesperpixel& = {{Cl|_PIXELSIZE}}(image&)
Line 30: Line 30:
{{Cl|IF}} bytesperpixel& = 1 {{Cl|THEN}}
{{Cl|IF}} bytesperpixel& = 1 {{Cl|THEN}}
   {{Cl|FOR...NEXT|FOR}} c& = 0 {{Cl|TO}} 255 ' read BGR color settings from JPG image + 1 byte spacer({{Cl|CHR$}}(0))
   {{Cl|FOR...NEXT|FOR}} c& = 0 {{Cl|TO}} 255 ' read BGR color settings from JPG image + 1 byte spacer({{Cl|CHR$}}(0))
     cv& = {{Cl|_PALETTECOLOR (function)|_PALETTECOLOR}}(c&, image&) ' color attribute to read.  
     cv& = {{Cl|_PALETTECOLOR (function)|_PALETTECOLOR}}(c&, image&) ' color attribute to read.
     b$ = b$ +{{Cl|CHR$}}({{Cl|_BLUE32}}(cv&))+{{Cl|CHR$}}({{Cl|_GREEN32}}(cv&))+{{Cl|CHR$}}({{Cl|_RED32}}(cv&))+{{Cl|CHR$}}(0) 'spacer byte
     b$ = b$ +{{Cl|CHR$}}({{Cl|_BLUE32}}(cv&))+{{Cl|CHR$}}({{Cl|_GREEN32}}(cv&))+{{Cl|CHR$}}({{Cl|_RED32}}(cv&))+{{Cl|CHR$}}(0) 'spacer byte
   {{Cl|NEXT}}
   {{Cl|NEXT}}
Line 38: Line 38:
{{Cl|_SOURCE}} image&
{{Cl|_SOURCE}} image&
{{Cl|IF}} ((x& * 3) {{Cl|MOD}} 4) {{Cl|THEN}} padder$ = {{Cl|STRING$}}(4 - ((x& * 3) {{Cl|MOD}} 4), 0)
{{Cl|IF}} ((x& * 3) {{Cl|MOD}} 4) {{Cl|THEN}} padder$ = {{Cl|STRING$}}(4 - ((x& * 3) {{Cl|MOD}} 4), 0)
{{Cl|FOR...NEXT|FOR}} py& = y& - 1 {{Cl|TO}} 0 {{Cl|STEP}} -1 ' read JPG image pixel color data  
{{Cl|FOR...NEXT|FOR}} py& = y& - 1 {{Cl|TO}} 0 {{Cl|STEP}} -1 ' read JPG image pixel color data
   r$ = ""
   r$ = ""
   {{Cl|FOR...NEXT|FOR}} px& = 0 {{Cl|TO}} x& - 1
   {{Cl|FOR...NEXT|FOR}} px& = 0 {{Cl|TO}} x& - 1
   c& = {{Cl|POINT}}(px&, py&) 'POINT 32 bit values are large {{Cl|LONG}} values  
   c& = {{Cl|POINT}}(px&, py&) 'POINT 32 bit values are large {{Cl|LONG}} values
   {{Cl|IF}} bytesperpixel& = 1 {{Cl|THEN}} r$ = r$ + {{Cl|CHR$}}(c&) {{Cl|ELSE}} r$ = r$ + {{Cl|LEFT$}}({{Cl|MKL$}}(c&), 3)
   {{Cl|IF}} bytesperpixel& = 1 {{Cl|THEN}} r$ = r$ + {{Cl|CHR$}}(c&) {{Cl|ELSE}} r$ = r$ + {{Cl|LEFT$}}({{Cl|MKL$}}(c&), 3)
   {{Cl|NEXT}} px&
   {{Cl|NEXT}} px&
   d$ = d$ + r$ + padder$
   d$ = d$ + r$ + padder$
{{Cl|NEXT}} py&
{{Cl|NEXT}} py&
Line 56: Line 56:
{{Cl|PUT}} #f&,,b$
{{Cl|PUT}} #f&,,b$
{{Cl|CLOSE}} #f&
{{Cl|CLOSE}} #f&
{{Cl|END SUB}} '' ''    
{{Cl|END SUB}} '' ''
{{CodeEnd}}
{{CodeEnd}}
{{small|Code by Galleon}}
{{small|Code by Galleon}}
Line 62: Line 62:




''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$]].  
''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.
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.

Revision as of 02:33, 23 January 2023

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:
Main Page with Articles and Tutorials
Keyword Reference - Alphabetical
Keyword Reference - By usage
Report a broken link