img_cut3

Programmation d'applications complexes
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: img_cut3

Message par Zorro »

A B
C D
Je scan horizontalement et verticalement
Si col <> fond alors X1 = x : y1 = y
je poursuis horizontalement
Si col = fond alors X2 = x : y2 = y
ça ne vas pas ça !
il faut :
scan horizontallement seulement :
Si Col <>Fond alors X1 = x <------ ici on ne s'occupe pas de Y, car il n'y a aucun moyen de savoir a quelle hauteur commence Y
puis Si Col = Fond ou bord droit de l'image "Mere"
X2=X

il vaut mieux le faire en 2 temps , pour justement pouvoir scaner toute l'image "Mere"

ensuite Scan Verticalement seulement :
Si Line <>Fond alors Y1 = Y
puis Si Line =Fond ou bord bas de l'image "Mere"
Y2=Y
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: img_cut3

Message par Ar-S »

Bah je suis bien obligé de scanner aussi les y sinon en reste en y0

je scan tous les pixels x en y0 et si il ne trouve que du blanc il passe en x1 etc...
Quand il a trouvé x1 et x2 (on a aussi le y1 du coup) je positionne entre x1 et x2 pour trouver le y2 des qu'un pixel est blanc.
ça marche pour A et B c'est ça qui me turlupine.
~~~~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
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: img_cut3

Message par Zorro »

je suis un peu lent pour coder maintenant, que je ne code plus :lol:

tiens voila un squelette

ici je simule des images (par des box Aleatoire de couleur, et de position ) je me sert de la couleur du fond (noir rgb 0,0,0 )

je simule une capture en dessinant un box noir a chaque capture
ce qui donne un effet d'effacement, mais aussi permet que l'algo ne soit pas trompé par des reste d'images pour la prochaine decoupe ..
on est ainsi sur , de recommencer avec un champ nettoyé :)
en meme temps,
dans le debug j'affiche les coordonnées de chaque image "récupérées" , ce qui prouve bien que je recupere les coordonées de chaque "image" :)

des fois ça peut planter lorsque mes pseudo image générées sont superposées les unes sur les autres , l'algo va considérer qu'il y en a plusieurs :)
ici j'en genere 10 par ecran

mais ça suffit pour comprendre le principe de base :)


lorsque je parlais de faire en 2 fois, regarde bien, si tu veux que je commente plus dit le :)

le code :

Code : Tout sélectionner

;***********************************************
;Titre  :*exemple_decoupe_image
;Auteur  :
;Date  :30/03/2017
;Heure  :21:40:19
;Version Purebasic :  PureBasic 5.50 (Windows - x86)
;Version de l'editeur :EPB V2.64
; Libairies necessaire : Aucune
;***********************************************

UseJPEGImageDecoder()
; *** taille fenetre ****
#Width = 1024
#Height = 768
; **********************

; les enumerations histoire que ce soit plus parlant que des chiffres ....
Enumeration
		#window
		#curseur
		#image
