Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.

Forum Casio - Vos tutoriels et astuces


Index du Forum » Vos tutoriels et astuces » [C][Prizm] Ouvrir des images BMP
Smashmaster Hors ligne Ancien modérateur Points: 4561 Défis: 253 Message

[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


Smashmaster Hors ligne Ancien modérateur Points: 4561 Défis: 253 Message

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...
Dodormeur Hors ligne Ancien rédacteur Points: 3965 Défis: 84 Message

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
Pokemon !!!!!! => pokemon stadium/battle

mes meilleurs jeux
Cliquer pour enrouler
un jeu avec des niveaux de gris mais compatible SH4 (mais en monochrome pour les SH4) => bomberman
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

projets
Cliquer pour enrouler

pokemon
Cliquer pour enrouler



encodage des données de combat (sprite, attaques et nom)
   100%

systeme de combat
   100%

encodage des données de pokemon (niveau d'apprentisage et evolution)
   100%


moteur de la carte
   50%

level design
   1%

finition de pokemon jade
   42%

merci a tout le monde pour son soutien


projets que je soutiens
Cliquer pour enrouler
minecraft de limachi
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 !
Nemhardy Hors ligne Grand maître des Traits d'Esprit Points: 1241 Défis: 54 Message

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 !

Dodormeur Hors ligne Ancien rédacteur Points: 3965 Défis: 84 Message

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
Pokemon !!!!!! => pokemon stadium/battle

mes meilleurs jeux
Cliquer pour enrouler
un jeu avec des niveaux de gris mais compatible SH4 (mais en monochrome pour les SH4) => bomberman
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

projets
Cliquer pour enrouler

pokemon
Cliquer pour enrouler



encodage des données de combat (sprite, attaques et nom)
   100%

systeme de combat
   100%

encodage des données de pokemon (niveau d'apprentisage et evolution)
   100%


moteur de la carte
   50%

level design
   1%

finition de pokemon jade
   42%

merci a tout le monde pour son soutien


projets que je soutiens
Cliquer pour enrouler
minecraft de limachi
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 !
Smashmaster Hors ligne Ancien modérateur Points: 4561 Défis: 253 Message

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 )
Lancelot Hors ligne Membre Points: 1274 Défis: 160 Message

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 ?
Calculatrices : Casio 35+ SH4 (modifiée 75) et fx-CG 20 PRIZM
Projets que je soutiens
Des exemples parmi tant d'autres
Pokémon Jade de Dododormeur
Zelda de Smashmaster
Super Geek Brothers de Siapran
Mes Programmes
Mes Programmes
Mes Projets
Mes Projets
ColorLib
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
Smashmaster Hors ligne Ancien modérateur Points: 4561 Défis: 253 Message

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à
Lancelot Hors ligne Membre Points: 1274 Défis: 160 Message

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 ?
Calculatrices : Casio 35+ SH4 (modifiée 75) et fx-CG 20 PRIZM
Projets que je soutiens
Des exemples parmi tant d'autres
Pokémon Jade de Dododormeur
Zelda de Smashmaster
Super Geek Brothers de Siapran
Mes Programmes
Mes Programmes
Mes Projets
Mes Projets
ColorLib
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
Smashmaster Hors ligne Ancien modérateur Points: 4561 Défis: 253 Message

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 ce cas j'utilise 1Mo RAM car 10 sprites sont utilisés, le problème c'est que je n'ai que 500Ko RAM => Je ne peux pas faire ça


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)

Dans ce cas j'utilise 100Ko RAM car un seul sprite est utilisé => J'économise 9 sprites, mais j'utilise 1.5Mo de mémoire de stockage

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
Nemhardy Hors ligne Grand maître des Traits d'Esprit Points: 1241 Défis: 54 Message

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 .
Smashmaster Hors ligne Ancien modérateur Points: 4561 Défis: 253 Message

Citer : Posté le 26/12/2013 22:34 | #


Nemhardy a écrit :
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 .
Aussi

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
Dodormeur Hors ligne Ancien rédacteur Points: 3965 Défis: 84 Message

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
Pokemon !!!!!! => pokemon stadium/battle

mes meilleurs jeux
Cliquer pour enrouler
un jeu avec des niveaux de gris mais compatible SH4 (mais en monochrome pour les SH4) => bomberman
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

projets
Cliquer pour enrouler

pokemon
Cliquer pour enrouler



encodage des données de combat (sprite, attaques et nom)
   100%

systeme de combat
   100%

encodage des données de pokemon (niveau d'apprentisage et evolution)
   100%


moteur de la carte
   50%

level design
   1%

finition de pokemon jade
   42%

merci a tout le monde pour son soutien


projets que je soutiens
Cliquer pour enrouler
minecraft de limachi
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 !
Smashmaster Hors ligne Ancien modérateur Points: 4561 Défis: 253 Message

Citer : Posté le 27/12/2013 19:53 | # | Fichier joint


Dodormeur a écrit :
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)

explication
Cliquer pour enrouler

Lancelot Hors ligne Membre Points: 1274 Défis: 160 Message

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

Calculatrices : Casio 35+ SH4 (modifiée 75) et fx-CG 20 PRIZM
Projets que je soutiens
Des exemples parmi tant d'autres
Pokémon Jade de Dododormeur
Zelda de Smashmaster
Super Geek Brothers de Siapran
Mes Programmes
Mes Programmes
Mes Projets
Mes Projets
ColorLib
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
Smashmaster Hors ligne Ancien modérateur Points: 4561 Défis: 253 Message

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é. :/

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2022 | Il y a 70 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd