Forum Liberty Basic France
• Index
@ Christoff:
Dans ton code lecture de fichier BMP, je trouve ça:
Code VB :
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.
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
Roro
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.
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

____________________
Just BASIC v2.0 :
utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc
Just BASIC v2.0 :
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.
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
Roro
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.
Et, comment dire, et serais-je un tantinet moqueur : dans l'aide, chapitre "file operations", et clic sur input$

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 occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc
Just BASIC v2.0 :
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 :
------------------------------------------------------
Et TSH73 a donné ça:
Code VB :
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
Roro
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)
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 occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc
Just BASIC v2.0 :
Citation:
J'étais déjà en train de formater l'image à coup de "mod 4" successifs pour parer aux nombres remiers
Citation:
Avec palette/sans palette ...Encore un truc pas très clair pour moi, ces "octets" c'est un souk infernal.
Citation:
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.
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
Roro
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 :
Me reste plus qu'à adapter le truc à mon besoin.
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
Roro
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é...
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 occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc
Just BASIC v2.0 :
Citation:
Rod avait l'air de dire que c'est plus compliqué avec palette (si Google à bien traduit).
Citation:
Alors là, ce n'est pas moi qui en dirais grand-chose; je suis en grand débutant en "octets".
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
Roro
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.
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 occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc
Just BASIC v2.0 :
Citation:
Oui pour le fun, non pour le différentiel "place-temps / flexibilité"
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
Roro
Je regarderais à l'occasion (moi aussi j'ai des problèmes de différentiel "place-temps / flexibilité"
)

____________________
Just BASIC v2.0 :
utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc
Just BASIC v2.0 :
• Index
1 Utilisateur en ligne : 0 Administrateur, 0 Modérateur, 0 Membre et 1 Visiteur
Utilisateur en ligne : Aucun membre connecté
Utilisateur en ligne : Aucun membre connecté
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie