RetroCoders Community

Other Basic Programming Languages => QBasic => GWBasic => Topic started by: mysoft on Jan 06, 2024, 04:18 PM

Title: bmp2draw
Post by: mysoft on Jan 06, 2024, 04:18 PM
this is a program written in freebasic that converts a .bmp file into a .txt file that can be used along the gwbasic/qbasic/freebasic draw command.

#include "fbgfx.bi"

dim as long Wid,Hei
dim as short wHdr
var sFile = command$
if len(sFile)=0 then
  print "BMP2TXT Input.bmp"
  print "Will generate a Input.txt suitable for draw"
  end 0
end if
if open(sFile for binary access read as #1) then
  print "failed to open '"+sFile+"'"
  end 2
end if
get #1,,wHdr
if wHdr<>cvshort("BM") then
  print "input must be a paletted .bmp file"
  end 1
end if
get #1,19,Wid : Get #1,,Hei : close #1
screenres 640,480,8,,fb.GFX_NULL
var pImg = ImageCreate(Wid,Hei)
bload sFile,pImg

var iPos = instrrev(sFile,".")
var sFileOut = left(sFile,iPos)+"txt"

open sFileOut for output as #2

var sRow = "",X=0
for Y as long = 0 to Hei-1 
  var iLastC=-1, iC=0, N=0
  for X = 0 to Wid-1
    iC = point(X,Y,pImg)
    if X=(Wid-1) orelse iC <> iLastC then
      dim as string sMore
      if N then
        sMore = "C" & iLastC & "R"
        if N > 1 then sMore &= N
      end if
      if (len(sRow)+len(sMore)) >= 254 then print #2,sRow : sRow=sMore else sRow += sMore
      if X=(Wid-1) andalso iC <> iLastC then
        sMore = "C" & iC & "R0"
        if (len(sRow)+len(sMore)) >= 254 then print #2,sRow : sRow=sMore else sRow += sMore
      end if
      iLastC = iC : N=1     
    else
      N += 1
    end if
  next X 
  if Y <> Hei-1 then
    var sMore = "BDBL" & Wid-1 
    if (len(sRow)+len(sMore)) >= 254 then print #2,sRow : sRow=sMore else sRow += sMore
  end if
next Y
if len(sRow) then print #2,sRow : sRow = ""

usage can be something like this:
10 SCREEN 8
15 DRAW "BM0,0"
20 OPEN "MyImage.txt" FOR INPUT AS #1
30 WHILE NOT EOF(1): INPUT #1, R$: DRAW R$: WEND
40 R$ = "": CLOSE #1
the sample code works in gwbasic/qbasic and freebasic (with -lang qb)

if there's a need to have the tool to be compiled with qbasic itself, let me know...
Title: Re: bmp2draw
Post by: aurel on Jan 07, 2024, 07:30 AM
so trick is in instr() reverse ?
Title: Re: bmp2draw
Post by: mysoft on Jan 08, 2024, 07:07 PM
Quote from: aurel on Jan 07, 2024, 07:30 AMso trick is in instr() reverse ?

not the instrrev is just to locate the last . (dot) so that when you pass file.bmp it emits file.txt
the trick is to use the draw statement and i check for pixels that have the same color so i can emit a single "R###" command instead of multiple "C#R" (so for some simple .bmp files without much detail it actually compresses a bit)