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
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 )
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
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