Page 1 sur 2
[OK ] découpe automatique d'images
Publié : ven. 01/avr./2016 14:23
par blendman
salut
voilà, j'aimerai savoir si vous connaissez un code (ou même un utilitaire) permettant de découper automatiquement une image (png) composée de plusieurs morceaux en plusieurs images.
Par exemple, j'ai l'image suivante :
Et j'aimerais avoir en sortie 4 images ayant chacune un des morceaux de cette image.
Vous avez une piste pour faire ça ou un utilitaire qui permet ce genre de chose ?
Merci

.
Re: découpe automatique d'images
Publié : ven. 01/avr./2016 14:30
par falsam
J'allais dire n'importe quel logiciel de traitement de photo avec détourage mais je viens de voir le mot
autoamatiquement 
Re: découpe automatique d'images
Publié : ven. 01/avr./2016 16:15
par Shadow
Salut blendman,
Thème intéressant.
Dois pouvoir se faire ça.
Tu veux que la découpe se fasse exactement à la forme des objet ou en mode carré ?
En gros tu veux que la découpe épouse parfaitement la forme de l'objet ?
Re: découpe automatique d'images
Publié : ven. 01/avr./2016 16:53
par blendman
Les images de sorties (les 4 dans cet exemple) seront carrées, mais les découpes devraient avoir la forme de l'objet (pour éviter d'avoir des morceaux d'un autre "objet") ^^.
Je ne sais pas si c'est clair.
Re: découpe automatique d'images
Publié : ven. 01/avr./2016 16:59
par falsam
blendman a écrit :Je ne sais pas si c'est clair.
C'est trés clair. Tu veux faire du détourage d'image avec un lasso automatique
A mon avis avec OpenCV et la reconnaissance de forme, ça doit être possible.
Re: découpe automatique d'images
Publié : lun. 25/avr./2016 13:36
par Fig
Je crois qu'on avait fait un code pour la baguette magique... en réutilisant ce code c'est faisable oui.
Si ta requête est toujours d'actualité, je peux me pencher dessus...
Re: découpe automatique d'images
Publié : lun. 25/avr./2016 15:46
par blendman
Fig a écrit :Je crois qu'on avait fait un code pour la baguette magique... en réutilisant ce code c'est faisable oui.
Si ta requête est toujours d'actualité, je peux me pencher dessus...
oui, c'est toujours d'actualité

D'ailleurs, je pourrais même ajouter cette option à mon logiciel d'animation de sprite ^^.
Re: découpe automatique d'images
Publié : mar. 26/avr./2016 8:53
par Kwai chang caine
Je sais pas si j'ai tout bien compris (j'suis tres loin de m'intéresser du fait que le graphisme c'est pas trop mon truc

à ton splendide travail

)
Et en plus je croyais que ta demande n'était plus d'actualité
J'ai dans ma besace, deux liens de codes de ALTERMANN et SONKI qui font deux méthodes différentes de baguette magiques, si ça peux t'aider
http://www.purebasic.fr/english/viewtop ... 11#p468011
et
http://www.purebasic.fr/english/viewtop ... 67#p468367
Re: découpe automatique d'images
Publié : mar. 26/avr./2016 10:14
par Ar-S
Ce sont des réponses à son topic

j'ai pas pu tester celui de sonki mais 'autre fonctionne bien.
Re: découpe automatique d'images
Publié : mar. 26/avr./2016 10:22
par blendman
Ar-S a écrit :Ce sont des réponses à son topic

En effet

Je pourrais pitet utiliser une baquette magique, mais je préférerai un truc automatique, qui vérifie les différentes parties de l'image (entre les espaces vides), les découpent tout seul et les sauvegarde ^^.
Oui, je suis un fainéant, je ne veux pas le faire à la main

Re: découpe automatique d'images
Publié : mar. 26/avr./2016 12:22
par Kwai chang caine
Ars a écrit :Ce sont des réponses à son topic
Quel baireau fais-je

y me semblait bien....je me disais, qu'il ne pouvait pas être passé à coté de ces codes
Remarque, j'ai déjà fait pire, j'ai une fois failli répondre à un des miens
BlendMan a écrit :Oui, je suis un fainéant, je ne veux pas le faire à la main
Comme tout bon informaticien qui se respecte

, c'est le métier qui entre

