Découpeur d'images
Publié : dim. 22/avr./2012 17:52
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
Règles:

Voici un logiciel qui va découper vos images pour vous


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