Difference between revisions of "SaveIcon32"

From QB64 Wiki
Jump to navigation Jump to search
imported>Clippy
m
imported>Clippy
m
Line 1: Line 1:
The following Icon creation procedure was adapted from Galleon's [[SAVEIMAGE]] sup-procedure that creats 8 BPP or 32 bit bitmaps:
+
The following Icon creation procedure was adapted from Galleon's [[SAVEIMAGE]] sup-procedure that creates 8 BPP or 32 bit bitmaps:
  
 
{{CodeStart}} '' ''
 
{{CodeStart}} '' ''
Line 11: Line 11:
 
   {{Cl|LOCATE}} 10, 10: {{Cl|LINE INPUT}} "Enter the icon size to use(multiple of 16): ", sz$
 
   {{Cl|LOCATE}} 10, 10: {{Cl|LINE INPUT}} "Enter the icon size to use(multiple of 16): ", sz$
 
   size& = {{Cl|VAL}}(sz$)
 
   size& = {{Cl|VAL}}(sz$)
{{Cl|LOOP}} {{Cl|UNTIL}} size& {{Cl|MOD}} 16 = 0
+
{{Cl|LOOP}} {{Cl|UNTIL}} size& {{Cl|MOD}} 16 = 0 AND size& >= 16 AND size& <= 128
 
DO
 
DO
 
   {{Cl|LOCATE}} 10, 10: {{Cl|LINE INPUT}} "Enter the image file name to convert to an icon: ", BMP$
 
   {{Cl|LOCATE}} 10, 10: {{Cl|LINE INPUT}} "Enter the image file name to convert to an icon: ", BMP$
Line 35: Line 35:
 
{{Cl|IF...THEN|IF}} bytesperpixel& = 0 {{Cl|THEN}} {{Cl|PRINT}} "Text modes unsupported!": {{Cl|END}}
 
{{Cl|IF...THEN|IF}} bytesperpixel& = 0 {{Cl|THEN}} {{Cl|PRINT}} "Text modes unsupported!": {{Cl|END}}
 
{{Cl|IF...THEN|IF}} bytesperpixel& = 1 {{Cl|THEN}} bpp& = 8: bp% = 1 {{Cl|ELSE}} bpp& = 24: bp% = 3
 
{{Cl|IF...THEN|IF}} bytesperpixel& = 1 {{Cl|THEN}} bpp& = 8: bp% = 1 {{Cl|ELSE}} bpp& = 24: bp% = 3
x& = size&
+
x& = size& 'not to exceed 128!
 
y& = size&
 
y& = size&
 
+
'Icon, Entry & BMP headers:  width  depth    colors                      byte size - offset
 
b$= {{Cl|MKI$}}(0)+{{Cl|MKI$}}(1)+{{Cl|MKI$}}(1)+{{Cl|CHR$}}(x&)+{{Cl|CHR$}}(y&)+{{Cl|CHR$}}(0)+{{Cl|CHR$}}(0)+{{Cl|MKI$}}(0)+{{Cl|MKI$}}(0)+"????"+{{Cl|MKL$}}(22) _
 
b$= {{Cl|MKI$}}(0)+{{Cl|MKI$}}(1)+{{Cl|MKI$}}(1)+{{Cl|CHR$}}(x&)+{{Cl|CHR$}}(y&)+{{Cl|CHR$}}(0)+{{Cl|CHR$}}(0)+{{Cl|MKI$}}(0)+{{Cl|MKI$}}(0)+"????"+{{Cl|MKL$}}(22) _
 
  +{{Cl|MKL$}}(40)+{{Cl|MKL$}}(x&)+{{Cl|MKL$}}(2 * y&)+{{Cl|MKI$}}(1)+{{Cl|MKI$}}(bpp&)+{{Cl|MKL$}}(0)+"????"+{{Cl|MKL$}}(0)+{{Cl|MKL$}}(0)+{{Cl|MKL$}}(0)+{{Cl|MKL$}}(0)
 
  +{{Cl|MKL$}}(40)+{{Cl|MKL$}}(x&)+{{Cl|MKL$}}(2 * y&)+{{Cl|MKI$}}(1)+{{Cl|MKI$}}(bpp&)+{{Cl|MKL$}}(0)+"????"+{{Cl|MKL$}}(0)+{{Cl|MKL$}}(0)+{{Cl|MKL$}}(0)+{{Cl|MKL$}}(0)
 +
