Barbouille

Programmation d'applications complexes
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Barbouille

Message par Backup »

récemment j'ai récupéré une Petite Tablette Graphique Wacom

en recherchant un prg de Dessin pour aller avec , je suis bien sur tout d'abord tombé sur Painter 12
hum ... trop cher pour moi , mais tres interressant !

surtout le mode "AutoPaint"
capable de "peindre" de façon automatique d'apres une photo ...

bon , pas mal ,.... puis je suis tombé sur Dynamique Painter !
alors là niveau simulation de peintre .. tres fort !
il n'y a qu'a voir ici :
http://www.youtube.com/watch?v=oZOuWw71ZZ4


bien sur, je me suis dis "mais comment fait t'il ?? "

(2 secondes et demi plus tard (oui je suis plutot lent en ce moment ))
j'avais la solution ! :)

je prends Purebasic et je me colle au boulot !

voici un premier résultat

Photo D'origine
Image

Peinture Sortie (une 15 aines de Secondes apres ) de mon Pure_Autopaint

Image :)

du pure Style impressionniste non ? :D


voici le code de mon prg ...

je vous demanderai juste de le lancer avant de regarder comment il fonctionne ... histoire de garder la Magie :)

le résultat commence a se faire sentir apres la Phase 8 !! Soyez patient .... attendez la fin de la peinture, avant de Critiquer :lol:
de préférence choisissez plutot une image de paysage ... mais il marche bien avec les Gens sur les Photos :)



le Code :

le Code est trop gros maintenant pour tenir sur le Forum
voici le lien vers l'executable accompagné de son source :)

http://michel.dobro.free.fr/download.php?view.40


le principe ici utilise des Formes simple (rond,Carré,Cercle, Elipse )
mais on peut bien sur et surtout utiliser des Formes complexe de Brosse
pour Varier le Style , et passer de "l’impressionnisme", a l'aquarelle , au "Wet on Wet" , "cubisme " etc :)

"s'qu'on peut s’emmerder quand meme " :lol:
Dernière modification par Backup le ven. 22/févr./2013 19:06, modifié 36 fois.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: Pure_Autopaint

Message par Anonyme2 »

Chapeau Dobro :wink:
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Pure_Autopaint

Message par graph100 »

Vraiment joli le résultat ! Bravo pour le boulot :D
J'aime bcp le rendu comme vu à travers une vitre mouillée !

En revanche, j'ai trouvé qu'on attendais trop avant d'avoir le résultat, j'ai accéléré un peu la procédure :mrgreen: (10min --> 10sec)
Et j'en ai profité pour monté le nombre de passe de niveau 9 à 10000, car ça ne rendait pas super sur mes photos
Par contre, si ça ne sert à rien de mettre plus car ça finit par perdre l'effet de peinture

Code : Tout sélectionner

;{ ************** initialisations/Declarations*********************************
UsePNGImageDecoder():UseJPEGImageDecoder()
UsePNGImageEncoder()
Enumeration ; Window
		#window
EndEnumeration

Enumeration ; Gadget
		#bouton_dessin
		#bouton_efface
		#bouton_charge_image
		#Gadget_text
		#bouton_Sauve
		#Gadget_scroll
		#Gadget_titre
		#Gadget_auteur
EndEnumeration

Enumeration ; Sprite
		#Pinceau
		#Pinceau3D
EndEnumeration
Enumeration ; Images
		#image_reference
		#image_Sortie
EndEnumeration
Enumeration ; Fonte
		#Font_Window_Text_titre
		#Font_Window_Auteur
EndEnumeration

Global File_image$,Phase



;-Declarations
Declare  peint(largeur,Hauteur,nombre_de_coup_de_pinceau,Taille_x,Taille_y, delay_affichage, Array image_tab(2))
Declare  Write_preference()
Declare  Read_preference()
Declare INIT(largeur, Hauteur, Array image_tab(2))




;} ***********************************************************************





Read_preference()