Re: découpe automatique d'images
Publié : sam. 30/avr./2016 14:51
par Fig
Découpe automatique de sprites. Il est possible d'ajuster la taille des sprites pour quelle soit minimal autour de l'élement si c'est nécessaire. Je le rajoute si tu le souhaite.
Code : Tout sélectionner
;Automatic PNG Crop by Fig
Image.s=OpenFileRequester("Choisissez un fichier à charger", FichierParDefaut$, Filtre$, Filtre)
If InitSprite() = 0 Or InitKeyboard()=0 Or InitMouse()=0:MessageRequester("Error","Error DirectX",0):EndIf
If OpenWindow(0,0,0,1024,768, "Découpe automatique de sprite ", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget)
If OpenWindowedScreen(WindowID(0),0,0,1024,768,0,0,0,#PB_Screen_NoSynchronization)=0
MessageRequester("Erreur", "Impossible d'ouvrir un écran dans la fenêtre!", 0)
End
EndIf
EndIf
UsePNGImageDecoder()
Structure selection
x1.i
x2.i
EndStructure
Structure pixel
pixel.l
EndStructure
;charger le sprite à découper
If image<>""
LoadSprite(1,image,#PB_Sprite_AlphaBlending)
EndIf
Procedure PointFast(x.i,y.i,buffer.i,pitch.i)
*Line.Pixel = Buffer+Pitch*y+x*4
couleur.l=*line\pixel
If Alpha(couleur):ProcedureReturn 1:EndIf
ProcedureReturn 0
EndProcedure
Procedure CropAll(sprite.i)
Dim check.i(SpriteWidth(sprite),SpriteHeight(sprite))
newsprite=sprite
NewList explore.point()
NewMap selection.selection()
For dy=0 To SpriteHeight(sprite)-1
For dx=0 To SpriteWidth(sprite)-1
If check(dx,dy)=1:Continue:EndIf
x=dx:y=dy
;{- baguette magique en X,Y: selection tout ce qui n'a pas un alpha de 0
StartDrawing(SpriteOutput(sprite))
Buffer = DrawingBuffer()
Pitch = DrawingBufferPitch()
DrawingMode(#PB_2DDrawing_AlphaBlend)
color.i=Point(x,y)
DrawingMode(#PB_2DDrawing_Default)
StopDrawing()
If Alpha(color)=0:Continue:EndIf
check(x,y)=1
AddElement(explore())
explore()\x=x
explore()\y=y
time = ElapsedMilliseconds()
Repeat
x=Explore()\x
y=Explore()\y
DeleteElement(explore())
xi=x
xj=x
;agrandit vers la gauche
While xi>0 And PointFast(xi,y,buffer,pitch)
check(xi,y)=1
xi-1
Wend
xi+1
AddMapElement(selection(),Str(y))
selection()\x1=xi
;Agrandit vers la droite
While xj<SpriteWidth(sprite) And PointFast(xj,y,buffer,pitch)
check(xj,y)=1
xj+1
Wend
xj-1
selection()\x2=xj
;nord
flag=0
yy=y-1
If yy>0
; SectionFound = #False
For i=xi To xj
If check(i,yy):Continue:EndIf
If PointFast(i,yy,buffer,pitch)
If Not SectionFound
AddElement(Explore())
Explore()\x=i
Explore()\y=yy
SectionFound = #True
EndIf
Else
SectionFound = #False
EndIf
Next i
EndIf
;sud
flag=0
yy+2
If yy<SpriteHeight(sprite)
SectionFound = #False
For i=xi To xj
If check(i,yy):Continue:EndIf
If PointFast(i,yy,buffer,pitch)
If Not SectionFound
AddElement(Explore())
Explore()\x=i
Explore()\y=yy
SectionFound = #True
EndIf
Else
SectionFound = #False
EndIf
Next i
EndIf
Until ListSize(explore())=0
ClearList(explore())
;}
newsprite+1
;on duplique le sprite original
CopySprite(sprite,newsprite,#PB_Sprite_AlphaBlending)
;on efface dans ce sprite les zones qui ne sont pas selectionnées
StartDrawing(SpriteOutput(newsprite))
Memsprite3=DrawingBuffer()
Pitch3=DrawingBufferPitch()
StopDrawing()
For zy=0 To SpriteHeight(newsprite)-1
*line3.pixel=memsprite3+pitch3*zy
For zx=0 To SpriteWidth(newsprite)-1
If FindMapElement(selection(),Str(zy))=0 Or zx<selection()\x1 Or zx>selection()\x2
*Line3\Pixel=0
EndIf
*line3+4
Next zx
Next zy
ClearMap(selection())
Next dx
Next dy
EndProcedure
;découpe le sprite 1 et sauvegarde les morceaux dans les sprites suivants... 2,3 etc...
CropAll(1)
Repeat
Repeat:Until WindowEvent()=0
FlipBuffers()
ClearScreen(#White)
ExamineKeyboard()
;affiche les sprites créés
x=0:y=0
For i=1 To 5
If IsSprite(i)
DisplayTransparentSprite(i,x,y)
x+SpriteWidth(i)
If x+SpriteWidth(i)>1024:x=0:y+SpriteHeight(i):EndIf
EndIf
Next i
Until KeyboardPushed(#PB_Key_Escape)
Re: découpe automatique d'images
Publié : sam. 30/avr./2016 15:40
par blendman
@Fig : super, merci beaucoup, ça cartonne

.
la sauvegarde des sprites au format Png ne semble pas fonctionner par contre
Tu as juste oublié UsePngEncoder()

, et hop ça fonctionne avec saveSprite().
Re: [OK ] découpe automatique d'images
Publié : sam. 30/avr./2016 16:54
par Fig
ha oui... use decode et encoder ca devrait etre une seule et même commande pfff...
Re: [OK ] découpe automatique d'images
Publié : sam. 30/avr./2016 17:05
par blendman
Fig a écrit :ha oui... use decode et encoder ca devrait etre une seule et même commande pfff...
je trouve ça bien d'avoir séparer, tu peux avoir besoin de decoder uniquement ou d'encoder uniquement

En séparant, ça permet de n'inclure que les libs ou les commandes dont tu te sers réellement ^^.