'BMP size        double * height plane BPP            raw size
 
{{Cl|IF...THEN|IF}} bytesperpixel& = 1 {{Cl|THEN}}
 
{{Cl|IF...THEN|IF}} bytesperpixel& = 1 {{Cl|THEN}}
 
   {{Cl|FOR...NEXT|FOR}} c& = 0 {{Cl|TO}} 255 ' read BGR color settings from image + 1 byte spacer({{Cl|CHR$}}(0))
 
   {{Cl|FOR...NEXT|FOR}} c& = 0 {{Cl|TO}} 255 ' read BGR color settings from image + 1 byte spacer({{Cl|CHR$}}(0))
Line 48: Line 49:
 
lastsource& = {{Cl|_SOURCE}}
 
lastsource& = {{Cl|_SOURCE}}
 
{{Cl|_SOURCE}} 0
 
{{Cl|_SOURCE}} 0
{{Cl|IF...THEN|IF}} (x& {{Cl|MOD}} 32) {{Cl|THEN}} pad& = 32 - (x& {{Cl|MOD}} 32) 'not used in 32 X 32
+
{{Cl|IF...THEN|IF}} (x& {{Cl|MOD}} 32) {{Cl|THEN}} pad& = 32 - (x& {{Cl|MOD}} 32) 'not used in 32 X 32 multiples
 