OpenWindow(#window,win_x,win_y,1024+250,768+50+50,"", #PB_Window_SystemMenu )
		; Déclarez les gadgets ici...
		y_bouton=90 :x_bouton=10
		ButtonGadget(#bouton_charge_image, x_bouton, y_bouton, 150, 30, "Charge_image")  
		ButtonGadget(#bouton_dessin, x_bouton, y_bouton+60, 100, 30, "dessine") 
		ButtonGadget(#bouton_efface, x_bouton, y_bouton+90, 100, 30, "efface")  
		ButtonGadget(#bouton_Sauve, x_bouton, y_bouton+210, 100, 30, "Sauve_image") 
		TextGadget(#Gadget_text, x_bouton, y_bouton+150, 200, 30, "" )
		ProgressBarGadget(#Gadget_scroll, x_bouton, y_bouton+180, 150,30, 0, 100)
		TextGadget(#Gadget_titre, x_bouton+500, 5, 300, 40, "Pure AutoPaint" )
		SetGadgetFont(#Gadget_titre, LoadFont(#Font_Window_Text_titre, "Comic Sans MS", 20, 16))
		TextGadget(#Gadget_auteur, x_bouton+800, 40, 250, 20, "By Dobro (speeded by Graph100 ;)" )
		SetGadgetFont(#Gadget_auteur, LoadFont(#Font_Window_Auteur, "Comic Sans MS", 10, 16))


;{ *************** initialisations Graphique *********************************
InitSprite()
OpenWindowedScreen(WindowID(#window),200,70,1024,768,0,0,0) ; l'ecran

; ***** Creation du pinceau ******

;InitSprite3D()
;CreateSprite3D(#Pinceau3D, #Pinceau)

; *****************************



;} **********************************************************************

;{ ********************* boucle principale ***********************************
;-Boucle principale
Repeat
		Event=WaitWindowEvent()
		Select  Event
				Case #PB_Event_Gadget 
				Select EventGadget()
						Case #bouton_Sauve
						GrabSprite(#image_sortie, 0, 0, 1024, 768)
						
						
						File_image_save$=SaveFileRequester("Load Picture",File_image$,"*.png",1)
						If File_image_save$<>""
								SaveSprite(#image_sortie,File_image_save$,#PB_ImagePlugin_PNG   )
								FreeSprite(#image_sortie)
						EndIf
						Case #bouton_charge_image
						File_image$=OpenFileRequester("Load Picture",File_image$,"*.jpg|*.png|*.bmp",1)
						If File_image$<>""
								LoadImage(#image_reference,File_image$)
								ResizeImage(#image_reference,1024,768)
								;StartDrawing(ScreenOutput()) 
								;DrawImage(ImageId(#image_reference),0,0)
								;StopDrawing()
								Else
						EndIf
						Case #bouton_dessin 
						If IsImage(#image_reference)
								DisableDebugger
								
								SetGadgetText(#Gadget_text, "Phase 1/9")
								
								largeur=ImageWidth(#image_reference)
								Hauteur=ImageHeight(#image_reference)
								
								Dim tab_image(largeur, Hauteur)
								
								INIT(largeur,Hauteur,tab_image())
								
								Phase=1
								nombre_de_coup_de_pinceau=1000
								Taille_x=100:Taille_y=100
								Peint(largeur,Hauteur,nombre_de_coup_de_pinceau,Taille_x,Taille_y, 20,tab_image())
								; *********
								Beep_(440,50)
								SetGadgetText(#Gadget_text, "Phase 2/9")
								Phase=2
								nombre_de_coup_de_pinceau=1200
								Taille_x=50:Taille_y=50
								Peint(largeur,Hauteur,nombre_de_coup_de_pinceau,Taille_x,Taille_y, 40,tab_image())
								; *********
								Beep_(440,50)
								SetGadgetText(#Gadget_text, "Phase 3/9")
								Phase=3
								nombre_de_coup_de_pinceau=2400 
								Taille_x=15:Taille_y=15
								Peint(largeur,Hauteur,nombre_de_coup_de_pinceau,Taille_x,Taille_y, 80,tab_image())
								; *********
								Beep_(440,50)
								SetGadgetText(#Gadget_text, "Phase 4/9")
								Phase=4
								nombre_de_coup_de_pinceau=3800 
								Taille_x=10:Taille_y=10
								Peint(largeur,Hauteur,nombre_de_coup_de_pinceau,Taille_x,Taille_y, 100,tab_image())
								; *********
								Beep_(440,50)
								SetGadgetText(#Gadget_text, "Phase 5/9")
								Phase=5
								nombre_de_coup_de_pinceau=5800
								Taille_x=8:Taille_y=8
								Peint(largeur,Hauteur,nombre_de_coup_de_pinceau,Taille_x,Taille_y, 300,tab_image())
								; *********
								Beep_(440,50)
								SetGadgetText(#Gadget_text, "Phase 6/9")
								Phase=6
								nombre_de_coup_de_pinceau=6500
								Taille_x=2:Taille_y=2
								Peint(largeur,Hauteur,nombre_de_coup_de_pinceau,Taille_x,Taille_y, 500,tab_image())
								; *********
								Beep_(440,50)
								SetGadgetText(#Gadget_text, "Phase 7/9")
								Phase=7
								nombre_de_coup_de_pinceau=7000
								Taille_x=3:Taille_y=3
								Peint(largeur,Hauteur,nombre_de_coup_de_pinceau,Taille_x,Taille_y, 500,tab_image())
								; *********
								Beep_(440,50)
								SetGadgetText(#Gadget_text, "Phase 8/9")
								Phase=8
								nombre_de_coup_de_pinceau=9500
								Taille_x=2:Taille_y=3
								Peint(largeur,Hauteur,nombre_de_coup_de_pinceau,Taille_x,Taille_y, 500,tab_image())
								; *********
								Beep_(440,50)
								SetGadgetText(#Gadget_text, "Phase 9/9")
								Phase=9
								nombre_de_coup_de_pinceau=10000
								Taille_x=1:Taille_y=1
								Peint(largeur,Hauteur,nombre_de_coup_de_pinceau,Taille_x,Taille_y, 600,tab_image())
								FlipBuffers()
								Beep_(880,100)
								EnableDebugger
								SetGadgetText(#Gadget_text, "Terminé !")
						EndIf
						
						
						Case #bouton_efface
						ClearScreen(RGB(0,0,0))
						FlipBuffers()
				EndSelect
		EndSelect
Until  Event=#PB_Event_CloseWindow
;} *************** fin boucle principale ****************************************

Write_preference()

;- **************************** Zone des Procedures **************************************
;- Procedures Zone

Procedure INIT(largeur,Hauteur, Array image_tab(2))
	; By Dobro
	StartDrawing(ImageOutput(#image_reference))
	
	For a = 0 To largeur -1
		For b = 0 To Hauteur -1
			image_tab(a, b)=Point(a,b) ; recup la Couleur         
		Next
	Next
	
	
	StopDrawing()
EndProcedure
	
	

Procedure peint(largeur,Hauteur,nombre_de_coup_de_pinceau,Taille_x,Taille_y, delay_affichage, Array image_tab(2))
		; By Dobro
		SetGadgetAttribute(#Gadget_scroll, #PB_ProgressBar_Maximum, nombre_de_coup_de_pinceau)
		
		StartDrawing(ScreenOutput())
		
		For i=1 To nombre_de_coup_de_pinceau
			
			If i%delay_affichage = 0
				StopDrawing()
				FlipBuffers()
				StartDrawing(ScreenOutput())
			EndIf
			
			
			; 				StartDrawing(ImageOutput(#image_reference))
; 						; Scan la couleur d'un pixel au hasard de l'image de Reference
						x_source=Random(largeur-1)
						y_source=Random(hauteur-1)
; 						Couleur_ref=Point(x_source,y_source) ; recup la Couleur         
						Couleur_ref=image_tab(x_source,y_source) ; recup la Couleur         
; 				StopDrawing()
				
				De=Random(10)
				If De >0 And De<2 
								DrawingMode(#PB_2DDrawing_Default  )
								Box(x_source,y_source,Taille_x,Taille_y,Couleur_ref)
				EndIf
				If De >=2 And De<4
; 						StartDrawing(ScreenOutput())
								DrawingMode(#PB_2DDrawing_Default  )
								Circle(x_source,y_source,Taille_x,Couleur_ref)
; 						StopDrawing()
				EndIf
				If De >=4 And De<6 
; 						StartDrawing(ScreenOutput())
								If Phase<>6
										DrawingMode(#PB_2DDrawing_Outlined )
								EndIf
								Circle(x_source,y_source,Taille_x,Couleur_ref)
; 						StopDrawing()
				EndIf
				
				If De >=6 And De<8 
; 						StartDrawing(ScreenOutput())
								If Phase<>6
										DrawingMode(#PB_2DDrawing_Outlined )
								EndIf
								Ellipse(x_source,y_source,Taille_x*4,Taille_x,Couleur_ref)
; 						StopDrawing()
				EndIf
				If De >=8 And De<=10 
; 						StartDrawing(ScreenOutput())
								If Phase<>6
										DrawingMode(#PB_2DDrawing_Outlined )
								EndIf
								Ellipse(x_source,y_source,Taille_x,Taille_x*4,Couleur_ref)
; 						StopDrawing()
				EndIf
				While WindowEvent():Wend
				
				SetGadgetState   (#Gadget_scroll, i)
			Next i
			
			StopDrawing()
			FlipBuffers()
			
		EndProcedure

Procedure Write_preference()
		If CreatePreferences("Pure_autopaint.prefs")
				PreferenceGroup("Info")
				WritePreferenceString("ApplicationName", "Pure_autopaint")
				WritePreferenceString("Version", "1.00")
				
				PreferenceGroup("Window")
				
				PreferenceComment(" Les Window dimensions")
				PreferenceComment("")
				WritePreferenceLong ("WindowX", WindowX(#window))
				WritePreferenceLong ("WindowY", WindowY(#window))
				PreferenceGroup("Path")
				WritePreferenceString("chemin image", File_image$)
				ClosePreferences()
		EndIf
EndProcedure

Procedure Read_preference()
		Shared win_x,win_y,File_image$
		If OpenPreferences("Pure_autopaint.prefs")
				PreferenceGroup("Info")
				ReadPreferenceString("ApplicationName", "")
				ReadPreferenceString("Version", "")
				
				PreferenceGroup("Window")
				win_x=ReadPreferenceLong ("WindowX", 0)
				win_y=ReadPreferenceLong ("WindowY", 0)
				PreferenceGroup("Path")
				File_image$=ReadPreferenceString("chemin image", "c:\")
				ClosePreferences()
		EndIf
EndProcedure



; 

; EPB
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: Pure_Autopaint

Message par Anonyme2 »

He graph100

super l'accélération, 10 secondes aussi c'est le top.
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Re: Pure_Autopaint

Message par Frenchy Pilou »

Il y a le concepteur français de Fotosketcher à battre! :wink:
(comme le site en anglais qui ne le montre pas trop :mrgreen:

Plus de 5 millions de chargements! 8O

Fotosketcher (c'est gratuit aussi ;)
(et c'est aussi un très bon programme 8)

Il y a quelque part le Pure_AutoPaint en exe ?
Que je puisse le tester en direct :)
Je n'ai pas trop le temps de faire toutes les manipes :roll:
Dernière modification par Frenchy Pilou le ven. 15/févr./2013 10:36, modifié 1 fois.
Est beau ce qui plaît sans concept :)
Speedy Galerie
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Pure_Autopaint

Message par Ar-S »

Résultat vraiment excellent, je viens de tester.
Chapeau bas !
~~~~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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Pure_Autopaint

Message par Backup »

Merci :)

@Graph100:
je comptais bien l'optimiser , mais tu m'a devancé .. bravo ... cependant, je suis encore en Version Purebasic 4.61
et j'ai un Index hors limite en ligne 208 ! 8O ...

je vais telecharger la derniere Version de Purebasic maintenant :)

n'hésitez pas a améliorer le bousin , en y ajoutant/modifiant des formes de Pinceaux par exemple
je l'ai mis en Open source, pour que ça devienne un petit Projet commun ..
enfin bref ... utilisez le , modifiez le , eclatez vous :)
le principe de base est posé :)

[Reedit]
@Graph100
oui ça venais de ma version de Purebasic :)
plus de bug !

effectivement , ça decoiffe ! :D Bravo a toi
Dernière modification par Backup le ven. 15/févr./2013 11:07, modifié 1 fois.
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Pure_Autopaint

Message par kernadec »

bonjour
très sympa les peintures
merci, Dobro pour le partage.
merci, graph100 pour le ptit coup de pouce.

Petite remarque.
x_bouton = 10
la box TextGadget avec 200+10 dépasse dans l'image, visible surtout dans le code de graph100 car plus rapide.

Code : Tout sélectionner

OpenWindowedScreen(WindowID(#window),200,70,1024,768,0,0,0) ; l'ecran
;
TextGadget(#Gadget_text, x_bouton, y_bouton+150, 200, 30, "" )

Cordialement
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Pure_Autopaint

Message par Backup »

Exacte ! je le savais , mais je l'avais oublié :lol:

voici le Code de Graph100 corrigé :)

Le code se trouve en premiere page
Dernière modification par Backup le ven. 15/févr./2013 17:49, modifié 8 fois.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: Pure_Autopaint

Message par Anonyme2 »

Sinon

Code : Tout sélectionner

if De >0 And De<2
c'est la même chose que ça mais en plus long :mrgreen:

Code : Tout sélectionner

If De =1
on optimise ...
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Pure_Autopaint

Message par kernadec »

Dobro dans ton code du début
pour l' API beep, il manque les "_" :D

Cordialement
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Pure_Autopaint

Message par Backup »

Denis:
arf !!

lorsque je suis en phase de conception , j'applique une logique de pensées , sans meme reflechir :lol: (corrigé dns le dernier listing )

@kernadec : ha oui ! c'est parce que je dois avoir ça dans un PBI :lol:

Merci je vais modifier ça :)
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: Pure_Autopaint

Message par Anonyme2 »

Dobro a écrit :Denis:
arf !!

lorsque je suis en phase de conception , j'applique une logique de pensées , sans meme reflechir :lol: (corrigé dns le dernier listing )
C'est juste une boutade :mrgreen:
Je te le dis à nouveau : je te tire mon chapeau Dobro pour ce code :wink:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Pure_Autopaint

Message par Backup »

Merci Votre Altesse ! :)

Image
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Pure_Autopaint

Message par Backup »

Je viens de modifier le Dernier listing

de façon a avoir le nom des codeurs qui participent
et aussi de pouvoir utiliser plusieurs Style de peinture
(pour le moment 3 styles sont présent )

mais tout est prèt pour les Ajouts :)

[Reedit]

j'ai ajouté un Style , 2 Styles Croix ... en utilisant un pinceau en forme d’ellipse croisé ..
cela a pour but de montrer comment ajouter un Style :) Au Boulot !! :lol:
Répondre