Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
BASIMAGE - Put image files in BAS code to use with _PUTIMAGE
#1

ATTENTION: This program is now out of date and no longer needed to include files in compiled programs.  QB64PE now has a a built-in $EMBED command that does this.  I will leave the program posted here up for archival purposes and for those who have yet to update to the latest QB64PE, but I won’t be updating it anymore.


BASIMAGE converts images to BAS code and sets it up as an image handle to use with _PUTIMAGE to display the image.  Using this program you can easily embed little images to use directly in your code, and inside your EXE programs, without extracting them to disk first.  First the program will ask you for an image to load, then a filename of the BAS code to output.

I will post the BASIMAGE program below first, and then an example program made by BASIMAGE output to show what it can do.

- Dav

Code: (Select All)
'==================
'BASIMAGE.BAS v0.22
'==================
'Coded by Dav for QB64-PE, JULY/2023

'=-=-=-=
'ABOUT :
'=-=-=-=

'BASIMAGE lets you easily put images INSIDE your QB64 compiled programs.
'It does this by loading an image, then converting the screen memory to
'BAS code that you can add to your programs.  When you run the code, it
'recreates the data to an image handle you can use with _PUTIMAGE.

'BASIMAGE will ask you for an image load, and the BAS file to create.

'=========================================================================

DEFINT A-Z
DECLARE FUNCTION E$ (B$)

PRINT
PRINT "=============="
PRINT "BASIMAGE v0.22"
PRINT "=============="
PRINT

INPUT "IMAGE File to load --> ", IN$
INPUT "BAS File to make ----> ", OUT$: IF OUT$ = "" THEN END

'Load image file to screen mode
SCREEN _LOADIMAGE(IN$, 32): SLEEP 1
DIM m AS _MEM: m = _MEMIMAGE(0)

'Grab screen data
INDATA$ = SPACE$(m.SIZE)
_MEMGET m, m.OFFSET, INDATA$
'Compress it
INDATA$ = _DEFLATE$(INDATA$)
'get screen specs
wid = _WIDTH: hih = _HEIGHT

SCREEN 0

OPEN OUT$ FOR OUTPUT AS 2
PRINT: PRINT "Converting image to BAS code...";

Q$ = CHR$(34) 'quotation mark
SCREEN _NEWIMAGE(600, 600, 32)
pic& = BASIMAGE1&
_PUTIMAGE (0, 0), pic&

PRINT #2, "'EXAMPLE USAGE OF BASIMAGE1&"
PRINT #2, "'==========================="
PRINT #2, "'SCREEN _NEWIMAGE(600, 600, 32)"
PRINT #2, "'pic& = BASIMAGE1&: _PUTIMAGE (0, 0), pic&"
PRINT #2, ""
PRINT #2, "FUNCTION BASIMAGE1& '"; IN$
PRINT #2, "v&=_NEWIMAGE("; wid; ","; hih; ",32)"
PRINT #2, "DIM m AS _MEM:m=_MEMIMAGE(v&)"
PRINT #2, "A$ = "; Q$; Q$
PRINT #2, "A$ = A$ + "; Q$;

BC& = 1

DO
    a$ = MID$(INDATA$, BC&, 3)
    BC& = BC& + 3: LL& = LL& + 4
    IF LL& = 60 THEN
        LL& = 0
        PRINT #2, E$(a$);: PRINT #2, Q$
        PRINT #2, "A$ = A$ + "; Q$;
    ELSE
        PRINT #2, E$(a$);
    END IF
    IF LEN(INDATA$) - BC& < 3 THEN
        a$ = MID$(INDATA$, LEN(INDATA$) - BC&, 1): B$ = E$(a$)
        SELECT CASE LEN(B$)
            CASE 0: a$ = Q$
            CASE 1: a$ = "%%%" + B$ + Q$
            CASE 2: a$ = "%%" + B$ + Q$
            CASE 3: a$ = "%" + B$ + Q$
        END SELECT: PRINT #2, a$;: EXIT DO
    END IF
LOOP: PRINT #2, ""

