Forum Liberty Basic France

Le 28/11/2020 à 12h29

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2484
@ Christoff:
Dans ton code lecture de fichier BMP, je trouve ça:
Code VB :
 
    for a=0 to qtoct-1
        fich(a)=asc(input$(#f,1))
    next
 

Si tu a un moment, peux-tu m'expliquer le:
asc(input$(#f,1))
et plus particulièrement, le:
input$(#f,1)
Et son rapport avec le: "line input #g, lesdonnées$" conventionnel
En clair je voudrais voir ta procédure: "asc(input$(#f,1))" sous la forme conventionnelle.
Merci d'avance.
____________________
Roro

   
Le 28/11/2020 à 20h44

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 741
Salutations du soir, cher Roland, j'amène ci-joint la réponse à ta question,

line input se base sur un caractère de fin de ligne qui n'existe que dans les fichiers texte, il n'y en a pas dans les bitmaps, et on utilise alors des input(#f,longueur du mot attendu) pour lire les données (mots de deux ou quatre octets dans le cas du bitmap, ou de la longueur qu'on veut, si on sait pourquoi on le fait et comment le gérer).

En phase d'expérimentation, comme ici, je fais une lecture octet par octet, par excès de précaution et pour faciliter le débogage : on a accès aux données brutes, dont on peut afficher le code ascii dans la mainwin en insérant un print a;" ";fich(a) dans la boucle, qui donne à la fois la position de l'octet et sa valeur. Très utile pour comparer ce qu'on lit avec ce qu'on croit devoir lire.

Une autre raison est l'utilisation peu conventionnelle qui fait tourner JB sous linux avec Wine. Wine fait son travail en ce qui concerne les fichiers, et un fichier windows sera lu et écrit par JB comme si on était sous windows. Mais, comme ce n'est pas l'environnement naturel de JB, je fais une pré-lecture du fichier pour en déterminer le nombre d'octets tel que le voit JB par l'intermédiaire de Wine, et je n'utilise pas l'instruction basic ad-hoc lof(). j'ai juste pris en compte un éventuel risque de bug de wine.

Comme d'habitude j'en ai écrit trois kilomètres (et j'essaie de faire des progrès;). En espérant avoir répondu à ta question.
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 29/11/2020 à 00h39

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2484
Donc le: "input$(#f,1)" est une espèce de "template" pour ne lire et ne stocker qu'un caractère à chaque tour.
Mais c'est écrit nulle part ce truc, d'où le sors-tu ???
Confirme que c'est ça car c'est la clé d'accès au fichier.
____________________
Roro

   
Le 29/11/2020 à 12h09

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 741
Bah oui, c'est bien ça, on lit octet par octet.

Et, comment dire, et serais-je un tantinet moqueur : dans l'aide, chapitre "file operations", et clic sur input$ ;) M'enfin, qu'y avait-il sur tes lunettes ce jour-là ??? (Moqueur auto-dérisionnel, je te l'assure, j'ai d'autres gags à mon actif)

Je viens de relire l'aide : il y a aussi une possibilité de placer directement un fichier dans un tableau. Sûrement bien commode, déjà abordé sur le forum il y a bien longtemps mais avec la formulation "line input" (11ème post), et complètement oublié depuis.
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 29/11/2020 à 12h30

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2484
Ah ok, c'est dans "Binary files" c'est normal que je ne l'ai pas vu, puisque je n'ai jamais touché aux binary.
Bon, de retour des Amériques, la pêche a été bonne.
Lien du thread: https://justbasiccom.proboards.com/thread/597/generate-bmp-file-jb?page=1&scrollTo=3795
Avec le pluggin de traducction de Firefox c'est assez bien traduit.
Quelqu'un a dit que la largeur devait être un multiple de 4, mais comme il a parlé de format ppm et n'a pas donné de code, je ne le cite pas.
Y a de quoi cogiter.
ROD a donné ça:
Code VB :
 
[loadbmp]
        filedialog "Choose an image","*.bmp",file$
        if file$<>"" then
            loadbmp "pic",file$
            open file$ for input as #bmp
            'get the file into a string
            bmp$ = Input$(#bmp,lof(#bmp))
            'analyse the file header
            bmpw=value(mid$(bmp$,19,4)) 'width
            bmph=value(mid$(bmp$,23,4)) 'height
            b=value(mid$(bmp$,29,2))    'bits per pixel, ie color depth
            o=value(mid$(bmp$,11,4))    'picture data offset, where the color data starts
            close #bmp
        end if
        'work out start of picture data and how to move through file
        o=o+1
        'work out how many bytes to step through the string 8=1 24=3 32=4
        st=b/8
        'work out padding each raster line must be a 4byte multiple
        mult=b/8*bmpw/4
        padding = 4*(1-(mult-int(mult))) mod 4
 
        for y=bmph-1 to 0 step -1
            for x=0 to bmpw-1
                'run through bmp
                if b=8 then
                    'color stored in pallet index at start of file
                    'pallet starts at 54 in steps of four ABGR A=alpha
                    pi=asc(mid$(bmp$,o,1))*4+54
                else
                    'color stored as BGR Liberty needs RGB
                end if
            o=o+st
            next
        o=o+padding
        next
    wait
function value(x$)
    select case len(x$)
        case 1
        value = asc(x$)
        case 2
        value=asc(mid$(x$,1,1))
        value=value+(asc(mid$(x$,2,1))*256)
        case 3
        value=asc(mid$(x$,1,1))
        value=value+(asc(mid$(x$,2,1))*256)
        value=value+(asc(mid$(x$,3,1))*65536)
        case 4
        value=asc(mid$(x$,1,1))
        value=value+(asc(mid$(x$,2,1))*256)
        value=value+(asc(mid$(x$,3,1))*65536)
        value=value+(asc(mid$(x$,4,1))*16777216)
    end select
end function
 

------------------------------------------------------
Et TSH73 a donné ça:
Code VB :
 
'Writing 256 color BMP (that is, paletted)
'by tsh73, October 2007
'of several sources
'nomainwin
'/* bmp write stuff
global BMP.width, BMP.height
'ALL ARRAYS USED FROM 0
dim BMPpalette$(256)   'colors as text, like "255 100 23" - useful from JB
dim BMPdata(0,0)       'to be REDIM'med
'*/ bmp write stuff

dim info$(10, 10)
 
'test data
BMP.width = 100 'different if divided/not divided by 4
BMP.height = 256
redim BMPdata(BMP.width,BMP.height)
 
'Making some palette    'R G B
t0 = time$("ms")
for i = 0 to 255
    'gray one
    BMPpalette$(i) = i;" ";i;" ";i
next
t1 = time$("ms")
print "Palette, ms ", t1-t0
 
'making some data
for x = 0 to BMP.width-1
    for y = 0 to BMP.height-1
        BMPdata(x,y) = y mod 256 'fix Nov 28 2020 for bigger heights
    next
next
t2 = time$("ms")
print "Array, ms ", t2-t1
 
OutFile$ = "test1.bmp"
'make sure file not extst
if fileExists(DefaultDir$, OutFile$) then
    kill OutFile$
end if
 
t2 = time$("ms")
'call functions
call writeFromArray OutFile$
t3 = time$("ms")
print "writeFromArray, ms ", t3-t2
 
print "Over!"
end
 
'------------------------------------------------------'
'Functions:
function createHeader$()
    'create string with header
    createHeader$ = ""
end function
 
function pal2binPal$()
    'BMPpalette$() -> palette$ string
    pal2binPal$ = ""
    for i = 0 to 256
     pal2binPal$ = pal2binPal$ _
        + chr$(val(word$(BMPpalette$(i),3))) _
        + chr$(val(word$(BMPpalette$(i),2))) _
        + chr$(val(word$(BMPpalette$(i),1))) _
        + chr$(0)
    next
end function
 
function data2Raw$()
    'BMPdata() -> raw$ string
    data2Raw$ = ""
end function
 
sub writeFromArray fname$
    BMPheader$ = createHeader$()
    palette$ = pal2binPal$()
    'write stuff
    'filler pads to dividable by 4 bytes
    fillLen = iif(BMP.width mod 4, 4 - BMP.width mod 4, 0)
    filler$=left$(chr$(0)+chr$(0)+chr$(0), fillLen)
    open fname$ for binary as #BMPout
        print #BMPout, BMPheader$
        print #BMPout, palette$ 
        for y = BMP.height-1 to 0 step -1
            'create line
            aLine$=""
            for x = 0 to BMP.width-1
                aLine$=aLine$+chr$(BMPdata(x,y))
            next
            'add filler
            aLine$=aLine$+filler$
            'write line
            print #BMPout, aLine$
        next
    close #BMPout
end sub
 
sub writeFromRaw fname$
end sub
 
'------------------------------------------------------'

    UpperLeftX = 1
    UpperLeftY = 1
    'for bitmap width be better dividable by 4
    WindowWidth = 320
    WindowHeight = 200
'    WindowWidth = 640
'    WindowHeight = 480
'    WindowWidth = 512
'    WindowHeight = 512

'increase window size so we get our requested size
print "Adjusting window for borders..."
'   call adjustWindowSize WindowWidth, WindowHeight
   print WindowWidth, WindowHeight
 
   open "plasma" for graphics_nsb_nf as #gr
'   open "plasma" for graphics_nsb_fs as #gr
   #gr, "trapclose quit"
   #gr, "home ; down ; posxy x y"
   width = 2*x : height = 2*y
   print  width, height
 
d = 2 'rect size    'but 3 is too rought it seems - ??
Maxx =  int(width/d)
Max.y = int(height/d)      'array size - from screen size
Max.color = 255  'number of colors to use
rough = 2       'how "rough" you want the plasma to be. It can be jsut too plain for small values - so we'll get no much oscillation...
min.size = 2    'pixel size, kind of?
'min.size = 10   'nice enough - but much faster (I think about full screen...)
'Time taken: 43906 for full screen and min.size = 10. Good enough...
dim screenBuf(Maxx, Max.y)
 
    startTime = time$("ms")
print "Making smooth palette..."
   call Makepalette
 
'   for i= 0 to 512
'    print i,  PAL$(i)
'   next

    #gr, "size ";min.size-1
 
    'set initial (seed) points
    screenBuf(0, 0) = (RND(1) * Max.color) + 1
    screenBuf(0, Max.y) = (RND(1) * Max.color) + 1
    screenBuf(Maxx, 0) = (RND(1) * Max.color) + 1
    screenBuf(Maxx, Max.y) = (RND(1) * Max.color) + 1
 
print "Filling underlying plasma array..."
    call Splitbox 0, 0, Maxx, Max.y
 
print "Time taken 1 : ";time$("ms") - startTime
startTime = time$("ms")
 
    oldCol$ = ""
    print "Drawing plasma from array..."
            for xx = 0 to Maxx-1
            x = xx*d
            for yy = 0 to Max.y-1
                y = yy*d
                scan
                Colr = screenBuf(xx, yy)
                col$ = PAL$(Colr)
                if  oldCol$ <> col$ then #gr, "color ";col$;";backcolor ";col$ 
                if d>1 then
                    #gr, "place ";x;" ";y;";boxfilled ";x+d;" ";y+d
                else
                    #gr, "set ";x;" ";y
                end if
                'print "color ";col$;";backcolor ";col$;";place ";x;" ";y;";boxfilled ";x+d;" ";y+d
                #gr, "discard"
            next
        next
 
print "Time taken 2 : ";time$("ms") - startTime
'Time taken: 57750 with drawing on
'Time taken: 29906 with drawing off (just creating array)
'I wonder if draw by array will be any faster, then???
'as an idea - to ret reasonable time drawing fullscreen, try to set minsize to more then 1 pixel??

startTime = time$("ms")
'easiest way to get right BMP header is to actually save BMP and look header (just change BPP and some other things after)
     #gr, "getbmp drawing 0 0 ";width;" "; height
     bmpsave "drawing", "just4header.bmp"
     unloadbmp("drawing")
'and I think if I wrote BMP upside down noone will notice - because it's just well, uncomprehensible anyway
    'get header
    open "just4header.bmp" for binary as #1
        size = lof(#1)
        header$ = input$(#1, 53)  'or 54???
    close #1
'     kill "just4header.bmp"
    'modify header
    'numbers stored hi lo
    '2  4 fileSize                                    = imagebytes + offset
    '10 4 offset                                      1078
    '28 2 BitsPerPixel (bpp)                          8
    '30 4 CompressMethod                              0
    '34 4 imagebytes                                  width*height
    '46 4 ColorsUsed                                  256
    '50 4 ImportantColors                             256
    'all goes +1 because bytes numbered from zero by loc()
    call putNumber header$, 2+1, 4, width*height + 1078
    call putNumber header$, 10+1, 4, 1078
    call putNumber header$, 28+1, 2, 8
    call putNumber header$, 30+1, 4, 0
    call putNumber header$, 34+1, 4, width*height
    call putNumber header$, 46+1, 4, 256
    call putNumber header$, 50+1, 4, 256
 
    'get image data
    'loop
        'open "frame.bmp" for binary
        open "frame.bmp" for binary as #1
        'write modif. header
        print  #1, header$
        'write palette
        for i = 0 to 255
            print  #1, PAL2BMP$(i)
        next
        'write image data
        'print  #1, space$(width*height)
        FOR y =  Max.y-1 TO 0 step -1
            aLine$ = ""
            FOR x = 0 TO Maxx-1
                for k = 1 to d
                    aLine$ =  aLine$ + chr$(screenBuf(x,y))
                next
            next
            for k = 1 to d
                print #1, aLine$ 
            next
        next
        close #1
print "Time taken 3 : ";time$("ms") - startTime
 
    'loop
    do while 1
        startTime = time$("ms")
        open "frame.bmp" for binary as #1
        seek #1, 54 'palette data
        for i = 0 to 255
            print  #1, PAL2BMP$(i+k)
        next
        close #1
        loadbmp "copyimage", "frame.bmp"
        #gr, "drawbmp copyimage 0 0"
        unloadbmp("copyimage")
        #gr, "discard"
        scan
        k = (k+1) mod Max.color
        tt = time$("ms") - startTime
        if  tt = 0 then  tt = 1
        fps = 1000/tt
        'print "Time taken: ";tt ;" fps: "; fps
       loop
    '//loop
   wait
 
'------------------------------------------------------
   SUB Makepalette
'     PAL$(0) = "0 0 0"
      FOR c = 1 TO 63
        c2 = c*4
'         cn = 63 - c
'         PAL(c).R = 63
'         PAL(c).G = c
'         PAL(c).B = 0
         PAL$(c) = "255 ";c2;" 0"
      NEXT
      FOR c = 0 TO 63
        c2 = c*4
         cn = 63 - c
        cn2 = cn*4
         ci = c + 64
'         PAL(ci).R = cn
'         PAL(ci).G = cn
'         PAL(ci).B = c
         PAL$(ci) = cn2;" ";cn2;" ";c2
      NEXT
      FOR c = 0 TO 63
        c2 = c*4
         cn = 63 - c
        cn2 = cn*4
         ci = c + 128
'         PAL(ci).R = 0
'         PAL(ci).G = c
'         PAL(ci).B = 63
         PAL$(ci) = "0 ";c2;" 255"
      NEXT
      FOR c = 0 TO 63
        c2 = c*4
         cn = 63 - c
        cn2 = cn*4
         ci = c + 192
'         PAL(ci).R = c
'         PAL(ci).G = cn
'         PAL(ci).B = cn
         PAL$(ci) = c2;" ";cn2;" ";cn2
      NEXT
      FOR c = 1 TO Max.color
'         col = PAL(c).R
'         PAL(c + Max.color).R = col
'         col = PAL(c).G
'         PAL(c + Max.color).G = col
'         col = PAL(c).B
'         PAL(c + Max.color).B = col
        PAL$(c + Max.color) =  PAL$(c)
      NEXT
'      FOR X = 1 TO Max.color
'         OUT &H3C8, X
'         OUT &H3C9, PAL(X).R
'         OUT &H3C9, PAL(X).G
'         OUT &H3C9, PAL(X).B
'      NEXT X
'     PAL$(511) = "0 0 0"
'     PAL$(512) = "0 0 0"
'   'for BMP palette is BGRempty
'   'while in PAL$ it's R G B
    for i = 0 to 512
         PAL2BMP$(i) = chr$(val(word$(PAL$(i),3))) _
            + chr$(val(word$(PAL$(i),2))) _
            + chr$(val(word$(PAL$(i),1))) _
            + chr$(0)
        'print i,  PAL2BMP$(i)
    next
 
   END SUB
 
   SUB Newcolor xa, ya, X, Y, xb, yb
      'IF Get13Pixel(X, Y) <> 0 THEN EXIT SUB
      IF screenBuf(X, Y) <> 0 THEN EXIT SUB
      avg = ABS(xa - xb) + ABS(ya - yb)
      'colour = (Get13Pixel(xa, ya) + Get13Pixel(xb, yb)) / 2 + (RND(1) - .5) * avg * rough
      colour = (screenBuf(xa, ya) + screenBuf(xb, yb)) / 2 + (RND(1) - .5) * avg * rough
      IF colour < 1 THEN colour = 1
      IF colour > Max.color THEN colour = Max.color
      'call Set13Pixel X, Y, colour
      screenBuf(X, Y) = colour
   END SUB
 
   SUB Splitbox X1, Y1, X2, Y2
      IF (X2 - X1 < min.size) AND (Y2 - Y1 < min.size) THEN EXIT SUB
      scan
      X = int((X1 + X2) / 2)
      Y = int((Y1 + Y2) / 2)
       call Newcolor X1, Y1, X, Y1, X2, Y1
       call Newcolor X2, Y1, X2, Y, X2, Y2
       call Newcolor X1, Y2, X, Y2, X2, Y2
       call Newcolor X1, Y1, X1, Y, X1, Y2
      IF screenBuf(X, Y) = 0 THEN
         'colour = (Get13Pixel(X1, Y1) + Get13Pixel(X2, Y1) + Get13Pixel(X2, Y2) + Get13Pixel(X1, Y2)) / 4
         colour = (screenBuf(X1, Y1) + screenBuf(X2, Y1) + screenBuf(X2, Y2) + screenBuf(X1, Y2)) / 4
         IF colour < 1 THEN colour = 1
         IF colour > Max.color THEN colour = Max.color
          'call Set13Pixel X, Y, colour
          screenBuf(X, Y) = colour
      END IF
       call Splitbox X1, Y1, X, Y
       call Splitbox X, Y1, X2, Y
       call Splitbox X, Y, X2, Y2
       call Splitbox X1, Y, X, Y2
   END SUB
 
'===========================================
sub quit handle$
   timer 0
   close #handle$
   end
END SUB
 
'------------------------------------------
   sub putNumber byref aStr$, aPos, aLen, value
    tmp$=""
    for i = 1 to aLen
        'tmp$=chr$(value mod 256)+tmp$   'numbers stored hi lo
        tmp$=tmp$+chr$(value mod 256)   'numbers stored lo hi
        value = int(value/256)
    next
    aStr$ = left$(aStr$, aPos-1)+tmp$+mid$(aStr$, aPos+aLen)
   end sub
'------------------------------------------
function iif(test, valYes, valNo)
    iif =  valNo
    if test then iif =  valYes
end function
'---------------------------------------
function fileExists(path$, filename$)
  'dimension the array info$( at the beginning of your program
  files path$, filename$, info$()
  fileExists = val(info$(0, 0))  'non zero is true
end function
 
____________________
Roro

   
Le 29/11/2020 à 13h15

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 741
Effectivement, j'ai aussi lu que la taille de chaque ligne de pixels doit être un multiple de 4. Je suppose que cette obligation de devrait pas s'appliquer à des bitmaps avec palette.

Garantir une longueur de ligne multiple de quatre est facile avec un bitmap 32 bits parce que chaque pixel est défini par 4 octets, donc on tombe toujours juste, mais si on a que 3 octets par couleurs (donc le classique RVB en 256 niveaux), on ajoute un octet vide pour en avoir toujours 4 (et incidemment, je viens de comprendre que cet octet vide dans le bitmap généré par bmpsave n'est donc pas prévu pour une éventuelle transparence... Dommage, je commençais à entrevoir des possibilités intéressantes, mais je n'ai vu nulle part d'instructions JB/LB gérant la transparence des bitmaps, même les sprites ont un masque noir ou blanc mais pas gris)
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 29/11/2020 à 14h49

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2484
Citation:
longueur de ligne multiple de quatre

J'étais déjà en train de formater l'image à coup de "mod 4" successifs pour parer aux nombres remiers
Citation:
cette obligation de devrait pas s'appliquer à des bitmaps avec palette

Avec palette/sans palette ...Encore un truc pas très clair pour moi, ces "octets" c'est un souk infernal.
Citation:
je n'ai vu nulle part d'instructions JB/LB gérant la transparence

Oui, la transparence c'est avec DLL ( la: "user32. dll")
J'ai deux codes (dont un avec dll + "stylebit") mais j'hésite à te les donner, par crainte que tu ne bascule sur LB et n'en revienne plus.
Mais bon, si tu les veux, je te les donnes en mp.
____________________
Roro

   
Le 30/11/2020 à 12h41

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2484
Suite du: 29/11/2020 à 14h49
la dernière ponte de ROD:
Son texte "Google traduit":
"Je jouais un peu plus. Plutôt que toute la manipulation de chaînes, ce code copie le .bmp dans un nouveau fichier puis manipule le fichier directement. Probablement le plus rapide que vous obtiendrez. J'ai laissé tomber le code 8 bits qui a une palette et complique les choses. Ce code traitera des images 24 bits ou 32 bits. Il parcourt simplement le fichier entier et réduit le contenu rouge. Vous pouvez cibler des pixels spécifiques en calculant la valeur du pointeur à partir de x et y. "
et son code:
Code VB :
 
[loadbmp]
        filedialog "Choose an image","*.bmp",file$
        if file$<>"" then
            open file$ for input as #bmp
 
            'get the header into a string
            bmp$ = Input$(#bmp,lof(#bmp))
 
            'analyse the file header
            bmpw=value(mid$(bmp$,19,4)) 'width
            bmph=value(mid$(bmp$,23,4)) 'height
            b=value(mid$(bmp$,29,2))    'bits per pixel, ie color depth
            o=value(mid$(bmp$,11,4))    'picture data offset, where the color data starts
            close #bmp
            open "test2.bmp" for output as #bmp
            #bmp bmp$;
            close #bmp
            open "test2.bmp" for binary as #bmp
        end if
 
 
        'work out start of picture data and how to move through file
        pointer=o
        'work out how many bytes to step through the string 8=1 24=3 32=4
        bytes=b/8
        'work out padding each raster line must be a 4byte multiple
        mult=b/8*bmpw/4
        padding = 4*(1-(mult-int(mult))) mod 4
 
        for y=1 to bmph
            for x=1 to bmpw
                'run through bmp
                seek #bmp, pointer
                'color stored as BGR Liberty needs RGB
                b=asc(input$(#bmp,1))
                g=asc(input$(#bmp,1))
                r=asc(input$(#bmp,1))
                r=r-50
                if r<0 then r=0
                seek #bmp, pointer
                #bmp chr$(b);chr$(g);chr$(r);
                pointer=pointer+bytes
            next
            pointer=pointer+padding
        next
        close #bmp
    wait
 
function value(x$)
    select case len(x$)
        case 1
        value = asc(x$)
        case 2
        value=asc(mid$(x$,1,1))
        value=value+(asc(mid$(x$,2,1))*256)
        case 3
        value=asc(mid$(x$,1,1))
        value=value+(asc(mid$(x$,2,1))*256)
        value=value+(asc(mid$(x$,3,1))*65536)
        case 4
        value=asc(mid$(x$,1,1))
        value=value+(asc(mid$(x$,2,1))*256)
        value=value+(asc(mid$(x$,3,1))*65536)
        value=value+(asc(mid$(x$,4,1))*16777216)
    end select
end function
 

Me reste plus qu'à adapter le truc à mon besoin.
____________________
Roro

   
Le 30/11/2020 à 23h10

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 741
Donc il est malgré tout passé par le bitmap en 24 ou 32 bits là où j'aurais cherché à jouer sur la palette et un nombre restreint de couleurs, et ça semble plus compliqué que prévu.

Un truc à tester : je suppose que bmpsave sauvegarde avec les paramétrages en cours de l'écran, et que si on tournait en 256 ou en 16 couleurs, le bitmap généré serait aussi en 256 ou 16 couleurs ? Parce qu'on n'a aucun contrôle sur le bitmap généré...
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 01/12/2020 à 01h29

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2484
Citation:
j'aurais cherché à jouer sur la palette et un nombre restreint de couleurs, et ça semble plus compliqué que prévu

Rod avait l'air de dire que c'est plus compliqué avec palette (si Google à bien traduit).
Citation:
si on tournait en 256 ou en 16 couleurs, le bitmap généré serait aussi en 256 ou 16 couleurs ? Parce qu'on n'a aucun contrôle sur le bitmap généré

Alors là, ce n'est pas moi qui en dirais grand-chose; je suis en grand débutant en "octets".
____________________
Roro

   
Le 07/12/2020 à 06h28

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 741
Je vais voir à voir ce qu'on peut faire avec ces bitmaps. Je pense m'en occuper dans les temps qui viennent, par exemple pour générer des bmp avec 16 couleurs et palette, histoire de voir ce qui a semblé si difficile pour Rod.

Si tu n'en a pas besoin de plus de couleurs, on devrait gagner un max de place et de temps de traitement avec 16 couleurs qu'avec le même bitmap en 16 milions de couleurs, ça vaut le coup qu'on s'y penche.
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 07/12/2020 à 12h04

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2484
Citation:
on devrait gagner un max de place et de temps de traitement avec 16 couleurs qu'avec le même bitmap en 16 milions de couleurs, ça vaut le coup qu'on s'y penche.

Oui pour le fun, non pour le différentiel "place-temps / flexibilité"
____________________
Roro

   
Le 10/12/2020 à 11h17

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 741
Je regarderais à l'occasion (moi aussi j'ai des problèmes de différentiel "place-temps / flexibilité" ;) )
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   

 |  |

1 Utilisateur en ligne : 0 Administrateur, 0 Modérateur, 0 Membre et 1 Visiteur
Utilisateur en ligne : Aucun membre connecté
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie