Disappear !

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Disappear !

Message par Zorro »

a l'epoque ou j'avais encore un super ordinateur graphique

je m’étais essayé a Photoshop
un outils m'avait plutot bien impressionné , c'etait l'outil qui permet de supprimer un détail, un personnage
enfin bref, un truc qui gonfle sur une image, photos etc ...

ça pouvait etre le marquage sur un teeshirt, un tatouage, une pétouille ou un gus faisant l'idiot au fond d'une photo
voir, la frangine, ou l'oncle qu'on ne peut pas blairer :lol:
bref, cette outils permet de dessiner une zone sur l'endroit qu'on veux nettoyer , et la magie de photoshop opere !!

tout a l'heure, je me suis dit : "t'es quand meme pas plus con que les développeurs de photoshop, tu vas peut etre arriver a faire un truc semblable ..." (oui! oui ! des fois je me motive comme ça :lol:)

et ben , je crois etre arrivé a faire ça de façon assez simple .... :)
bien sur c'est pas parfait, mais avec si peut de ligne de code, ça m’épate !

avec ce code , vous chargez une photo, (n'ayez crainte, elle ne sera pas modifié , la modif n'a lieu qu'en Ram )

vous dessinez avec le bouton gauche sur la partie que vous voulez virer (ne cherchez pas a dessiner trop pres de la gauche ou de la droite des bords de l'images, je ne garantie pas un bug eventuel dans ce cas )
tout ce qui se trouve sous la zone rouge que vous dessinez , disparaîtra !!

cela disparaîtra lorsque vous utiliserez la touche clavier [H](pour horizontal) ou [V] ( pour vertical )

[H] = cherche a coller l'un contre l'autre le bord droit et le bord gauche
[V] = cherche a coller l'un contre l'autre le bord superieur et le bord inférieur

un appuis sur ESC permet de quitter le prg de test

utilisez par petite touches car , je me sert de ce qui se trouve a gauche et a droite de la zone rouge
donc moins il y a d'eccart entre la gauche et la droite, moins ça va piocher loin a gauche et a droite ...

Video de Demo :
https://www.youtube.com/watch?v=n2Wr3FB ... e=youtu.be



voici le code :

Code : Tout sélectionner

;***********************************************
;Titre  :*disappear
;Auteur  : Zorro (Dobro )
;Date  :17/06/2016
;Heure  :17:18:16
;Version Purebasic :  PureBasic 5.42 LTS (Windows - x86)
;Version de l'editeur :EPB V2.62
; Libairies necessaire : Aucune 
;***********************************************
InitMouse()
InitKeyboard()
InitJoystick()
UseJPEGImageDecoder()
UsePNGImageDecoder()
Enumeration
		#fenetre
		#Police
		#curseur
		#image
		#event_L
		#event_H
EndEnumeration
Structure raster
		x.l
		Y.l
		sensx.l
		sensy.l
EndStructure
Dim raster.raster(100)
;***********Declaration Procedures *******
Declare disappear(mode.s,img_num)




; ***********************************
Global Radius=16
Resultat = InitSprite()
FontID = LoadFont(#Police, "arial", 18, #PB_Font_Bold )
file_image$=OpenFileRequester("ouvre une image",GetCurrentDirectory() ,"*.bmp|*.jpg|*.png",1)
If file_image$<>""
		LoadImage(#image, file_image$)
		
		
Else
		End
Endif
ResizeImage(#image,1024,768)
Global Dim image_tab(1024,768)
StartDrawing(ImageOutput(#image))
		For y=0 to 768-1
				For x=0 to 1024-1			
						image_tab(x,y)=Point(x,y)
				Next x
		Next y
StopDrawing()



WindowID = OpenWindow(#fenetre, 0, 0,1024,768,  "Disappear",#PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered ) 
Result = OpenWindowedScreen(WindowID(#fenetre) ,0,0, 1027, 768, 1, 0,0)

Repeat
		ExamineMouse() :ExamineKeyboard()
		WaitWindowEvent(2)  
		xm=MouseX()
		ym=MouseY()
		
		;************ KEYBOARD *****************
		If MouseButton(#PB_MouseButton_Left)
				; dessin  
				
				StartDrawing( ImageOutput(#Image))
						Circle(xm,ym, Radius,RGB(255,13,0)) 
				StopDrawing() 
		EndIf 
		if KeyboardPushed(#PB_Key_Escape)
				End
		Endif
		if KeyboardPushed(#PB_Key_H)
				Mode.s="H"
				Disappear(Mode,#image)
		Endif
		
		if KeyboardPushed(#PB_Key_V)
				Mode.s="V"
				Disappear(Mode,#image)
		Endif
		
		
		; Dessin
		if KeyboardPushed(#PB_Key_Add)
				Radius=Radius+2
				If Radius>300:Radius=300:Endif
				Delay(10)
		Endif
		if KeyboardPushed(#PB_Key_Subtract)
				Radius=Radius-2
				If Radius<1:Radius=1:Endif
				Delay(10)
		Endif
		if KeyboardPushed(#PB_Key_S)
				StartDrawing( ImageOutput(#Image))
						For i=1 to 5			
								Taille.f=15 ; taille de la difusion du spray , Radius = taille des goutes
								AleaX=random(taille,1)
								AleaY=random(taille,1)
								DE=Random (1,0)
								If DE=1
										AleaX=-AleaX
								Else
										AleaY=-AleaY
								Endif
								
								Circle(xm+AleaX,ym+ALeaY,Radius,RGB(255,13,0)) 	
								Delay(10)
						Next i				
				StopDrawing() 
				
		Endif
		
		if KeyboardPushed(#PB_Key_F)
				StartDrawing( ImageOutput(#Image))					
					Transparence=2
					Largeur=Radius*2
					Hauteur=Radius*2
						DrawingMode(#PB_2DDrawing_Gradient|#PB_2DDrawing_AlphaBlend)	
						color =point(xm,ym)						
						BackColor(RGBA(Red(color),Green(color),Blue(color),Transparence))
						FrontColor(RGBA(Red(color),Green(color),Blue(color),Transparence))
						CircularGradient(xm,ym, largeur)     
						ellipse(xm,ym,Largeur,	Hauteur)   							
				StopDrawing() 
				Delay(30)
				
		Endif
		
		; ****************************************
		StartDrawing(ScreenOutput())
				DrawImage(ImageID(#Image), 0, 0) 
				Circle(xm,ym, Radius ,RGB(255,13,0)) 
		StopDrawing() 
		
		FlipBuffers():; affiche l'ecran
		ClearScreen(RGB(0, 0, 0)) :;efface l'ecran
Until Event=#PB_Event_CloseWindow 
;
Procedure Disappear(mode.s,img_num)
		;By Zorro (Dobro )
		; la procedure Magique !
		mem_posy_dep=0
		mem_posx_dep=0
		mem_posx_arr=0
		mem_posy_arr=0
		compteur2=0
		Haut_im=ImageHeight(img_num)
		Larg_im=ImageWidth(img_num)
		
		Select mode
				Case "V"
				StartDrawing( ImageOutput(img_num))
						; ************** Vertical *****************************************************
						For x=0 to Larg_im-1
								Flag=0:compteur1=0 :compteur2=0:finy=0:starty=0
								For y=0 to Haut_im-1
										coul=point(x,y)
										if coul=rgb(255,13,0)
												Starty=y ; retient la position de depart de la zone rouge sur la colone  en cours
												;calcul la hauteur de la zone mask de la ligne en cours
												While  coul=rgb(255,13,0)
														if Starty+compteur2<Haut_im-1
																coul=point(x,Starty+compteur2) ; verifie qu'on est toujours sur le mask
																compteur2=compteur2+1 ; << ça va etre notre largeur de travail
														Else
																Break
														Endif
												Wend ;<
												finy=Starty+compteur2; retient la position de fin de zone rouge pour la ligne en cours !
												compteur1=compteur2/2
												compteur2=0
												if Starty-compteur1>=0 ;
														For y1=Starty-compteur1 to Starty
																coul=point(x,y1); lit la couleur avant le debut de la zone rouge
																Plot(x,y1+compteur1,coul) ; dessine le point en cours avec la nouvelle couleur
														Next y1
												Endif
												For y1=finy to finy+compteur1
														If Y1<Haut_im
																coul=point(x,y1); lit la couleur apres  la zone rouge
																Plot(x,y1-compteur1,coul) ; dessine le point en cours avec la nouvelle couleur
														Endif
												Next y1
										Endif
								Next y
						Next x
				StopDrawing() 
				Case "H"
				StartDrawing( ImageOutput(img_num))
						; *************************************************************************************
						
						; ************** Horizontal *****************************************************
						For y=0 to Haut_im-1
								Flag=0:compteur1=0 :compteur2=0:finx=0:startx=0
								For x=0 to Larg_im-1
										coul=point(x,y)
										if coul=rgb(255,13,0)
												Startx=x ; retient la position de depart de la zone rouge sur la ligne en cours
												;calcul la largeur de la zone mask de la ligne en cours
												While  coul=rgb(255,13,0)
														if Startx+compteur2<Larg_im-1
																coul=point(Startx+compteur2,y) ; verifie qu'on est toujours sur le mask
																compteur2=compteur2+1 ; << ça va etre notre largeur de travail
														Else
																Break
														Endif
												Wend ;<
												finx=Startx+compteur2; retient la position de fin de zone rouge pour la ligne en cours !
												compteur1=compteur2/2
												compteur2=0
												if Startx-compteur1>=0 ;
														For x1=Startx-compteur1 to Startx
																coul=point(x1,y); lit la couleur avant le debut de la zone rouge
																Plot(x1+compteur1,y,coul) ; dessine le point en cours avec la nouvelle couleur
														Next x1
												Endif
												For x1=finx to finx+compteur1		
														If X1	<Larg_im-1
																coul=point(x1,y); lit la couleur  apres la zone rouge														
																Plot(x1-compteur1,y,coul) ; dessine le point en cours avec la nouvelle couleur
														Endif
												Next x1
										Endif
								Next x
						Next y
				StopDrawing() 
				; *************************************************************************************
		EndSelect
Endprocedure


; Epb
Image


donc le principe utilisé est : on prends le début de la zone rouge en horizontale seulement
et on prends la fin de la zone rouge

la zone rouge est alors remplacée par les pixels se trouvant avant elle (en horizontale ) et Apres elle
plus il y a de longueur horizontale de zone rouge a remplir, plus je prends les pixels avant et apres ... (<< la je fais peut etre une erreur
je devrai me contenter de quelques pixels !! )

je travail ligne par ligne .... ou colonne par colonne




aaaaaaaaaazzzzzzzzzzzzzzzzzzzzzzzzzzbbbbbbbbbbbb

ici zz represente le rouge , je vais me servir des points avant et apres pour reconstituer la zone rouge ce qui donnera :

aaaaaaaaaazzzzzzzzzzzzzzzzzzzzzzzzzzbbbbbbbbbbbb
une partie de la zone rouge est devenu bleu , et l'autre verte !



utilisation des touches [ESC] pour quitter le prg
[V] pour corriger en utilisant ce qui se trouve au dessus et au dessous de la zone rouge
[H] pour corriger en utilisant ce qui se trouve a gauche et a droite de la zone rouge :)
[+] pour augmenter la taille du pinceau
[-] pour diminuer la taille du pinceau
bien garder en tete que plus le pinceau est gros, plus on va piocher loin autour de celui ci pour reconstituer l'image :)
Dernière modification par Zorro le dim. 12/nov./2017 13:10, modifié 16 fois.
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Marc56
Messages : 2147
Inscription : sam. 08/févr./2014 15:19

Re: Disappear !

Message par Marc56 »

Si je regarde bien, il semble que ce soit un peu ce que fait l'outil "Tampon de clonage" dans pas mal de logiciels comme photofiltre (même la version gratuite) sauf que tu étire la bordure automatiquement.
Ton idée de prendre les pixels à la fois à droite et à gauche est astucieuse :P

Avoir fait ça en moins de 30 lignes: chapeau Monsieur 8)
Le tampon de clonage est un peu différent car il permet de choisir la source de copie (diamètre, côté et distance) et il faut balayer à la main.

Pour quelqu'un qui ne code plus et fait la bulle, tu es très productif :mrgreen:

:wink:
Dernière modification par Marc56 le ven. 17/juin/2016 16:50, modifié 1 fois.
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Disappear !

Message par Zorro »

Marc56 a écrit :Si je regarde bien, il semble que ce soit ce que fait aussi l'outil "Tampon de clonage" dans pas mal de logiciels comme photofiltre (même la version gratuite) ?
oui, le tampon de clonage lui copie une matrice de points ...
c'est vrais que ça y ressemble un peu :)
Pour quelqu'un qui ne code plus et fait la bulle, tu es très productif :mrgreen:

:wink:
ben faut bien s'occuper :)
le pire cette idée m'est venu , il y a un quart d'heure a peine :)
mais je l'avais deja murrie depuis que j'avais decouvert l'outils de photoshop


Merci a toi :)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Marc56
Messages : 2147
Inscription : sam. 08/févr./2014 15:19

Re: Disappear !

Message par Marc56 »

Je n'avais pas vu l'explication finale avant de répondre, du coup j'ai réédité :wink:
Avatar de l’utilisateur
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Disappear !

Message par Thyphoon »

j'avoue que ça marche plutôt bien vu la simplicité du code ...
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Disappear !

Message par Zorro »

Version 2

j'ai ajouté la possibilité de choisir ce qu'on copie

on zone en rouge ce qu'on veux faire partir
un appuis sur la touche H (horizontal) va travailler avec les bords gauche et droit de la zone

un appuis sur la touche V(vertical) va travailler avec les bords haut et inférieur de la zone
ça permet de maitriser l'effacement de sujet qui seraient près d'un autre truc qu'on veux pas toucher :)

voir la vidéo de démo ici :
https://www.youtube.com/watch?v=n2Wr3FB ... e=youtu.be

le code :
Voir premier code du topic !
Dernière modification par Zorro le sam. 11/nov./2017 22:06, modifié 2 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
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Disappear !

Message par Kwai chang caine »

Le tampon, c'est vraiment un truc qui me connait étant donné les milliers d'heures que j'ai pu passer à l'utiliser pour faire toutes mes conneries graphiques sur les forums depuis plus de 10 ans, à coté de moi, sur ce sujet, la femme est une ignorante :mrgreen:

Donc j'ai pris au hasard une image sur le web avec un fond et j'ai essayé de lui effacer le bras droit
https://i.pinimg.com/736x/48/64/54/4864 ... ashion.jpg

Sur le premier code j'ai pas été convaincu, car ça faisait des lignes toutes tordues :|
Mais sur le second code, en tapant "V" c'est pas mal du tout 8O

Bravo, et surtout merci du partage 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Disappear !

Message par Zorro »

en fait, la grosse différence avec photoshop (ou Affinity)
c'est que là je ne travaille pas sur calque
donc pas d'effet de transissions douce par utilisation de la transparence des calques
l'effet est appliqué a 100% :)

ton image n'est pas des plus simple non plus , avec ce treillis derrière :mrgreen:

notez qu'il peut y avoir un bug lié a l'ecriture de plot en dehors de l'image
si par exemple vous effacez une grosse patate
puisque les points qui me servent a dessiner, je les prends a gauche et a droite
de la zone rouge , si en horizontale par exemple la largeur de la zone est plus grande
que ce qui est disponible comme points a gauche et a droite
ça va vouloir "taper" en dehors ...


j'ai mis quelques bornages, mais pas pour tout les cas de figure
j'avais prévus une utilisation sur petite zonnes ... :)
je corrigerai ce point plus tard
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
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Disappear !

Message par Kwai chang caine »

ton image n'est pas des plus simple non plus , avec ce treillis derrière
Certes .... :mrgreen:
Je me suis dit, ...si il s'en sort sans bavure, c'est top moumoute... :lol:
Sincèrement, je m'attendais vraiment à pire, surtout après l'essai du premier, et c'est pas mal du tout 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Disappear !

Message par Zorro »

Modification donc du deuxieme code

j'ai borné , en principe meme avec une grosse zone, ça ne devrais pas planter

pour retirer les eventuels artefact rouge pares traitement, il suffit d'appuyer plusieurs fois sur la touche
[H] ou [V]
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
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Disappear !

Message par Zorro »

Bon Grosse amélioration :)

j'ai changé l'algo , ça va beaucoup mieux :)

donc toujours pareil utilisation des touches [V] et [H]

voir le premier topic pour avoir le code :)
(je prefere qu'il ne soit présent qu'une seule fois en debut de topic :) )


Le principe c'est que si on veux effacer un truc vertical (un poteau par exemple ), on a donc besoin de piocher les parties droite et gauche de chaque coté du poteau a effacer pour reconstituer l'arriere plan, donc la touche H (horizontal) fera ce travail


par contre , si vous avez une barre horizontal a effacer , il nous faut recuperer la partie inferieur et supérieur de cette barre
donc la touche [V] verticale fera l'affaire :)


ImageImage
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
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Disappear !

Message par falsam »

Beau travail Zorro.

J'enleverais ce bout de code qui ne sert à rien

Code : Tout sélectionner

;AddKeyboardShortcut(#Fenetre, #PB_Shortcut_L,#event_L)
;AddKeyboardShortcut(#Fenetre, #PB_Shortcut_L,#event_H)
Pour plus ou moins de finesse dans les pixels à supprimer, j'ai ajouté une variable global Radius. et avec les touches + et - j'augmente ou je diminue le pinceau.

Code : Tout sélectionner

Circle(xm,ym, Radius ,RGB(255,13,0))
Ca donne un bon résultat.

C'est bien documenté. Merci d'avoir partager ton code.
Configuration : Windows 11 Famille 64-bit - PB 6.03 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
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Disappear !

Message par Zorro »

modif Faites :)

j'avais bien sur,l'intention d'apporter ce confort de la taille :)
voila qui est fait ,merci :)
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
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Disappear !

Message par Zorro »

hum petite correction de derniere seconde (bornage ) si on dessinais trop pres du bord droit de l'image -> plantage :)

[reedit]
Arf !!! :roll: et du bord Gauche :lol:
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
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Disappear !

Message par Zorro »

j'ai fait une petite modif au code

j'ai ajouté un spray touche [S]
tant que la touche est pressé ça Spray , ça peut etre utile quelque fois pour supprimer des Artefacts

j'ai ajouté un outils de Flou , touche [F]
tant que la touche est pressé ça flou ce qu'il y a dessous le curseur , tres utile pour adoucir les "bords" laissé parfois par la supression
genre une limite Vertical qui apparait car a gauche c'etait plus clair ou plus foncé qu'a droite ....
flouter permet de "noyer" la frontiere

, cependant attention
car ça améne aussi pas mal de bizarerie si on insiste trop ., faut vraiment y aller molo par petit appuis court sur la touche [F]
car la touche clavier est auto-repete , et ça envoi comme une mitraillette

là il va falloir que je pense a modifier la façon de faire....

en revenant sur du standard (menu choix d'un outils , puis utilisation par le bouton souris pour "dessiner" )

pour le moment c'est un code qui me permet d'essayer tranquillement ce qu'on peut faire
on va quand meme pas faire un Photoshop en Purebasic :)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Répondre