PRINT #2, "btemp$="; Q$; Q$
PRINT #2, "FOR i&=1TO LEN(A$) STEP 4:B$=MID$(A$,i&,4)"
PRINT #2, "IF INSTR(1,B$,"; Q$; "%"; Q$; ") THEN"
PRINT #2, "FOR C%=1 TO LEN(B$):F$=MID$(B$,C%,1)"
PRINT #2, "IF F$<>"; Q$; "%"; Q$; "THEN C$=C$+F$"
PRINT #2, "NEXT:B$=C$:END IF:FOR j=1 TO LEN(B$)"
PRINT #2, "IF MID$(B$,j,1)="; Q$; "#"; Q$; " THEN"
PRINT #2, "MID$(B$,j)="; Q$; "@"; Q$; ":END IF:NEXT"
PRINT #2, "FOR t%=LEN(B$) TO 1 STEP-1"
PRINT #2, "B&=B&*64+ASC(MID$(B$,t%))-48"
PRINT #2, "NEXT:X$="; Q$; Q$; ":FOR t%=1 TO LEN(B$)-1"
PRINT #2, "X$=X$+CHR$(B& AND 255):B&=B&\256"
PRINT #2, "NEXT:btemp$=btemp$+X$:NEXT"
PRINT #2, "btemp$=_INFLATE$(btemp$,m.SIZE)"
PRINT #2, "_MEMPUT m, m.OFFSET, btemp$: _MEMFREE m"
PRINT #2, "BASIMAGE1& = _COPYIMAGE(v&): _FREEIMAGE v&"
PRINT #2, "END FUNCTION"

PRINT "Done!"
PRINT UCASE$(OUT$); " saved."
END

FUNCTION E$ (B$)

    FOR T% = LEN(B$) TO 1 STEP -1
        B& = B& * 256 + ASC(MID$(B$, T%))
    NEXT

    a$ = ""
    FOR T% = 1 TO LEN(B$) + 1
        g$ = CHR$(48 + (B& AND 63)): B& = B& \ 64
        'If @ is here, replace it with #
        'To fix problem posting code in the QB64 forum.
        'It'll be restored during the decoding process.
        IF g$ = "@" THEN g$ = "#"
        a$ = a$ + g$
    NEXT: E$ = a$

END FUNCTION


And here's a sample output program made with code BASIMAGE output.  This program shows a small chess piece image which is embedded as code.

Code: (Select All)
'KING.BAS
'Example of what BASIMAGE can do

king& = BASIMAGE1& 'Load the king image

SCREEN _NEWIMAGE(600, 600, 32) 'set up a screen
_PUTIMAGE (0, 0), king& 'put it on screen

