Traitement d'image temps reel

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Traitement d'image temps reel

Message par Thyphoon »

ha ba voilà que je m’absente quelques jours et qu'il y a plein de message.

Merci à tous pour votre intérêt.

Pour mon projet de remplacement de Picasa je me base sur 3 applications externes ExifTools, JpegTran, VLC.
ExifTools : pour la manipulation des données Exif, Iptc et Xmp
JpegTran : pour la rotation/mirroire sans perte de qualité des images jpeg
VLC : J'ai reussi a intégré un player de vidéo dans mon application en utilisant un webgadget Je suis ravis du resultat.

En gros j'aimerai retrouver les mêmes fonction de base que dans Picasa comme ce panneau
Image

D'ailleur l'idée de PBMap était pour pouvoir géocaliser les photos dans mon application :P Et je remercie Djes qui a nettement aidé a l'amélioration de cette partie

Voici a quoi ressemble actuellement mon application
Image
ImageImageImage
Et ça fonctionne plutôt bien.
G-Rom a écrit : il y a quelques temps , lors d'une discussion avec Falsam sur son tchat , une dll est née avec ce que tu cherches a faire
Merci G-Rom je vais tester ça, j'étais complètement passé a côté de ça ! comme le dis Zorro, ce qui m'embête avec les Dlls c'est que je maîtrise pas la maintenance du code ou son evolution. Et le C/C++ ça fait tellement longtemps que j'en ai pas fait ... :p
Mais je vais quand même regarder.
case a écrit :j'utilise ces deux procédures quand je veux faire une telle chose
Merci Case ! j'étais tombé pour ces procedures en faisant mes recherches, mais je voulais eviter d'utiliser des APIs
djes a écrit :Quand on travaille sur de grands formats, il faut cesser de penser affichage. Ce qu'on a à l'écran n'est qu'un aperçu. Le résultat est en général destiné à l'impression, avec des machines dont la résolution est largement supérieure à celle des écrans (même si ça progresse de ce côté-là).
Tout a fait d'accord. généralement je traite l'image de Preview bien plus petite.. et une fois le résultat validé je traite en arrière plan l'image en taille réel !
djes a écrit :Ça fait longtemps que je rêve de faire un tel soft aussi, d'autant que Picasa est mort. Bien sûr, c'est trop lourd, trop énorme pour moi. J'imagine que tu veux faire quelque chose de plus simple, plus facile à maîtriser. Ça fait longtemps aussi que je pense que PB est super, mais qu'il faudrait qu'on normalise un peu certaines choses, afin de garder la maîtrise qu'on a, et qu'on puisse l'adapter à de gros codes.

Par exemple, pour cette histoire de traitement d'images, il ne faut évidemment pas utiliser les fonctions natives de pb et recoder tous les effets, ça prendrait un siècle, et le temps que tu le fasses, on sera en 256 bits par composante. Non, tous les effets ont déjà été codés dans des bibliothèques, ce qu'il faudrait, c'est surtout faire quelque chose de propre pour pouvoir s'interfacer avec.
Et pour ce qui est de faire aussi bien que Photoshop, même si ils sont des centaines de développeurs derrière depuis trente ans, j'ai quelques idées...
Oui ce projet je l'ai depuis très longtemps déjà. Mais je suis pas certain que ça prenne tant de temps que ça. Je n'ai plus autant de temps que quand j'étais étudiant mais doucement mais surement. J'aimerai bien mettre d'ici la fin Août un premier jet fonctionnel.
Pour s'interfacer correctement avec des DLL comme imagemagick je ne maîtrise pas assez pour y arriver. Et je trouve les Librairies pas simple d'utilisations. Même si c'est ultra fonctionnel en ligne de commande.
Zorro a écrit : lorsque je parle de point() c'est juste pour mettre en tableau
ensuite le traitement des couleurs se fait dans le tableau

le plot n'interviens qu'a la fin pour reconstituer la nouvelle image ...
Pour reconstituer l'image un copy memory est suffisant normalement si tu as gardé la structure. Je vais me pencher sur la mise en tableau d'une image
Avec des pointeurs et des structures différente en fonction du type d'image RRGGBB ou BBGGRR ou BBGGRRAA etc...
Mais si tu as un exemple sans API je suis intéressé :P
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Traitement d'image temps reel

