Compresser des images avec des palettes

Programmation d'applications complexes
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Compresser des images avec des palettes

Message par Mytic »

Bonjour…
Voici un code que j’avais utilisé dans un jeu.
Il permet de charger des images, et de les compresser en mémoire.

Bon… je sais qu’il n’est pas très utile comme ça, car il est fait sur mesure pour mon programme. Mais ça peut vous donner des idées.
:wink:

Utilisez le CPU monitor, pour voir la différence

Code : Tout sélectionner

;==========================
;|        By Mytic
;| pb v4.1
;==========================

;===========(Attention ; la palette ne dépasse pas les 196 couleurs au total 
; donc utilisez des images dessinées avec paint ou autre, et non pas des photos.)

UseJPEGImageDecoder()

Global Dim cpi_palette.l(1,99)
Global cpi_maxp.c = 0
Global cpi_maxc.c = 0
Global Dim cpi_image.l(99)

; couleur = PCC (P = palette , CC = numéro couleur) sur 1 oct.
Procedure.c cpi_loadimage(cpi_num.l,file.s)
cpi_im.l = LoadImage(#PB_Any,file)
cpi_imW.l = ImageWidth(cpi_im)
cpi_imH.l = ImageHeight(cpi_im)
cpi_cmem.l = 0
pl.l = 0
cpi_image(cpi_num) = AllocateMemory((cpi_imW * cpi_imH) + 8)
PokeL(cpi_image(cpi_num)+pl,cpi_imW)
pl+4
PokeL(cpi_image(cpi_num)+pl,cpi_imH)
pl+4
StartDrawing(ImageOutput(cpi_im))
For cpi_y = 0 To cpi_imH
  For cpi_x = 0 To cpi_imW
    cpi_GCoul = Point(cpi_x,cpi_y)
    Goto cpi__palleter:cpi_next:
    
  Next cpi_x
Next cpi_y
StopDrawing()
FreeImage(cpi_im)
ProcedureReturn 1

cpi__palleter:
  For cpi_p = 0 To cpi_maxp
    For cpi_c = 0 To cpi_maxc
      If cpi_palette(cpi_p,cpi_c) = cpi_GCoul

          PokeC(cpi_image(cpi_num)+pl, cpi_p*100 + cpi_c):pl+1

        Goto cpi_next
      EndIf  
    Next cpi_c
  Next cpi_p

  If cpi_maxc < 99
    cpi_maxc+1
  Else
    cpi_maxc = 0
    If cpi_maxp < 1
      cpi_maxp+1
    Else
      Goto cpi_next
    EndIf
  EndIf  

      cpi_palette(cpi_maxp,cpi_maxc) = cpi_GCoul
      PokeC(cpi_image(cpi_num)+pl, cpi_maxp*100 + cpi_maxc ):pl+1

      ;ELSE = palette full
  
     

Goto cpi_next

EndProcedure

Procedure cpi_display(cpi_im.l,cpi_px,cpi_py)
pl.l = 0
cpi_imW.l = PeekL(cpi_image(cpi_im)+pl)
pl+4
cpi_imH.l = PeekL(cpi_image(cpi_im)+pl)
pl+4
;Debug cpi_imH
For cpi_y = 0 To cpi_imH
  For cpi_x = 0 To cpi_imW
     cpi_peek.c = PeekC(cpi_image(cpi_im)+pl):pl+1
     ;Debug cpi_peek
     cpi_nump.c = cpi_peek / 100
     cpi_numc.c = cpi_peek % 100

     cpi_SCoul.l = cpi_palette(cpi_nump,cpi_numc)
     Plot(cpi_px+cpi_x,cpi_py+cpi_y,cpi_SCoul)
    
  Next cpi_x
Next cpi_y
EndProcedure


;=========test avec CPI
;Goto cpi
;..................


;============(pour ce cas , les images on une taille de 8,13 Mo dans la RAM)
LoadImage(1,"c:\image.bmp")
LoadImage(2,"c:\image2.bmp")
LoadImage(3,"c:\304887368.jpg")
Delay(5000)
End

cpi:
;============(pour ce cas , les images ont une taille de 1,70 Mo dans la RAM)
cpi_loadimage(1,"c:\image.bmp")
cpi_loadimage(2,"c:\image2.bmp")
cpi_loadimage(3,"c:\304887368.jpg")

OpenWindow(1,10,10,640,480,"test")
Delay(2000)
StartDrawing(WindowOutput(1))
cpi_display(2,10,10)
StopDrawing()

Delay(10000)
CloseWindow(1)

Delay(5000)

Dernière modification par Mytic le lun. 31/déc./2007 1:30, modifié 1 fois.
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Message par poshu »

:3
merci
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

vers un même but

Message par beauregard »

Mytic a écrit :Il permet de charger des images, et de les compresser en mémoire.
bonjour,
Je ne vois pas l'utilité de cette technique de haute volée, si tu pouvais m'éclairer le chemin et m'indiquer où il mène....
A+
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Re: vers un même but

Message par Mytic »

beauregard a écrit :
Mytic a écrit :Il permet de charger des images, et de les compresser en mémoire.
bonjour,
Je ne vois pas l'utilité de cette technique de haute volée, si tu pouvais m'éclairer le chemin et m'indiquer où il mène....
A+
Une fois les images chargées en mémoire, elles ont la même taille d’une image au format BMP.
Et si le programme utilise plusieurs images (un jeux de combat) ; la Ram sera rapidement saturée.
Donc en utilisant une palette, au lieu qu’un pixel ne soit codé une 3 voir 4 (alpha) bits, il n’utilisera qu’un seul.

Dans cette exemple en ne dépasse pas les 196 couleurs par bi-palette, car j’avais besoin de donné des effets.
Mais il peut encor être simplifié, en codant sur CCC au lieu de PCC , ce qui fera 256 couleurs.
:idea:
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Re: vers un même but

Message par beauregard »

Mytic a écrit :Donc en utilisant une palette, au lieu qu’un pixel ne soit codé une 3 voir 4 (alpha) bits, il n’utilisera qu’un seul.
je te remerci pour cet éclairage.:)
je me pose une question: à l'époque, de combien de ram disposais ta machine ?( mon précedent PC avait 128Mo)
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

