Page 1 sur 5

Découpeur d'images

Publié : dim. 22/avr./2012 17:52
par dayvid
Vous avez une image ou ya pleins de petites images et vous avez la flemme de les découper à la main :!:
Voici un logiciel qui va découper vos images pour vous :!: , si c'est pas de la balle atomique ça :mrgreen:

Règles:

Code : Tout sélectionner

; Crée par monsieur dieppedalle le 22 avril 2012

UsePNGImageDecoder()
UsePNGImageEncoder()

Global NewList PixelImage.l()

Procedure EnregistrementPixel(CouleurPixel)
  
  AddElement(PixelImage.l())
  PixelImage.l() = CouleurPixel
  
EndProcedure

Procedure.i CreeSprite(Image, LargeurImage, HauteurImage)
  
  Static NumeroImageGenerer
  
  NumeroImageGenerer + 1
  
  X = 0
  Y = 0
  
  StartDrawing(ImageOutput(Image))
  
  ForEach PixelImage.l()
    
    Plot(X, Y, PixelImage.l())
    
    If Y <> HauteurImage - 1
      Y + 1
    Else
      X + 1
      Y = 0
    EndIf
    
  Next
  
  StopDrawing()
  
  ClearList(PixelImage.l())
  
  SaveImage(Image, "Image " + Str(NumeroImageGenerer) + ".png", #PB_ImagePlugin_PNG)
  
  ProcedureReturn NumeroImageGenerer
EndProcedure

Procedure DecoupageImage(Image, CouleurArrierPlantSprite, CouleurFeuille)
  
  ; J'initialise au départ les valeurs de coordonnées et de dimension de l'image
  
  X = 0
  Y = 0
  
  LargeurImage = ImageWidth(Image)
  HauteurImage = ImageHeight(Image)
  
  ;   Je parcours ligne à ligne le fichier image
  
  Repeat
    
    ; Je réinitialise les valeurs du sprite
    
    HauteurSprite = 0
    LargeurSprite = 0
    
    ; Je démarre la lecture du pixel de l'image
    
    StartDrawing(ImageOutput(Image))
    ;DrawingMode(#PB_2DDrawing_AlphaBlend)
    CouleurLue = Point(X, Y) ; Lecture du pixel de l'image
    StopDrawing()
    
    ;   SI je rencontre du "CouleurArrierPlantSprite",
    ;   ALORS je suis sur un sprite !
    
    If CouleurLue = CouleurArrierPlantSprite
      
      ;   Je mémorise les coordonnées actuelles
      
      SauvegardeX = X -1 ; -1 car une fois le sprite lue, je copierais celui-ci et effacerais le sprite et le remplacerais donc par du "CouleurFeuille" et je reviendrais à cette coordonnée pour lire la suite de l'image
      SauvegardeY = Y
      
      ;   Boucle secondaire pour extraire le sprite
      ;   Je boucle sur les colonnes tant que j'ai du "CouleurArrierPlantSprite"
      
      StartDrawing(ImageOutput(Image))
      
      Repeat
        
        If Y = SauvegardeY And Point(X, Y) = CouleurArrierPlantSprite ; Si le premier pixel en haut du sprite est bien "CouleurArrierPlantSprite"
          
          ; Nous enregistrons le pixel
          EnregistrementPixel(Point(X, Y))
          
          Y + 1 ; Passage au pixel suivent
          
        ElseIf Y = SauvegardeY And Point(X, Y) = CouleurFeuille ; SinonSi le premier pixel en haut du sprite n'est plus "CouleurArrierPlantSprite"
          
          ; J'enregistre la Largeur du sprite si ce n'est pas déjà fait, sinon je ne fais rien !
          
          If LargeurSprite = 0
            LargeurSprite = X - 1 - SauvegardeX ; Moins 1 car on est en dehors du sprite en horizontale puisqu'on a lu un "CouleurFeuille"
          EndIf
          
          StopDrawing()
          
          ; Je remplace le sprite par du "CouleurFeuille" pour effacer le sprite et ainsi pouvoir continuer !
          
          StartDrawing(ImageOutput(Image))
          Box(SauvegardeX + 1, SauvegardeY, LargeurSprite, HauteurSprite, CouleurFeuille) ; Moins 1 car on est en dehors du sprite en horizontale puisqu'on a lu un "CouleurFeuille"
          StopDrawing()
          
          ; Je vais maintenant crée et enregistre l'image !:
          NombreImageGenerer = CreeSprite(CreateImage(#PB_Any, LargeurSprite, HauteurSprite, 32), LargeurSprite, HauteurSprite)
          
          ; Je restitue les valeurs enregistrées avent de lire le sprite
          
          X = SauvegardeX + LargeurSprite ; Pourquoi "+ LargeurSprite" ?, bin pourquoi revenir en arrière !, autent aller de l'avent !
          Y = SauvegardeY
          
          Break ; Mon sprite est complet, donc on retourne à la ligne mémorisée pour passer éventuellement au sprite horizontal suivant
          
        ElseIf Point(X, Y) = CouleurFeuille ; On est à maintenant à l'extrémité du sprite !
          
          ; On enregistre pas le pixel puisque c'est en dehors du sprite !
          
          ; J'enregistre la hauteur du sprite si ce n'est pas déjà fait, sinon je ne fait rien !
          
          If HauteurSprite = 0
            HauteurSprite = Y - SauvegardeY
          EndIf
          
          X + 1 ; On ajoute 1 en horizontale pour lire la ligne suivante du sprite
          Y = SauvegardeY ; On revient au coordonnées enregistrer en Y
          
        Else
          CouleurLue = Point(X, Y) ; Lecture du pixel de l'image
          
          ; Nous enregistrons le pixel
          EnregistrementPixel(Point(X, Y))
          
          Y + 1 ; Passage au pixel suivent
          
        EndIf
        
      ForEver
      
    EndIf ; Sinon on continue !
    
    ; Si la position X est plus petit que la largeur de l'image
    If X <> LargeurImage - 1
      X + 1 ; Ont rajoute 1 à X pour lire la ligne suivente
    Else ; Sinon (Si la position X est ègale à la largeur de l'image) 
      X = 0 ; On remet X à 0 pour revenir au début de l'image
      Y + 1 ; Ont rajoute 1 à Y pour lire la ligne suivente de l'image
    EndIf
    
  Until X = LargeurImage - 1 And Y = HauteurImage - 1 ; Si la position X est ègale à la largeur de l'image (- 1 car les oppérations de déssins commence à 0)
                                                      ; Et que la position Y est ègale à la Hauteur de l'image (- 1 car les oppérations de déssins commence à 0)
                                                      ; On a terminé la lecture de l'image !
                                                      
  ProcedureReturn NombreImageGenerer
                                                      
EndProcedure

#Image = 1
Fichier$ = "untitled.png" ; L'emplacement du fichier

Image = LoadImage(#Image, Fichier$)

If Image <> 0
  
  Image = #Image
  
  T1.d = ElapsedMilliseconds()
  NombreImageGenerer = DecoupageImage(Image, RGB(255, 0, 255), RGB(254, 255, 255))
  T2.d = ElapsedMilliseconds()
  
  Temps.d = (T2.d - T1.d) / 1000
  
  MessageRequester("Information", "      " + Str(NombreImageGenerer) + " images ont été découpée(s) en " + StrD(Temps.d, 0) + " seconde(s) !", 64)
  
  
EndIf

Re: Découpeur d'images

Publié : dim. 22/avr./2012 18:43
par jbernard13
bien mais tu aurais mettre un message quand l'image a été decoupée et aussi que l'utilisateur puissent charger une image via un selecteur de fichier
une interface serait le bienvenu .

Re: Découpeur d'images

Publié : dim. 22/avr./2012 18:54
par dayvid
Tu veux pas 100 balle et un mars tant qu'on y est aussi hein ! :roll:
Je poste ici ce code ou je me suis fait ch... à le faire et à le commenter le plus possible mais non c'est pas encore bien :roll:

Un petit « Super ce code, merci ! » ou un simple « merci » est pas de trop non plus :wink:

Bon sinon ya pas écrie la poste hein alors merci d'en tenir compte :roll:
Chui pas super man juste au cas où tu ne le saurais pas !

Sinon je sais que ce code est à optimiser mais déjà je trouve que c'est sacrément bien pour un début non :P

Re: Découpeur d'images

Publié : dim. 22/avr./2012 19:35
par GallyHC
bien mais ...
Implique qu'il appréci mais qu'il manque d'après lui aussi quelque chose...

Je pense t'avoir dit que par moment je n'aime pas tes réponses et celle-là en fait partie. Prend sur toi et j'ai commencé en VisualBasic et avant d'avoir des compliments j'avais eu beaucoup de critique et on progresse avec les critiques justement.

Alors calme-toi….

Re: Découpeur d'images

Publié : dim. 22/avr./2012 19:46
par dayvid
Oui j'me suis légèrement importer et pourtant je me suis modérer :wink:
Désoler :(

Re: Découpeur d'images

Publié : dim. 22/avr./2012 19:51
par jbernard13
GallyHC a écrit :
bien mais ...
Implique qu'il appréci mais qu'il manque d'après lui aussi quelque chose...

Je pense t'avoir dit que par moment je n'aime pas tes réponses et celle-là en fait partie. Prend sur toi et j'ai commencé en VisualBasic et avant d'avoir des compliments j'avais eu beaucoup de critique et on progresse avec les critiques justement.

Alors calme-toi….
je suis d'accord avec toi GallyHC , ce que je voulais dire c'est qu'il manque une belle interface .

Re: Découpeur d'images

Publié : dim. 22/avr./2012 19:58
par Kwai chang caine
Dayvid...tu attaques..tu t'excuses...tu attaques...tu t'excuses.. :?

Encore une fois on ne réclame pas les remerciements, ni les codes sources, ni quoi que ce soit...
Sur un forum tout est basé sur la générosité et l'offre...rien sur les obligations.

Et GallyHC a raison, ta réponse est agressive.
Alors ne te plaint pas des agressions des autres, si tu en fait de même :(

Moi au minimum, j'aurais apprécié au moins une image de test si tu veux pas faire ce que t'as demandé JB
Pour au moins comprendre ce que fait réellement ton code, tu sais bien que rien ne remplace le visuel, puisque c'est ce que tu as utilisé pour ta démo des structures :wink:
Et peut être après, si le code nous épate, nous plait, ou autre, tu auras des compliments :wink:

Toi tu en a bavé pour faire ce code, donc je suppose que tu as tout compris.
Pense à nous qui ne savons même pas quelle est ton idée, et qu'il faut que nous trouvions une image, qui soit comme ci ou comme ça ... 8O

Maintenant, encore une fois les excuses successives n'ont pas de valeur....si elle ne freine pas la génération d'une nouvelle agression :(
Je croyais que tu avais compris...cette réponse prouve que pas tout à fait...

Re: Découpeur d'images

Publié : dim. 22/avr./2012 20:28
par jbernard13
je voulez juste lui donner un conseil , en plus comme a dis KCC tu as pas mis d'image test .

Re: Découpeur d'images

Publié : dim. 22/avr./2012 20:29
par dayvid
Ok je reconnais mon erreur, rien de plus a dire !

Il y a déjà une image d'éxemple :)
Ah non c'est varsi qu'elle est sur l'autre topic

Bon 0 pour moi là :x
Pourquoi faut toujours que je gache tous hein, moi ausi ça ménèrve ce genre de connerie :roll:

Re: Découpeur d'images

Publié : dim. 22/avr./2012 20:38
par nico
T'es sûr que ça fonctionne, j'ai téléchargé l'image de ton autre topic, il n'y a pas d'image de créé!

Re: Découpeur d'images

Publié : dim. 22/avr./2012 20:57
par dayvid
Si si sa fonctionne mais pas avec cette image là
je la redonne ici car l'autre ne marche pas !

Il manquais des commandes, ceci notament:

Code : Tout sélectionner

UsePNGImageEncoder()
Code remis à jour !

Image dispo ici:
Image

Re: Découpeur d'images

Publié : dim. 22/avr./2012 21:15
par jbernard13
ça, marche mais il fallait preciser qu'il fallait crée un repertoire et mettre le code + l'image dedans .
c'est pour ça qu'il manque un selecteur de fichier .

Re: Découpeur d'images

Publié : dim. 22/avr./2012 21:34
par dayvid
jbernard13 a écrit :ça, marche mais il fallait preciser qu'il fallait crée un repertoire et mettre le code + l'image dedans .
c'est pour ça qu'il manque un selecteur de fichier .
Je comprends désoler :wink:

Re: Découpeur d'images

Publié : dim. 22/avr./2012 22:07
par nico
Là, je dit bravô, c'est excellent :)

Si j'ai un peu de temps, j'essaierais cet exercice.

Re: Découpeur d'images

Publié : dim. 22/avr./2012 22:27
par dayvid
nico a écrit :Là, je dit bravô, c'est excellent :)

Si j'ai un peu de temps, j'essaierais cet exercice.
Tu veu dire que ça te plaie :)
J'en suis heureux mais ya encore du boulot :|

Impossible de mettre en place un choix de la couleur de transparence du sprite
Par exemple je voudrais que la couleur ici violette se transforme en transparent mais je n'y parviens pas :(

Actuellement:

Code : Tout sélectionner

DecoupageImage(Image, RGB(255, 0, 255), RGB(254, 255, 255))
Je voudrait faire:

Code : Tout sélectionner

DecoupageImage(Image, RGB(255, 0, 255), RGB(254, 255, 255), RGB(255, 0, 255), )
Le dernier paramètre est la couleur qui sera transparente quand le sprite (L'image) sera crée !

Sur ce domaine je bloque :(
Et puis une fois fait, si jamais l'image contient du transparent, on gérer ça comment, un vrais casse-tête :(

J’ai besoin d’un coup de main ici si quelqu’un veut bien m’aider
car je ne sais pas du tout comment faire :)