› Forums › Communauté › Le Bar
Couleurs étranges lors de l'extraction de sprites et fonds graphiques
9 sujets de 16 à 24 (sur un total de 24)
- 1
- 2
-
voila…
J’ai regardé un peu, elle est simplement en 24 bits réel ( 3 octets par pixel ) .. et donc gérer à la fois la lecture des 2 Words ( 4 octets ) et extraction des R, V, et B en tenant compte des inversions dans les mots ( PC .. )… + Flag pour inversion de l’image (haut/bas)Le résultat :
Voila l’archive du prog en DarkBASIC Professional que j’ai réalisé ce soir : http://www.alcahest-quantique.fr/Amiga/AmigaTGA.zip
Pour les autres fichiers il faudra changer les noms de fichiers que j’ai mis … J’ai eu la flemme (pour ce soir) de te mettre un sélecteur de fichiers .. Je le ferais peut-être demain soir …
Le code source complet pour ceux qui voudraient y jeter un oeil, à titre éducationnel :
Rem Project: OctetsSwitchers
Rem Created: Thursday, March 02, 2017Rem ***** Main Source File *****
Set Display Mode 1024, 768, 32
Sync On : Sync Rate 60 : Sync On
Set Cursor 0, 0ConvertFile( “house00” )
ConvertFile( “illu_evolution_01” )
ConvertFile( “loading” )
ConvertFile( “N_birthday_0000” )
ConvertFile( “N_cactushit_0031” )
ConvertFile( “N_enter_0015” )
ConvertFile( “T_bark1_0000” )
ConvertFile( “W_clock_0000” )End
Function ConvertFile( Source$ )
FileOpen$ = Source$ + “.tga”
FileSave$ = Source$ + “_Switched.bmp”
Open To Read 1, FileOpen$
Make Memblock From File 1, 1
Close File 1
datatypecode = Switch16Bits( Memblock Word( 1, 2 ) ) AND 0xFF // 2 = Uncompressed RGB
Width = Memblock Word( 1, 12 )
Height = Memblock Word( 1, 14 )
OriginalDepth = Memblock Word( 1, 16 ) AND 0xFF
OriginalMode = Switch16Bits( Memblock Word( 1, 16 ) AND 0xFF00 )ImageMbcSize = 16 + ( Width * Height * 4 )
Make Memblock 2, ImageMbcSize
Write Memblock DWord 2, 0, Width
Write Memblock DWord 2, 4, Height
Write Memblock DWord 2, 8, 32For iYPos = 0 to Height – 1
For iXPos = 0 to Width – 1
Pixels = 0
if OriginalDepth = 16
// On lit le RGB16bits format 565
Pixels = Memblock Word( 1, 18 + ( ( iYPos * ( Width * 2 ) ) + ( iXPos * 2 ) ) )
If OriginalMode = 32 Then Pixels = ConvertPixels16To32( Pixels )
// On lit le RGB16Bits format 4444
If OriginalMode = 36 Then Pixels = ConvertPixels16RGBATo32ARGB( Pixels )
Else
if OriginalDepth = 24
Pixels = ReadRGB24( 1, iXPos, iYPos, Width, Height )
Endif
Endif
WriteImagePixel( 2, iXPos, iYPos, Pixels )
Next iWidth
Next iHeightMake Image From Memblock 2, 2
Cls : Sync
Paste Image 2, 0, 0
Sync
Save Image FileSave$, 2Delete Image 2
Delete Memblock 2
Delete Memblock 1
EndFunctionFunction Switch16bits( mVariable )
mHigh = mVariable And 0xFF00
mLow = mVariable And 0x00FF
mOutPut = ( mHigh / 256 ) + ( mLow * 256 )
EndFunction mOutPutFunction WriteImagePixel( Mbc, XPos, YPos, Pixels )
if Memblock Exist( Mbc ) = 1
Width = Memblock DWord( Mbc, 0 )
Height = Memblock DWord( Mbc, 4 )
fPos = ( YPos * Width * 4 ) + ( XPos * 4 ) + 16
Write Memblock Dword Mbc, fPos, Pixels
Endif
EndFunctionFunction ConvertPixels16To32( iColor )
iRed = iColor16Red( iColor ) * 8
iGreen = iColor16Green( iColor ) * 4
iBlue = icolor16Blue( iColor ) * 8
iColor = ( iRed * 65536 ) + ( iGreen * 256 ) + iBlue
EndFunction iColorFunction iColor16Red( iColor )
// iRed = ( iColor AND %111110000000000 ) / 1024
iRed = ( iColor AND %1111100000000000 ) / 2048
EndFunction iRedFunction iColor16Green( iColor )
// iGreen = ( iColor AND %1111100000 ) / 32
iGreen = ( iColor AND %11111100000 ) / 32
EndFunction iGreenFunction iColor16Blue( iColor )
// iBlue = iColor AND %11111
iBlue = iColor AND %11111
EndFunction iBlueFunction ConvertPixels16RGBATo32ARGB( iColor )
iAlpha = ( ( iColor AND %1111000000000000 ) / 8192 )
iRed = ( ( iColor AND %111100000000 ) / 256 ) * 16
iGreen = ( ( iColor AND %11110000 ) / 16 ) * 16
iBlue = ( iColor AND %1111 ) * 16
iColor2 = ( iAlpha * 16777216 ) + ( iRed * 65536 ) + ( iGreen * 256 ) + iBlue
EndFunction iColor2Function ReadRGB24( mbc, XPos, YPos, iWidth, iHeight )
// Le mode utilise le bit 5 pour définir le lower left corner au lieu du top
YPos = ( iHeight – 1 ) – YPos // Inversion du Y pour
iAddress = 18 + ( YPos * iWidth * 3 ) + ( XPos * 3 )
// Si on lit dans une addresse paire
iAddressP = ( iAddress AND 0xFFFFFFFE )
iComp1 = Memblock Word( mbc, iAddressP )
iComp2 = Memblock Word( mbc, iAddressP + 2 )
if iAddress = iAddressP
iRed = ( iComp1 and 0xFF )
iGreen = ( iComp1 and 0xFF00 ) / 256
iBlue = ( iComp2 and 0xFF )
Else
iRed = ( iComp1 and 0xFF00 ) / 256
iGreen = ( iComp2 and 0xFF )
iBlue = ( iComp2 and 0xFF00 ) / 256
Endif
iColor = ( iRed * 65536 ) + ( iGreen * 256 ) + iBlue
EndFunction iColorBravo AmiDARK !
J’ai un petit soucis de palette, je ne vois pas bien l’image 😉
arf arf arf !
bref, en tous cas bravo !
Aucun souci, je regarde tout cela en détail ce lundi. En tout cas, toutes les images que tu as obtenues sont correctes et présentent le bon aspect. Bravo !
Effectivement, même si l’éditeur Joowood a fait faillite il y a 7 ans, les droits du jeu appartiennent désormais à la boîte qui a racheté l’éditeur à l’époque. Concernant le darkbasic professionnal, peux tu m’en dire un peu plus (du moins celui pour windows), ainsi que ses qualités et défauts car je découvre un langage super complet, qui permet de faire du contrôle de bas niveau et ça m’a épaté ! Je vais essayé d’étudier tout cela de près.
Dernier point, sais tu comment sélectionner la totalité des fichiers tga (genre si il y en a 500) d’un répertoire donné plutôt que de devoir entrer chaque fichier individuellement avec le code suivant ? Par avance, merci !
ConvertFile( « house00 » )
ConvertFile( « illu_evolution_01 » )
ConvertFile( « loading » )
ConvertFile( « N_birthday_0000 » )
ConvertFile( « N_cactushit_0031 » )
ConvertFile( « N_enter_0015 » )
ConvertFile( « T_bark1_0000 » )
ConvertFile( « W_clock_0000 » )Bon weekend,
Pierre
J’ai essayé de progresser sur le sujet, seul Imagemagick semble capable de modifier les valeurs RGBA des fichiers et encore, ce n’est pas gagné ! Les développeurs confirment que par défaut, le TGA, c’est du RGBA5551, donc, tout ce qui est différent, ça va coincer, à moins de faire des manips avec un éditeur hexadécimal pour bidouiller, à priori, extraire le flux de données brut du fichier TGA avec l’éditeur hexadécimal.
Sinon, j’ai regardé ton prog, très intéressant, je le compile en local sur mon PC, pas d’erreur critique, le prog se lance bien mais il ne produit aucun fichier switched.bmp en sortie… Et pourtant, les fichiers sources sont bien dans le répertoire, pas d’erreur, tout se passe bien…
En tout cas, merci pour ton coup de main, tu avais déjà vu ces manips de formats graphiques par le passé ?
Pierre
Salut,
Tu as bien fait attention de mettre les noms de fichiers sans l’extension “.tga” ? Et que ces derniers sont bien nommés en .tga ?
Ah oui, j’oubliai, que l’exe et les fichiers soient dans le même dossier (Selon ton Windows fait gaffe aux autorisations d’écriture (le mieux un truc genre “d:\conversion” ,serait plus simple je pense….)Après, il faut voir avec quelle version de DarkBASIC Professional tu travailles ? Je crois que l’install par défaut est en 5.5 et la dernière mise à jour officielle en 7.7 … Si ce n’est celle du Git (Open Source) qui est plus récente (et est celle que j’utilise car elle bénéficie de certaines améliorations de leur nouveau soft GameGuru)…
Tu as testé le .Exe de l’archive que je t’ai partagé voire si avec les fichiers par défaut que tu avais partagé cela fonctionnait ?Sinon, concernant ce soucis, oui, cela m’était déjà arrivé auparavant d’être frotté à ce genre de détails :p
http://web.archive.org/web/20130622065652/http://www.thegamecreators.com/?m=view_product&id=2000
Voila un lien sur le webarchive de l’époque où le produit était payant et pas encore Open Source …
Cela te donnera peut-être quelques informations …
Cela dit, les forumes *officiels* de TGC sont encore assez actifs concernant DarkBASIC Professional.
9 sujets de 16 à 24 (sur un total de 24)
- 1
- 2
- Vous devez être connecté pour répondre à ce sujet.
› Forums › Communauté › Le Bar › Couleurs étranges lors de l'extraction de sprites et fonds graphiques