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 :
Image

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 :wink:

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 :wink:

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 :oops: à ton splendide travail 8) )
Et en plus je croyais que ta demande n'était plus d'actualité :oops:
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 :wink:
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 :mrgreen:
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 :mrgreen:
En effet :mrgreen:
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 :D

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 :lol:
y me semblait bien....je me disais, qu'il ne pouvait pas être passé à coté de ces codes :oops:

Remarque, j'ai déjà fait pire, j'ai une fois failli répondre à un des miens :mrgreen:
BlendMan a écrit :Oui, je suis un fainéant, je ne veux pas le faire à la main
Comme tout bon informaticien qui se respecte :mrgreen: , c'est le métier qui entre :lol:

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 ^^.