EndEnumeration
;- Initialisation de DirectX
If  InitSprite()=0 or InitKeyboard() = 0 Or InitMouse() = 0
		MessageRequester("Erreur", "Impossible d'initialiser DirectX", 0)
		CloseWindow(#window) : End
EndIf
;- Ouverture de la fenêtre et de l'écran
hwnd = OpenWindow(#window, 0, 0,  #Width, #Height, "",#PB_Window_TitleBar |#PB_Window_SystemMenu  )
OpenWindowedScreen(hwnd, 0, 0, 1024, 768, 0, 0, 0)   
; on affiche des pseudo images
StartDrawing(screenOutput())
		For i= 1 to 10
				Box( Random(1000,1),Random(750,1),random(100,20),random(100,20) ,Rgb(random(254,125),random(254,125),random(254,125)))
		Next i
StopDrawing()
FlipBuffers() ;: ClearScreen(RGB(0,0,0))


;- ** début de la boucle **********************
Repeat
		ExamineMouse()  ; on demande a purebasic de surveiller les event de souris !
		ExamineKeyboard() ; on demande a purebasic de surveiller les event de clavier!
		evnt= waitWindowEvent(2)
		Select    evnt
		Case #PB_Event_CloseWindow
				End
		EndSelect
		
		
		; LE SCAN  !
		compteur=0
		; on commence par verifier en verticale
		StartDrawing(screenOutput())  ; donc on va travailler dans notre image , on va lire les points
				
				for x=0 to #Width-1
						for y=0 to #Height -1
								coul=point(x,y) ; recupe les couleurs de chaque point de l'image Mere
								if coul<>rgb(0,0,0)  and Flag_dep=0 ; on tombe sur une image puisque different du fond
										y1=y                          
										Flag_dep=1 ; on met un flag pour maintenant s'aoccuper du Y de fin d'image enfant
								Endif
								;
								if  Flag_dep=1 ; on recherche le fin d'image enfant
										y2=y
										if coul=rgb(0,0,0) or y2=#Height-1   ; retrouve du fond ecran , donc on est a la fin de l'image enfant                                    
												Y2=y+1 ; on recup le y2
												Break 2 ; on a fini avec les verticales , on passe a l'horizontale
										Endif
								Endif
						next y
				next x
		StopDrawing()   
		; on verifie maintenant l'horizontale
		; le secret c'est de commencer par le y1 puisqu'on le connais inutile de recommencer a zero on pourrai se tromper d'image a cibler
		; on regarde donc maintenant de gauche a droite a la "hauteur" de l'image enfant trouvée dans l'image Mere (ici l'ecran Screen )
		Flag_dep2=0
		StartDrawing(screenOutput())  ; donc on va travailler dans notre image , on va lire les points
				y=(y1)
				for x=0 to #Width-1
						coul=point(x,y)
						if coul<>rgb(0,0,0) and Flag_dep2=0
								X1=x ; recup le x1 on viens de rencontrer l'image enfant                        
								Flag_dep2=1 ; on ne s'occupe desormais que du X de fin d'image enfant
						Endif
						;
						if Flag_dep2=1 ; tant qu'on est sur l'image Enfant
								X2=x
								if coul=rgb(0,0,0)  or   x2=#Width-1 ;on retombe sur du noir ; donc c'est la fin de l'image enfant
										X2=x+1 ; on recupe X2
										Flag_dep2=0
										; on va mettre une box noir sur l'image trouvée pour simuler le grab
										; puisque 'on a les 4 coins de notre image !!    
										Break 1 ; on peut se barrer d'ici
								Endif
						Endif
				next x
				Flag_dep2=0
		StopDrawing()
		FlipBuffers()
		delay(50)  ; j'ai mis un delay pour que tu ai le temp de voir LOL
		; on a tout !
		If Flag_dep2=0
				Debug "----------------"
				debug x1
				debug y1
				Debug x2
				Debug y2
				Debug "----------------"
				Debug ""
				
				StartDrawing(screenOutput())  ;
						Box(x1,y1,x2-x1,y2-y1,rgb(0,0,0))    ; les coordonées de recuperation d'une image a entrer dans un Grabimage par exemple
				StopDrawing()
				if (x2=>#Width-2) or  (x1=0 )
						MessageRequester("info","voila on a tout recuperé")
						End
				Endif
		Endif
		; on peut effacer nos variables pour le prochain grab
		x1=0:y1=0:x2=0:y2=0
		Flag_dep=0
		Flag_dep2=0
		
Until KeyboardPushed(#PB_Key_Escape)
; **************** fin de boucle ************************



; ; Epb

Dernière modification par Zorro le ven. 31/mars/2017 13:45, modifié 1 fois.
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: img_cut3

Message par Ar-S »

Merci, je regarde ça demain je reviens du sport j'ai plus de cerveau pour coder.
Bonne soirée
~~~~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
Répondre