{{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$ = ""
Line 57: Line 58:
 
   d$ = d$ + r$ '+ padder$
 
   d$ = d$ + r$ '+ padder$
 
{{Cl|NEXT}} py&
 
{{Cl|NEXT}} py&
a$ = {{Cl|STRING$}}(bp% * y& * (x& + pad&) \ 8, 0) 'totally black {{Cl|AND (boolean)|AND}} mask
+
a$ = {{Cl|STRING$}}(bp% * y& * (x& + pad&) \ 8, 0) 'totally black {{Cl|AND}} mask
 
d$ = d$ + a$
 
d$ = d$ + a$
 
{{Cl|_SOURCE}} lastsource&
 
{{Cl|_SOURCE}} lastsource&
{{Cl|MID$}}(b$, 43, 4) = {{Cl|MKL$}}({{Cl|LEN}}(d$)) ' image size(BMP header) with {{Cl|AND (boolean)|AND}} mask
+
{{Cl|MID$}}(b$, 43, 4) = {{Cl|MKL$}}({{Cl|LEN}}(d$)) 'raw image size with {{Cl|AND}} mask
 
b$ = b$ + d$ ' total file data bytes to create file
 
b$ = b$ + d$ ' total file data bytes to create file
{{Cl|MID$}}(b$, 15, 4) = {{Cl|MKL$}}({{Cl|LEN}}(b$) - 22) ' size of data file
+
{{Cl|MID$}}(b$, 15, 4) = {{Cl|MKL$}}({{Cl|LEN}}(b$) - 22) ' size of data file minus Entry header offset
 
{{Cl|IF...THEN|IF}} {{Cl|LCASE$}}({{Cl|RIGHT$}}(filename$, 4)) <> ".ico" {{Cl|THEN}} ext$ = ".ico"
 
{{Cl|IF...THEN|IF}} {{Cl|LCASE$}}({{Cl|RIGHT$}}(filename$, 4)) <> ".ico" {{Cl|THEN}} ext$ = ".ico"
 
f& = {{Cl|FREEFILE}}
 
f& = {{Cl|FREEFILE}}
Line 69: Line 70:
 
{{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 Ted Weissgerber}}
 
{{small|Code by Ted Weissgerber}}

Revision as of 18:09, 6 November 2011

The following Icon creation procedure was adapted from Galleon's SAVEIMAGE sup-procedure that creates 8 BPP or 32 bit bitmaps:

DO LINE INPUT "Use 8 bit(256 colors) or 32 bit image? ", bit$ mode% = VAL(bit$) LOOP UNTIL mode% = 8 OR mode% = 32 IF mode% = 8 THEN mode% = 256 SCREEN _NEWIMAGE(640, 480, mode%) DO LOCATE 10, 10: LINE INPUT "Enter the icon size to use(multiple of 16): ", sz$ size& = VAL(sz$) LOOP UNTIL size& MOD 16 = 0 AND size& >= 16 AND size& <= 128 DO LOCATE 10, 10: LINE INPUT "Enter the image file name to convert to an icon: ", BMP$ CLS LOOP UNTIL _FILEEXISTS(BMP$) img& = _LOADIMAGE(BMP$) IF img& = -1 OR img& = 0 THEN LOCATE 15, 25: PRINT "Image failed to load!": END CLS , _RGB(255, 255, 255) IF mode% = 256 THEN _COPYPALETTE (img&) _PUTIMAGE (0, 0)-(size& - 1, size& - 1), img&, 0 '(31, 31), img&, 0 '<<<<<<<<<<< LOCATE 20, 10: PRINT "Do you want to make an icon out of the image? (Y/N)" K$ = INPUT$(1) IF UCASE$(K$) <> "Y" THEN END SaveFile$ = LEFT$(BMP$, INSTR(BMP$, ".")) + "ico" SaveIcon32 img&, size&, SaveFile$ END SUB SaveIcon32 (image AS LONG, size AS LONG, filename AS STRING) bytesperpixel& = _PIXELSIZE(image&) IF bytesperpixel& = 0 THEN PRINT "Text modes unsupported!": END IF bytesperpixel& = 1 THEN bpp& = 8: bp% = 1 ELSE bpp& = 24: bp% = 3 x& = size& 'not to exceed 128! y& = size& 'Icon, Entry & BMP headers: width depth colors byte size - offset b$= MKI$(0)+MKI$(1)+MKI$(1)+CHR$(x&)+CHR$(y&)+CHR$(0)+CHR$(0)+MKI$(0)+MKI$(0)+"????"+MKL$(22) _ +MKL$(40)+MKL$(x&)+MKL$(2 * y&)+MKI$(1)+MKI$(bpp&)+MKL$(0)+"????"+MKL$(0)+MKL$(0)+MKL$(0)+MKL$(0) 'BMP size double * height plane BPP raw size IF bytesperpixel& = 1 THEN FOR c& = 0 TO 255 ' read BGR color settings from 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 lastsource& = _SOURCE _SOURCE 0 IF (x& MOD 32) THEN pad& = 32 - (x& MOD 32) 'not used in 32 X 32 multiples 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&) IF bytesperpixel& = 1 THEN r$ = r$ + CHR$(c&) ELSE r$ = r$ + LEFT$(MKL$(c&), 3) NEXT px& d$ = d$ + r$ '+ padder$ NEXT py& a$ = STRING$(bp% * y& * (x& + pad&) \ 8, 0) 'totally black AND mask d$ = d$ + a$ _SOURCE lastsource& MID$(b$, 43, 4) = MKL$(LEN(d$)) 'raw image size with AND mask b$ = b$ + d$ ' total file data bytes to create file MID$(b$, 15, 4) = MKL$(LEN(b$) - 22) ' size of data file minus Entry header offset IF LCASE$(RIGHT$(filename$, 4)) <> ".ico" THEN ext$ = ".ico" 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 Ted Weissgerber
Explanation: The icons created only have a black AND mask for simplicity so the background is changed to white using CLS.
SPACE$(2) gives the icon entry header the 32 X 32 dimensions as spaces are CHR$(32). Smaller icons would require padding.
In the header, ???? is later replaced with size data. If the image is 24/32 BPP, the size of the image data will triple with bp%.
Note: Icon sizes that are not multiples of 32 require AND mask padding to multiples of 4 bytes!

IF Width MOD 32 THEN ANDpad% = 32 - (Width MOD 32)


See also:



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