Le premier pc que J’avais touché était un P1 200 Mhz , 64 Mo ram , 1,4 Go DD , VGA

Maintenant j’en suis à P4 3,2 Ghz , 2 Go ram , 250 Go DD , 8800 GT
:) (le temps passe vite)
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

Mytic a écrit :Le premier pc que J’avais touché était un P1 200 Mhz , 64 Mo ram , 1,4 Go DD , VGA

Maintenant j’en suis à P4 3,2 Ghz , 2 Go ram , 250 Go DD , 8800 GT
:) (le temps passe vite)
ah, et bien de mon côté j'ai récemment rajouté 512Mo, ce qui fait un total de 1,5Go, mais finalement ce rajout s'avère inutile pour mon jeu( le blème venait non pas du matos, mais du vieux basic que j'utilisais). Bon, je peux manipuler plus d'images géantes avec toshop, hum.
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

beauregard a écrit : ah, et bien de mon côté j'ai récemment rajouté 512Mo, ce qui fait un total de 1,5Go, mais finalement ce rajout s'avère inutile pour mon jeu( le blème venait non pas du matos, mais du vieux basic que j'utilisais). Bon, je peux manipuler plus d'images géantes avec toshop, hum.
Quel vieux basic ? :D (J’ai commencé la programmation avec Qbasic )
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

Mytic a écrit :Quel vieux basic ? :D (J’ai commencé la programmation avec Qbasic )
blitzbasic3D, et avant cela avec darkbasic( et en 3D s'il vous plait). mes début avec atari800xl/mo5, puis amos sur amiga( et un peu d'assembleur), et puis tgf/mmf et enfin retour à la programmation avec darkbasic...
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

beauregard a écrit : blitzbasic3D, et avant cela avec darkbasic( et en 3D s'il vous plait). mes début avec atari800xl/mo5, puis amos sur amiga( et un peu d'assembleur), et puis tgf/mmf et enfin retour à la programmation avec darkbasic...
Ce que je n’aime pas chez Dark Basic, c’est la politique tout payant !!
Même les modules/lib sont payants (physique)
Répondre