Message par Zorro »

Thyphoon a écrit : Mais si tu as un exemple sans API je suis intéressé :P

Le Soldat inconnu avait fait tout un tas de codes a ce sujet

l'image est mise en tableau (Pixel(x,y)
puis le traitement a lieu lorsqu'on clique sur l'image (ici augmentation de la luminosité sur un jpg choisi ) ... Faire plusieur click sur l'image pour voir le resultat

note que meme lancé avec Debugger ON , ça pedale !! :)

perso tout mes codes utilisant du graphisme , utilise ce principe de mise en tableau et travail sur tableau .. le tableau represente en fait les couleurs de l'image

c'est a mon avis l'un des modes les plus rapide et les plus conviviale en Purebasic ......

une fois compilé, c'est du quasi temps reel ! :)

Code : Tout sélectionner


; Le Soldat inconnu
; Purebasic v4.51
;plus de luminosité
; cliquer sur l'image avec le bouton gauche

#img = 0
#Barre = 1
#win=0

UseJPEGImageDecoder ()
file$=OpenFileRequester("ouvrir jpg","c:\","*.jpg",1)
LoadImage ( #img , file$)

; récupère la dimension de l'image
ResizeImage(#img,800,600)
ImageX = ImageWidth (#img)
ImageY = ImageHeight (#img)


; Couleur d'ajout
Couleur_Ajout = RGB (20, 255, 20)

If OpenWindow (#win, 0, 0, ImageX, ImageY + 20, "Luminosité", #PB_Window_SystemMenu | #PB_Window_ScreenCentered  )
   
   If CreateGadgetList ( WindowID (#win))
      ImageGadget ( #img , 0, 0, ImageX, ImageY, ImageID( #img ))
      ProgressBarGadget ( #Barre , 0, ImageY + 2, ImageX, 18, 0, ImageX)
   EndIf
   
   ; On récupère l'image
   Dim Pixel.l(ImageX, ImageY)
   ;UseImage( #img )
   StartDrawing ( ImageOutput (#img))
      For Px = 0 To ImageX-1
         For Py = 0 To ImageY-1
            Pixel(Px, Py) = Point (Px, Py)
         Next
         ; on fait progresser la barre
         SetGadgetState ( #Barre , Px)
      Next
   StopDrawing ()
   
   ; On initialise le niveau de luminosité
   Niveau.f = 0.1
   
   Repeat
      Event = WaitWindowEvent ()
      
      If Event = #WM_LButtonDown ; si on clique sur le bouton gauche de la souris
         ;   UseImage( #img )
         StartDrawing ( ImageOutput (#img)) ; on dessine sur l'image
            x = 0 ; on se place en x=0 sur l'image
            Repeat
               y = 0 ; on se place en y=0 sur l'image
               Repeat
                  ; on récupère la couleur du point en x et y
                  Couleur = Pixel(x, y)
                  Rouge.f = Red (Couleur)
                  Vert.f = Green (Couleur)
                  Bleu.f = Blue (Couleur)
                  
                  ; On augmente la luminosité
                  Rouge = Rouge * (Niveau + 1)
                  If Rouge > 255 : Rouge = 255 : EndIf
                  Vert = Vert * (Niveau + 1)
                  If Vert > 255 : Vert = 255 : EndIf
                  Bleu = Bleu * (Niveau + 1)
                  If Bleu > 255 : Bleu = 255 : EndIf
                  
                  ; On recalcule la nouvelle couleur
                  Couleur = RGB (Rouge, Vert, Bleu)
                  
                  ; si la taille du nouveau pixel est positive
                  Plot (x, y, Couleur) ; on dessine un carré qui fait le nouveau pixel de la même couleur que celle récupéré en x et y
                  
                  ; on se déplace sur l'image en y de la taille d'un pixel
                  y = y + 1
               Until y >= ImageY ; si on a finit la colonne de l'image placé en x
               
               ; on se déplace sur l'image en x de la taille d'un pixel
               x = x + 1
               ; on fait progresser la barre
               SetGadgetState ( #Barre , x)
               
            Until x >= ImageX ; si on a traité toutes les lignes de l'image
            
         StopDrawing ()
         
         ; on réaffiche l'image
         SetGadgetState ( #img , ImageID( #img ))
         
         ; on augmente le niveau de luminosité
         Niveau + 0.1
         
      EndIf
   Until Event = #WM_close ; on clique sur la croix, fin du prog
   
EndIf 

; 
; EPB 



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
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Traitement d'image temps reel

Message par Thyphoon »

Merci effectivement j'avais testé les codes de LSI il y a fort longtemps et j'avais pas réussi a tout retrouver

mais n'y a t'il pas moyen avec un pointeur de coller un tableau a l'adresse de l'image ?
genre

Code : Tout sélectionner

Structure PixelRGBA
  StructureUnion
    rgba.l
    channel.b[4]
  EndStructureUnion
EndStructure
Dim Pixel.PixelRGBA(Width,Height)

startDrawing(imageoutput(1))
  copymemory(Drawingbuffer(),@Pixel(),width*height*drawinbufferpitch()/width)
stopdrawing()
loll bon je vais me tester ça dans un PB
Dernière modification par Thyphoon le ven. 04/août/2017 10:57, modifié 1 fois.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Traitement d'image temps reel

Message par falsam »

Zorro a écrit :une fois compilé, c'est du quasi temps reel !
Calme ta joie Zorro. Si ce code est rapide c'est uniquement parce que le traitement traite une image retaillée en 800x600.

Commente

Code : Tout sélectionner

;ResizeImage(#img,800,600)
et relance ton code avec une vrai image de qualité en 4000 x 3000 pixels et on en reparle :wink:
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
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Traitement d'image temps reel

Message par Thyphoon »

falsam a écrit :
Zorro a écrit :une fois compilé, c'est du quasi temps reel !
Calme ta joie Zorro. Si ce code est rapide c'est uniquement parce que le traitement traite une image retaillée en 800x600.

Commente

Code : Tout sélectionner

;ResizeImage(#img,800,600)
et relance ton code avec une vrai image de qualité en 4000 x 3000 pixels et on en reparle :wink:
C'est pour ça que dans mon code je decoupe le traitement dans des Threads et ça marche plutôt bien même avec des photos de 12M
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Traitement d'image temps reel

Message par G-Rom »

comme le dis Zorro, ce qui m'embête avec les Dlls c'est que je maîtrise pas la maintenance du code ou son evolution.
La dll n'évoluera pas toute seule, elle n'utilise aucune API , donc , elle fonctionnera sur les x86 & x64 ( win & linux ) tant que les processeurs existerons.
Avatar de l’utilisateur
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Traitement d'image temps reel

Message par Thyphoon »

G-Rom a écrit : La dll n'évoluera pas toute seule, elle n'utilise aucune API , donc , elle fonctionnera sur les x86 & x64 ( win & linux ) tant que les processeurs existerons.
ça j'aime ^_^
Et il y a moyen de rajouter des fonctions au besoin ?

Bon sinon mon idée de tout a l'heure ça ne fonctionne pas

Code : Tout sélectionner

Structure PixelRGBA
  StructureUnion
    rgba.l
    channel.b[4]
  EndStructureUnion
EndStructure

image.i=CreateImage(#PB_Any,200,200)
StartDrawing(ImageOutput(image))
For x=0 To 50
  For y=0 To 50
    Plot(x,y,RGBA(120,120,120,200))
  Next
Next 
StopDrawing()
Dim PixelTable.PixelRGBA(ImageWidth(image),ImageHeight(image))
Debug @PixelTable()
StartDrawing(ImageOutput(image))
CopyMemory(DrawingBuffer(),@PixelTable(),ImageWidth(image)*ImageHeight(image)*(DrawingBufferPitch()/ImageWidth(image)))
StopDrawing()
Debug PixelTable(10,10)\rgba
Debug PixelTable(10,10)\channel[0]
Debug PixelTable(10,10)\channel[1]
Debug PixelTable(10,10)\channel[2]
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Traitement d'image temps reel

Message par Zorro »

falsam a écrit :
Zorro a écrit :une fois compilé, c'est du quasi temps reel !
Calme ta joie Zorro. Si ce code est rapide c'est uniquement parce que le traitement traite une image retaillée en 800x600.

Commente

Code : Tout sélectionner

;ResizeImage(#img,800,600)
et relance ton code avec une vrai image de qualité en 4000 x 3000 pixels et on en reparle :wink:
le principe c'est justement de faire un affichage reduit, pour le temps reel
et de travailler en arriere plan ou au moment de la sauvegarde avec la taille reel !!

je fais un prg qui retouche les images Sat pour Xplane , chaque image fait 10,6 mega en 4096 x 4096 Pixels ...

mon soft acuellement en est la :
https://www.youtube.com/watch?v=1wUR2KW ... e=youtu.be

ma preview est en 300x300 , ça suffit pour le rendu , ensuite pour le batch, c'est effectivement plus long, mais on s'en fout, c'est le travail final :)

sous photoshop c'est pareil , ton image affiché n'a pas le vrais nombre de point ... puisque meme la plupart des ecrans ne suivraient pas
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: Traitement d'image temps reel

Message par falsam »

Zorro a écrit :ensuite pour le batch, c'est effectivement plus long, mais on s'en fout
ça va t'obliger à mémoriser toutes les étapes de ton traitement d'image (Contraste, luminosité, etc ....) et ensuite appliquer ces traitements au moment de la sauvegarde. Le temps de traitement sera beaucoup trop long.

j'ai déja utilisé PhotoShop ou PhotoFiltre Studio et bien que l'image est réduite, le traitement est bien en temps réel.
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: Traitement d'image temps reel

Message par Zorro »

falsam a écrit :
Zorro a écrit :ensuite pour le batch, c'est effectivement plus long, mais on s'en fout
ça va t'obliger à mémoriser toutes les étapes de ton traitement d'image (Contraste, luminosité, etc ....) et ensuite appliquer ces traitements au moment de la sauvegarde. Le temps de traitement sera beaucoup trop long.

j'ai déja utilisé PhotoShop ou PhotoFiltre Studio et bien que l'image est réduite, le traitement est bien en temps réel.
en l'occurence non , car le parametre reste le meme pour toutes les images du batch
le but n'est pas de faire de la correction specifique a chaque image , mais de globalement faire une modification
par exemple, souvent il manque du contraste pour que le paysage ressorte dans le simulateur, les images deviennent plus "laiteuse" dans le simulateur
que lors de la consultation avec un viewer ..
mais j'avais pensé aussi faire du traitement en modulant les parametres par images.... un peu comme une table de mixage de studio son...(on vois les curseurs bouger tout seul :lol:

le traitement photoshop est en temps reel que sur la partie affiché a l'ecran
le reste est fait en arriere plan, pendant qu'on fait autre chose...
ça se vois sur un ordi un peu lent, lorsqu'on scroll l'image , on vois s'effectuer les raccords ..

un peu le principe de la 3D ou ne sont calculé que les elements "visible"
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: Traitement d'image temps reel

Message par Zorro »

@Grom, je vais tester ta dll :)

oui ça marche bien , manque la possibilité de changer les niveaux RGB d'une image , et se serai parfait pour moi :)
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
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Traitement d'image temps reel

Message par djes »

Je bosse beaucoup avec des images de grande taille (avec photoshop depuis des lustres), et pour ce qui est des images satellites ou aériennes, il y a de super outils comme QuantumGIS, qui permet d'utiliser facilement les outils de GRASS. Je comprends qu'on ait envie de tout maîtriser bien sûr, mais ça vaut le coup de jeter un coup d’œil rien que pour voir ce qu'on peut faire... (c'est un autre monde)
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Traitement d'image temps reel

Message par falsam »

Zorro a écrit :manque la possibilité de changer les niveaux RGB d'une image
C'est prévu dans la todolist :wink:
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: Traitement d'image temps reel

Message par Zorro »

cool :)

quoiqu'il en soit, je continue sans :)
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
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Traitement d'image temps reel

Message par Thyphoon »

c'est vrai que la DLL fonctionne vraiment bien ^_^
@Falsam
Il y a possibilité de rajouté des fonctions pour
-Changer Température des couleurs
-Eclairage d'appoint
-Hautes Lumières
-Ombres
-netteté
:P

Et pourquoi pas rajouter la création d'histogramme a partir d'une image :roll: :mrgreen:

En tout cas Bravo pour le boulot
Répondre