FUNCTION BASIMAGE1& 'king.png
    v& = _NEWIMAGE(150, 150, 32)
    DIM m AS _MEM: m = _MEMIMAGE(v&)
    A$ = ""
    A$ = A$ + "haIkMfSLK3346EG7GZBeZBGZBejBEjBgVbDV[#>6i\i<0a>344hoPhKGXGaK"
    A$ = A$ + "6C8>V[Fl60A0#`3ONh`100000V1_ofU?Okj[gQjH2l=W?MLh?e0a7h?6eYn6"
    A$ = A$ + "34WP_0_2f3bmZolkO5i^cb0a9h7:eFEA_:P1RG`NLiecONjh;A6k<7d[:`[W"
    A$ = A$ + "?Q_m<c2>kUhEo7eOoPfc2>k_M:L;HBb:9gMF;?LUDom4J;IUPG1EQ5Lfd?8\"
    A$ = A$ + "8F`ISC1K56o:H_8Ol\HlfQJ0N5DK:=fkd?8\Ib:QaB0f<IU`hD1KUQFK<hF`"
    A$ = A$ + "JIY>5^5TBliNH6WiZmZ<>6^703lm6Z3C]NZ6SU<OPohmgFmeQeYU?HF[9m_8"
    A$ = A$ + "llKE[iJ>hF1B;;lo?j=c=N^M57cH<EK6edQf:Cjn68O27><dWXfOV31O7obP"
    A$ = A$ + "h#GJ<`]<0IU4Nn7Dk5hEM2hE`>kE1Dk5edYHo51gZfN5>UA`i^EJ\7772eiC"
    A$ = A$ + "XXK56SAe^bJLZ8ZcS`PNE0enbZl:ei#X;L[dHmFH<BEWoPIiFZmVijD<oc>Q"
    A$ = A$ + "_n[`JDA]o<IOO1DW_P5iEFe]BS_KGYo?GAbAZm8J[ZS8[4enDA_BM>2f\KYf"
    A$ = A$ + "W2l`jlCMn1f\GYN\BcGkQlkZl;OTEGV_FQEeoge;WaYl>IUH1_BN>1Z^KY`Y"
    A$ = A$ + ">Vo\1Y>O0MQGUNm3[o#ii3XjNU2gj^[_jL1\K^5N5hM_jQ8AMN0f=_ZUSUEj"
    A$ = A$ + "eUeGL7BF9d78\7^5N5d3N5??4M<hE`>jDOG?_g>ELN0C^V\6fk0d71c3mA0<"
    A$ = A$ + "Gd71;3mA0<1aiO;Y4;^OPT7SG_`hJIN<^C=TK9?_1cf[Dk>C1NUS8iX`lVXf"
    A$ = A$ + "M6R7f__EWgPA9_o5;jFi>5on:O`3of533>U_H;kGo=3mA0\2:iFVhgXSCiO<"
    A$ = A$ + "XGaL5f1DXDe]EQGe9X?2^7mA0D;d71o3mA0DAR__\B:ABOP68?0eWK9_WSJ]"
    A$ = A$ + "G5_gD3T30l:`7T>o9]f[n0_ZKAYGm>[1i^UdeKN[m:FKkm;Yc7Mcm:fOnjFB"
    A$ = A$ + "Og:gJ_RmX_nUdmg\FkEl>UXS9iXFkE<WPM<2mZ8Zon3hEPO0_2`[0_0N5PG1"
    A$ = A$ + "N1l:0_2L0FHmRbJ`Zo8M^1EiE<G>M8IU8YO`0Zc3`^iEQf=JUGakb[>WTSJi"
    A$ = A$ + "kKRdeD?NE7BbA]bY:fGXjl0PG1f7l:0_2l2hE#UAeH]Gb[H<gk8b:AJkE1DW"
    A$ = A$ + "?PZkEQaCZeNEL_Y5_Zo8iXFkDlK\jH`[0l:`14gG4<VG5_oD3TKP=#bA]hMT"
    A$ = A$ + "j#T_n_TWGPECnk1GE>5]IeITLD;GcEdVEWCbAZMZB]I9?o0hEP=8[4enDA_2"
    A$ = A$ + "gbOH#WRf\j0`[PMdY\`m1V3gGXC9i8e>4]Ie9h0W2gbITERJ_IAN5^U=aI>5"
    A$ = A$ + "^U]iQWWH7iD3iF\6heBLoI9[dOna=iNB=L[hkL53TSOjX#YZMSJkFADWWOFH"
    A$ = A$ + "P?A]C\[^5nECmYC7OA^7POiHb:YUkc#Z9O]9RK]?>UjjIcdnUjj5_3>EIgBM"
    A$ = A$ + "mRS9OL4DG_ZT`hWTV;HL8ZSCm\kFUb5hF;0mAP?AO4HGd71n6mAPm8[TNN\Y"
    A$ = A$ + "Z5?\n0a]6eYDGOi=`]Vf[DG7iE`[`[`[`[l2hESkEFliWajl`HmY^nd:X?2j"
    A$ = A$ + "6RgSXlX`#X?2j3d71fR2UZ^o5[3NebL:eeGN3L[Ym:eeAN5l:l:lZfkEhFKd"
    A$ = A$ + "Y`[6d[Pe3Sc#6jS0g3>e8X?2l9jS000`5lG0Z8mh%%%0"
    btemp$ = ""
    FOR i& = 1 TO LEN(A$) STEP 4: B$ = MID$(A$, i&, 4)
        IF INSTR(1, B$, "%") THEN
            FOR C% = 1 TO LEN(B$): F$ = MID$(B$, C%, 1)
                IF F$ <> "%" THEN C$ = C$ + F$
            NEXT: B$ = C$: END IF: FOR j = 1 TO LEN(B$)
            IF MID$(B$, j, 1) = "#" THEN
        MID$(B$, j) = "@": END IF: NEXT
        FOR t% = LEN(B$) TO 1 STEP -1
            B& = B& * 64 + ASC(MID$(B$, t%)) - 48
            NEXT: X$ = "": FOR t% = 1 TO LEN(B$) - 1
            X$ = X$ + CHR$(B& AND 255): B& = B& \ 256
    NEXT: btemp$ = btemp$ + X$: NEXT
    btemp$ = _INFLATE$(btemp$,m.SIZE)
    _MEMPUT m, m.OFFSET, btemp$: _MEMFREE m
    BASIMAGE1& = _COPYIMAGE(v&): _FREEIMAGE v&
END FUNCTION

Find my programs here in Dav's QB64 Corner
Reply


Messages In This Thread
BASIMAGE - Put image files in BAS code to use with _PUTIMAGE - by Dav - 04-26-2022, 11:23 PM



Users browsing this thread: 2 Guest(s)