[OK ] découpe automatique d'images

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

[OK ] découpe automatique d'images

Message 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 :).
Dernière modification par blendman le sam. 30/avr./2016 15:40, modifié 1 fois.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: découpe automatique d'images

Message 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:
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

Re: découpe automatique d'images

Message 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 ?
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: découpe automatique d'images

Message 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.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: découpe automatique d'images

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: découpe automatique d'images

Message 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...
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: découpe automatique d'images

Message 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 ^^.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: découpe automatique d'images

Message 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
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: découpe automatique d'images

Message par Ar-S »

Ce sont des réponses à son topic :mrgreen:
j'ai pas pu tester celui de sonki mais 'autre fonctionne bien.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: découpe automatique d'images

Message 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
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: découpe automatique d'images

Message 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:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: découpe automatique d'images

Message 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)
Dernière modification par Fig le sam. 30/avr./2016 17:03, modifié 2 fois.
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: découpe automatique d'images

Message 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().
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: [OK ] découpe automatique d'images

Message par Fig »

ha oui... use decode et encoder ca devrait etre une seule et même commande pfff...
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [OK ] découpe automatique d'images

Message 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 ^^.
Répondre