[C][Prizm] Ouvrir des images BMP
Posté le 24/12/2013 04:30
J'ai programmé cette semaine une bibliothèque permettant d'ouvrir facilement des images BMP sur votre calculatrice fx-CG20.
La documentation, la bibliothèque et quelques exemples se trouve en fichier joint.
Les avantages
Les avantages
On économise de la mémoire RAM : par exemple au lieu d'utiliser 20 sprites de taille 384*216, on utilise 20 images BMP de taille 384*216
La taille de l'add-ins est réduit
[brown]#include <display_syscalls.h>[/brown]
[brown]#include <stdio.h>[/brown]
[brown]#include "bitmap.h" [/brown]
[purple]int[/purple] main()
{
BITMAP image = Init_BITMAP();
LoadBmp24_to8bits([gray]"Example1/A.bmp"[/gray],&image); [green]//on charge l'image "A.bmp" qui se trouve dans le dossier "Example1"[/green]
[green]//'image' contient maintenant le sprite codé en 8-bits, pour y accéder il suffit de faire image.sprite8Bit[/green]
[b][blue]if[/blue][/b] (image.error8bit == ERR_NOERROR) [green]//si la création de notre sprite en 8-bits s'est bien passé.[/green]
{
Bdisp_AllClr_VRAM();
CopySpriteNbitMasked(image.sprite8Bit,[maroon]0[/maroon],[maroon]0[/maroon],image.width,image.height, image.sprite8Bit_palette,[maroon]0[/maroon]x0000,[maroon]8[/maroon]); [green]//on affiche notre sprite[/green]
Bdisp_PutDisp_DD();
}
Delete_BITMAP(&image);
LoadBmp24_to16bits([gray]"B.bmp"[/gray],&image); [green]//on charge l'image "B.bmp" qui se trouve dans le même répertoire que l'add-inn.[/green]
[green]//cette fois-ci [gray]'image'[/gray] contient maintenant le sprite codé en 16-bit, pour y accéder il suffit de faire image.sprite16Bit[/green]
[b][blue]if[/blue][/b] (image.error16bit == ERR_NOERROR) [green]//si la création de notre sprite en 16-bits s'est bien passé[/green]
{
Bdisp_AllClr_VRAM();
CopySpriteMasked(image.sprite16Bit,[maroon]0[/maroon],[maroon]0[/maroon],image.width,image.height,[maroon]0[/maroon]x0000); [green]//on affiche notre sprite[/green]
Bdisp_PutDisp_DD();
}
Delete_BITMAP(&image); [green]//on supprime l'image[/green]
}
Vitesse d'exécution
Vitesse d'exécution
Lire dans un fichier est toujours très lent sur la prizm, les fonctions s'exécutent dans le pire des cas en 20 secondes (ceci dépendra de la fréquence du processeur, de la résolution de l'image etc.)
vitesse d'exécution approximative (en secondes) = résolution de l'image * 0.0003
Il est donc vivement conseiller d'exécuter les fonctions en dehors d'une boucle, surtout si l'image a une très haute résolution.
màj
màj
0.2
0.2
Simplification du code
Corrections de quelques bugs graves au niveau de l'allocation dynamique.
0.3
0.3
Amélioration de l’efficacité de la fonction LoadBmp24_to8bits
Fichier joint
Citer : Posté le 24/12/2013 04:36 | #
Je viens de remarquer que la fonction BITMAP* LoadBmp24_to8bits (char *bmp_filename); ne marche pas, je vais corriger ça dès que possible.
Ajouté le 24/12/2013 à 04:38 :
Je vais aussi rajouter quelques exemples d'add-inn si possible demain .
Ajouté le 24/12/2013 à 04:45 :
J'ai eu une idée de fonction : une fonction qui créé une image bmp à partir d'un sprite, je vais coder ça dès que je peux (utile si quelqu'un veut programmer par exemple un Paint sur calculatrice)
Ajouté le 24/12/2013 à 04:51 :
Au début je voulais créer une bibliothèque permettant de lire des fichiers PNG, mais je ne sais pas comment sont encodés les fichier PNG, je n'ai rien trouvé sur le net...
Citer : Posté le 24/12/2013 10:30 | #
Pour le format PNG, regarde ici, ils expliquent un peu le fonctionnement
Et si tu es très motivé, voila un long texte là dessus
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2
merci a tout le monde pour son soutien
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm
(dont je connais le nom, mais pas vous )Arcuz !Citer : Posté le 24/12/2013 14:22 | #
Ahah ! Super ça ! J'essaye ça dans la foulée ! 8)
Bonne chance si tu t'attaques aux PNG, parce que vu la doc de dodormeur ( ), y'a du boulot, mais c'est déjà bien pour les BMP .
C'est vrai que le fonction sprite -> BMP peut être pas mal, j'ai pas trop d'idée d'utilité maintenant de suite perso, mais y'a des applications possibles c'est sûr !
Citer : Posté le 24/12/2013 14:23 | #
Ben tu pourrait faire un paint avec une fonction sprite->bmp
Ou alors un truc du genre spore, ou tu dessine tes propres monstres
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2
merci a tout le monde pour son soutien
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm
(dont je connais le nom, mais pas vous )Arcuz !Citer : Posté le 25/12/2013 00:59 | #
Merci pour ce lien dodormeur, je vais regarder ça
Ajouté le 26/12/2013 à 01:23 :
Je me suis trompé, j'ai re-testé la fonction BITMAP* LoadBmp24_to8bits (char *bmp_filename);, elle marche très bien.
Ajouté le 26/12/2013 à 19:40 :
J'ai fait une mise à jour, j'ai simplifié le code et j'ai corrigé un bug au niveau de l'allocation dynamique, j'ai aussi rajouté le premier exemple d'add-inn (je vais encore en rajouter d'autre si j'aurais fini la fonction sprite->bmp).
La documentation est maintenant fait en HTML (généré avec Doxygen )
Citer : Posté le 26/12/2013 20:10 | #
Salut
Ton projet semble super !
Mais on gagne vraiment de la place den mémoire RAM et sur la calculatrice ?
Zelda de Smashmaster
Super Geek Brothers de Siapran
Pac-Man
Pac-Man Color
Meta Ball
Add-ins Jetpack Joyride et Pac-Man sur PRIZM (les 2 non commencés mais en réflexion)
A la recherche des sprites jetpack Joride si quelqu'un les a en couleur
Citer : Posté le 26/12/2013 20:48 | #
Oui, un petit exemple où l'on peut gagner de la mémoire:
Là en ce moment je programme un petit jeu qui utilise 10 sprites de taille 384*216 dans le menu principal, mais sur les 10 sprites j'en affiche qu'une seule (l'image à afficher dans le menu est tiré aléatoirement), j'ai donc deux choix :
-> Créer 10 sprites de taille 384*216px (ça fait 10*100kb RAM) et tirer aléatoirement le sprite à afficher : Dans ce cas j'utilise 1Mo RAM => Impossible à faire car la calculatrice n'a pas autant de RAM.
->Tirer aléatoirement l'un des 10 images BMP et stocké l'image tiré aléatoirement dans une seule sprite : Dans ce cas on utilise seulement 100Ko RAM car on utilise qu'une seule sprite (le problème c'est juste que les images BMP sont très lourds, et que le chargement d'une image BMP de 384*216px dure environ 25s, car lire dans un fichier quelconque est toujours très lent sur la prizm)
Voilà
Citer : Posté le 26/12/2013 20:57 | #
ok mais si l'on compare la mémoire prise sur la RAM par l'image en bmp et celle charger par le code en c, qu' il y a une différence ?
Zelda de Smashmaster
Super Geek Brothers de Siapran
Pac-Man
Pac-Man Color
Meta Ball
Add-ins Jetpack Joyride et Pac-Man sur PRIZM (les 2 non commencés mais en réflexion)
A la recherche des sprites jetpack Joride si quelqu'un les a en couleur
Citer : Posté le 26/12/2013 21:31 | #
Je ne sais pas trop comment expliquer ça différemment, je vais faire un schéma de l'exemple précedent
Dans mon premier cas je fais ça
[u]Mémoire de stockage != RAM[/u]
vide
[u]Programme[/u]
sprite 1
sprite 2
sprite 3
...
sprite 10
AfficherSprite (sprite tiré aléatoirement)
Dans mon deuxième cas je fais ceci
[u]Mémoire de stockage != RAM[/u]
image 1
image 2
image 3
...
image 10
[u]Programme[/u]
sprite = ChargerImage (image tiré aléatoirement)
AfficherSprite (sprite)
Ajouté le 26/12/2013 à 21:34 :
et si on utilise la fonction Display_Bmp24, on n'utilise pas de sprite, on affiche dirrectement l'image
Citer : Posté le 26/12/2013 22:02 | #
Et puis en plus, la taille maximale du .g3a que tu vas pouvoir envoyer n'est pas infinie ! Donc, ça permet de pouvoir stocker les grosses images en dehors .
Citer : Posté le 26/12/2013 22:34 | #
Et puis en plus, la taille maximale du .g3a que tu vas pouvoir envoyer n'est pas infinie ! Donc, ça permet de pouvoir stocker les grosses images en dehors .
Si vous avez des idées de fonctions, ou si vous avez trouvé des bugs (ou des fautes dans la doc), faites m'en part
Citer : Posté le 26/12/2013 22:49 | #
une idée qui pourrait vraiment être bien, mais assez dure a mettre en oeuvre, ce serait des fonctions de zoom et de rotation, ça pourrait permettre pas mal de chose
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2
merci a tout le monde pour son soutien
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm
(dont je connais le nom, mais pas vous )Arcuz !Citer : Posté le 27/12/2013 19:53 | # | Fichier joint
une idée qui pourrait vraiment être bien, mais assez dure a mettre en oeuvre, ce serait des fonctions de zoom et de rotation, ça pourrait permettre pas mal de chose
Je vais y réfléchir ;).
Mise à jour : Amélioration de l’efficacité de la fonction LoadBmp24_to8bits.
étant donné que je ne peux pas mettre 3 images en fichier joint, j'ai rédigé tout l'explication de cette mise à jour dans une seule image (c'est un .gif donc la qualité n'est pas génial)
Citer : Posté le 27/12/2013 20:08 | #
Super !
Ajouté le 13/03/2014 à 18:48 :
@Smash' j'ai trouvé de la doc et du code pour les png
Zelda de Smashmaster
Super Geek Brothers de Siapran
Pac-Man
Pac-Man Color
Meta Ball
Add-ins Jetpack Joyride et Pac-Man sur PRIZM (les 2 non commencés mais en réflexion)
A la recherche des sprites jetpack Joride si quelqu'un les a en couleur
Citer : Posté le 14/03/2014 23:56 | #
Un membre de Cemetech avait déjà essayé de décoder une image .png sans succès, car il avait dit que la mémoire de la Prizm etait trop limité. :/