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 :

Traitement d'image temps reel

Message par Thyphoon »

Bonjour,
Pour un projet de plus grand ampleur qui a pour but de remplacer l'application Picasa, je cherche a pouvoir faire des réglages en temps réel sur une image.
Luminosité,Contraste, Saturation, Gamma, Lumière haute, Lumière Basse, etc...
Voici ou j'en suis. A compiler avec les Threads activés et en désactivant le debugger (pour des questions de rapidité). Il faut juste changer l'image qu'on charge dans l'exemple en fin de programme avec une image pas trop grosse quand même.
Si vous avez des conseils pour améliorer cela, si vous savez ou trouver des algos Luminosité/Contraste/Saturation/ Gamma etc... Je suis preneur
Car pour l'instant il n'y a que la luminosité et le contraste, mais j'ai pas le même rendu que dans photoshop.
Ha et une dernière question comment savoir le nombre de Thread a utiliser pour être le plus efficace ? est ce qu'il y a une régle en fonction du nombre de coeur du processeur ou autre ?

Code : Tout sélectionner

UseJPEGImageDecoder() 
UseJPEG2000ImageDecoder() 
UsePNGImageDecoder() 
UseTIFFImageDecoder() 
UseTGAImageDecoder() 
UseJPEGImageEncoder() 
UsePNGImageEncoder() 

Macro limit(var, l, u)
  If (var) < (l) : var = l : EndIf
  If (var) > (u) : var = u : EndIf
EndMacro

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

Structure myImage
  image.i
  width.i
  height.i
  pixels.i
  srcMem.i
EndStructure

Enumeration PixelFormat
  #PF_Unknow
  #PF_Palette
  #PF_RRGGBB
  #PF_BBGGRR
EndEnumeration

Structure TImage
  ImgSrc.i
  memSrc.i
  ImgTgt.i
  memDest.i
  
  DrawingBuffer.i ; Temp DrawingBuffer Address
  Pixels.i        ; total pixel
  PixelSize.b     ; Octets
  PixelFormat.b   ; See Enumertaion PixelFormat
  ReversedY.b     ; #True or #False
  Pitch.l         ; BYTES in One ligne
  Lenght.i        ; Size
  
  Brightness.l
  Contrast.f
  
EndStructure

Structure imageThread
  ThreadId.i
  *image.TImage
  PixelStart.i
  PixelEnd.i
  
  Brightness.l
  Contrast.f
  
EndStructure


Procedure Thread_Brightness(*info.imageThread)
  Protected *src.myImageRGBA
  Protected *dst.myImageRGBA
  Protected int.i
  Protected Pixel.i
  Debug "In Thread:"+Str(*info\PixelStart)+" to "+Str(*info\PixelEnd)
  For Pixel=*info\PixelStart To *info\PixelEnd
    *src=*info\image\memSrc + Pixel * *info\image\PixelSize
    *dst=*info\image\memDest + Pixel * *info\image\PixelSize
    For channel = 0 To *info\image\PixelSize-1 ; 4 Channel
      int = *src\channel[channel] & $FF
      If channel<3
        ;Brightness
        If *info\Brightness<>0
          int = Int(int *(1+*info\Brightness/100))
          limit(int, 0, $FF)
        EndIf
        ;contrast      
        If *info\Contrast<>1
          int=Int(int+ *info\Contrast / 100 * (int-127))
          limit(int, 0, $FF)
        EndIf
      EndIf 
      *dst\channel[channel] = int
    Next channel
  Next
EndProcedure

Procedure myLoadImage(Name.s)
  Protected *image.TImage
  *image=AllocateMemory(SizeOf(TImage))
  *image\ImgSrc=LoadImage(#PB_Any,Name)
  *image\ImgTgt=CreateImage(#PB_Any,ImageWidth(*image\ImgSrc),ImageHeight(*image\ImgSrc),ImageDepth(*image\ImgSrc))
  *image\Pixels=(ImageWidth(*image\ImgSrc))*(ImageHeight(*image\ImgSrc))
  StartDrawing(ImageOutput(*image\ImgSrc))
  *image\DrawingBuffer=DrawingBuffer()
  *image\Pitch=DrawingBufferPitch()
  Select DrawingBufferPixelFormat() & $FF
    Case  #PB_PixelFormat_8Bits
      Debug ("8bit 1 octet par pixel, palettisé")
      *image\PixelSize=0
      *image\PixelFormat=#PF_Palette
    Case #PB_PixelFormat_15Bits
      Debug("15 Bits 2 octets par pixel")
      *image\PixelSize=2
      *image\PixelFormat=#PF_Unknow
    Case #PB_PixelFormat_16Bits
      Debug("16 Bits 2 octets par pixel")
      *image\PixelSize=2
      *image\PixelFormat=#PF_Unknow
    Case #PB_PixelFormat_24Bits_RGB
      Debug("24 Bits 3 octets par pixel (RRGGBB)")
      *image\PixelSize=3
      *image\PixelFormat=#PF_RRGGBB
    Case #PB_PixelFormat_24Bits_BGR
      Debug("24 Bits 3 octets par pixel (BBGGRR)")
      *image\PixelSize=3
      *image\PixelFormat=#PF_BBGGRR
    Case #PB_PixelFormat_32Bits_RGB
      Debug("32 Bits 4 octets par pixel (RRGGBB)")
      *image\PixelSize=4
      *image\PixelFormat=#PF_RRGGBB
    Case #PB_PixelFormat_32Bits_BGR
      Debug("32 Bits 4 octets par pixel (BBGGRR)")
      *image\PixelSize=4
      *image\PixelFormat=#PF_BBGGRR
  EndSelect
  If DrawingBufferPixelFormat() & #PB_PixelFormat_ReversedY
    *image\ReversedY=#True
  Else
    *image\ReversedY=#False
  EndIf
  Debug "Pixel Size:"+Str(*image\PixelSize)
  Debug "Pixel Size2:"+StrF(*image\Pitch/ImageWidth(*image\ImgSrc))
  *image\Lenght=*image\Pixels * *image\PixelSize
  *image\memSrc=AllocateMemory(*image\Lenght)
  CopyMemory(*image\DrawingBuffer,*image\memSrc,*image\Lenght)
  *image\memDest=AllocateMemory(*image\Lenght)
  StopDrawing()
  ProcedureReturn *image
EndProcedure 


Procedure Action(*image.TImage)
  Protected NbThread=16
  Protected ThreadLenght=Int(*image\Pixels/NbThread)
  Debug Str(*image\Pixels)+" pixels to traite"
  NewList info.imageThread()
  For z=0 To NbThread-1
    AddElement(info())
    info()\image=*image
    info()\PixelStart=ThreadLenght*z
    info()\PixelEnd=ThreadLenght*z+ThreadLenght-1
    info()\Brightness=*image\Brightness
    info()\Contrast=*image\Contrast
    Debug Str(info()\PixelStart)+" to "+Str(info()\PixelEnd)
    Debug "Thread:"+Str(z)
    info()\ThreadId=CreateThread(@Thread_Brightness(),@info())
  Next
  ForEach info()
    WaitThread(info()\ThreadId)
  Next
  StartDrawing(ImageOutput(*image\ImgTgt))
  CopyMemory(*image\memDest,DrawingBuffer(),*image\Lenght)
  StopDrawing()
EndProcedure

Enumeration
  #Win_Main
  #Gdt_Canvas
  #Gdt_Brigthness
  #Gdt_Contrast
EndEnumeration

DisableDebugger
If OpenWindow(#Win_Main, 0, 0, 1024, 600, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(#Gdt_Canvas, 0, 0, 600, 600)
  TrackBarGadget(#Gdt_Brigthness, 610, 10, 200, 24, 0, 200):SetGadgetState(#Gdt_Brigthness,100)
  TrackBarGadget(#Gdt_Contrast, 610, 48, 200, 24, 0, 200):SetGadgetState(#Gdt_Contrast,100)
  *image.TImage
  *image=myLoadImage("D:\Photo Tags\IMG_20170730_093817.jpg")
  StartDrawing(CanvasOutput(#Gdt_Canvas))
  DrawImage(ImageID(*image\ImgSrc),0,0,800,600)
  StopDrawing()
  Repeat
    Event = WaitWindowEvent()
    
    If Event = #PB_Event_Gadget
      Select EventGadget()
        Case #Gdt_Brigthness, #Gdt_Contrast
          *image\Brightness=GetGadgetState(#Gdt_Brigthness)-100
          *image\Contrast=(GetGadgetState(#Gdt_Contrast)-100)
          Action(*image)
          StartDrawing(CanvasOutput(#Gdt_Canvas))
          DrawImage(ImageID(*image\ImgTgt),0,0,800,600)
          StopDrawing()
      EndSelect    
    EndIf 
  Until Event = #PB_Event_CloseWindow
EndIf
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Traitement d'image temps reel

Message par Zorro »

pas mal !!! :)

a quoi correspond le "

Code : Tout sélectionner

;int = Int((int + *info\Brightness))
" ?

car pour modifier une seule composante par exemple le rouge tu ferai comment avec ton code ?


ps: peut etre faudrai t'il renommer ta procedure Thread_Brightness() en Thread_action()

parceque si j'ai bien compris c'est dans cette procedure que tu modifie soit le contrast soit la luminosité ....
donc, le nom porte a confusion :)


Ps2: je ne suis pas sur que l'emploi des pointeurs...
soit plus rapide que l'emploi dd'une boucle For next et de Plot() ...
a partir du moment ou l'image est chargé dans un tableau .... ! ??

faudrai comparer pour voir :)

l'emploi d'un tableau est quand meme plus convivial , puisque chaque pixel est adressable de façon logique
alors que l'emploi des pointeurs oblige une gymnastique intellectuel pour retrouver un pixel precis ... qu'en pense tu yo de poel ?


ps : ajoute ceci pour nos tests :

Code : Tout sélectionner

File.s=OpenFileRequester("ouvrir une image", "d:\","*.*",1)
*image=myLoadImage( File.s)
Dernière modification par Zorro le mar. 01/août/2017 15:28, 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
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Traitement d'image temps reel

Message par Thyphoon »

Zorro a écrit :pas mal !!! :)

a quoi correspond le "

Code : Tout sélectionner

;int = Int((int + *info\Brightness))
" ?

car pour modifier une seule composante par exemple le rouge tu ferai comment avec ton code ?
Merci, j'ai pas mal galéré pour trouver une solution pour que ce soit suffisamment rapide

La ligne dont tu parles c'était pour faire des testes dans une vielle version et qui était resté là lollll

Si tu veux changer juste la couleur rouge Il faut dans la procedure Thread_Brightness utiliser la variable *info\image\memDest\PixelFormat
qui peut avoir comme valeur
#PF_Unknow ou #PF_Palette ou #PF_RRGGBB ou #PF_BBGGRR

Pour connaitre dans quel ordre sont stocké les couleurs
Exemple si = PF_RRGGBB

dans la boucle For channel = 0 To
Alors :
channel = 0 pour le rouge
channel = 1 pour le vert
channel = 2 pour le Bleu

Après mon code est pas très propre faut que j'essaie d'améliorer tout ça
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Traitement d'image temps reel

Message par Zorro »

en tout cas merci pour le partage, ça permet de voir d'autres façons d'aborder le probleme

faut reconnaitre que Purebasic peche par sa rapidité concernant le graphisme !!

(il suffit d'utiliser photoshop pour en etre persuadé 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
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Traitement d'image temps reel

Message par Thyphoon »

Zorro a écrit :en tout cas merci pour le partage, ça permet de voir d'autres façons d'aborder le probleme

faut reconnaitre que Purebasic peche par sa rapidité concernant le graphisme !!

(il suffit d'utiliser photoshop pour en etre persuadé LOL )
De rien, ça faisait longtemps que j'avais pas partager quelques choses :wink:
Oui le traitement d'image avec des pointeurs est infiniment plus rapide qu'avec les fonctions plot()/point()
Je vais essayer d'améliorer mon code pour qu'on puisse facilement rajouter des effets ...
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 : Oui le traitement d'image avec des pointeurs est infiniment plus rapide qu'avec les fonctions plot()/point()
non pas sur !!
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 ...

j'ai deja fait plusieurs prg qui utilise ce principe, on a aussi du temps réél ;)
mais plus simple puisque l'emploi d'un tableau permet de connaitre les coordonées d'un pixel
utile par exemple si tu effectues le déplacement d'un plan de couleur, ou d'une couleur particuliere
par rapport aux autres ...
ou bien pour ne travailler que sur une zone précise ...

alors que ton systeme de pointeur te renvoi au final une seule ligne de données , auquel il faut jongler pour atteindre un pixel ou une zone image dans cette longue ligne de données
ça reviens en fait a mettre une image sur une seule ligne....

alors que le principe du tableau, c'est qu'une image reste en 2 dimensions :)

voila pourquoi je parlais de convivialité du traitement d'une image dans un tableau a 2 dimensions
on retrouve au final ce qu'on vois a l'ecran :)
le temps qu'on peut eventuellement perdre d'un coté, (mise en tableau et reconstitution au final) on le gagne de l'autre (traitement plus simple par coordonées de pixel)

mais comme je te le dis, je trouve bien d'essayer cette approche, mais en dehors de certains traitements, des que tu va attaquer plus évolué que la lumiere ou le contraste
tu vas te tirer des balles :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
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Traitement d'image temps reel

Message par djes »

Ç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...
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Traitement d'image temps reel

Message par Zorro »

passer par une librairie externe specialisé, peut etre ...
mais c'est accepter de ne pas avoir la maitrise total du code ..

je pense bien sur , pour en avoir donné un exemple d'utilisation a imagemagik
qui est super tres tres rapide, mais utilisation en ligne de commande oblige ...
a moins de refaire un wrapper de la dll ...

il y a d'autres librairie du meme type je pense a OpenCV par exemple
qui m'avais meme été conseillé par Fred a une epoque ou ce sujet avait deja été abordé ....

la question de fond que je me pose, c'est pourquoi dans d'autre langage informatique
les codeurs ne semblent pas etre confronté a ce probleme de lenteur ....?

il suffit de faire executer le scan par la fonction Point(x,y) d'une image en 1024*1080 et de chronometrer pour se rendre compte du probleme !
et nous allons vers des traitement d'images ,et de videos dont la norme sera 4K ....

en ce moment je m'amuse (pour ma culture personnel ) avec After-Effect , je suis épaté de la facilité des prg Adobe pour gérer des images (et films) enormes
comme si de rien n'etait !!
alors sans demander a avoir les fonctions de chez Adobe, il y a de la marge .... ça serai super de disposer de fonctions adaptées a notre epoque (au moins le Full-HD)
relativement véloce (c'est ma commande au Pere Noel :lol: )
je pense surtout a un point() et a un plot() rapide...

j'imagine, que cela depasse probablement les compétences du Dieu a KCC , on ne peut pas etre bon partout ... :)

il me semble pourtant avoir lu que le Point() Purebasic etait tiré de l'API windows.... alors comment expliquer cette lenteur ?
peut etre dans la gestion meme de l'application de cette Api avec purebasic ?
par exemple la mise a jour du "Canvas" qui se ferai a chaque utilisation ? ou un truc du genre ...?

cette lenteur par rapport a d'autres langages (ou librairie ) , doit bien s'expliquer d'une façon ou une autre non ? (j'y connais rien, alors je pose la question )
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 »

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

Ca fait longtemps que les équipes d'Adobe ont planché sur des routines hyper-rapides de traitement d'images de grand format. Et tu te doutes que ça n'a rien à voir avec un malheureux plot()... Le principal problème de l'affichage des PC est le bus entre la mémoire centrale et la mémoire vidéo. Non seulement le calcul de la position du point est lent, mais en plus, tu mobilises le bus pour un seul point à la fois ! Ca ne peut pas être rapide.

Nos processeurs ont depuis une éternité tout un tas de fonctions pour travailler sur une grande quantité de données simultanément. Tout se fait en mémoire centrale, et on balance un aperçu à la carte graphique. C'est comme ça que ça se faisait, avant l'apparition des cartes graphiques avec les unités programmables. Aujourd'hui, on peut aussi faire faire ces calculs à la carte graphique. Mais celle-ci ne peut pas traiter des images d'un trop grand format, si on veut s'en servir, il faut forcément scinder (découper en morceaux) le travail.
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Traitement d'image temps reel

Message par Zorro »

Tout se fait en mémoire centrale, et on balance un aperçu à la carte graphique
Fred a creer les fonctions "Stardrawing()" et StopDrawing()

le probleme c'est qu'entre ces deux fonctions l'affichage est mis a jour a l'ecran ...
il faudrait supprimer cette mise a jour et creer une fonction d'affichage effectif a l'ecran comme en 3d
avec la fonction " RenderWorld([TempsPhysiqueEcoulé])"

il faudrai alors une fonction style Render2D() pour que l'affichage se fasse d'un coup et pas a chaque Point() ou plot()

on avait ça en StosBasic :D une fonction pour permuter les memoires videos :
BACK Adresse du décor
PHYSIC " de l'écran physique, celui qu'on voit
LOGIC " " logique
On l'échange avec le physique par SCREEN SWAP
Dernière modification par Zorro le mer. 02/août/2017 9:26, 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"
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

Re: Traitement d'image temps reel

Message par Marc56 »

Je pense que des boites comme addobe doivent commencer par penser algo mathématique avant de penser langage :)
Et comme il font ça depuis des années et à quelques centaines de programmeurs, il y a peu de chance de faire mieux (voir égal) de notre côté :mrgreen:

Déjà, dans « l'ancien temps » (années 90') les programmes de traitement d'image rusaient par exemple en traitant par zones (un peu comme le jpg progressif) et jamais en traitant l'image toute entière.

C'est par ce type d'approche qu'il faut commencer (je pense)

:wink:
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 »

Zorro a écrit :
Tout se fait en mémoire centrale, et on balance un aperçu à la carte graphique
Fred a creer les fonctions "Stardrawing()" et StopDrawing()

le probleme c'est qu'entre ces deux fonctions l'affichage est mis a jour a l'ecran ...
il faudrait supprimer cette mise a jour et creer une fonction d'affichage effectif a l'ecran comme en 3d
avec la fonction " RenderWorld([TempsPhysiqueEcoulé])"

il faudrai alors une fonction style Render2D() pour que l'affichage se fasse d'un coup et pas a chaque Point() ou plot()

on avait ça en StosBasic :D une fonction pour permuter les memoires videos :
BACK Adresse du décor
PHYSIC " de l'écran physique, celui qu'on voit
LOGIC " " logique
On l'échange avec le physique par SCREEN SWAP
Oui, ce serait sans doute possible, mais PB est surtout un support multi-plateformes, il n'est pas fait pour être parfait dans tout. Par exemple, le plot() sert à la fois pour l'affichage fenêtré, pour les images, pour les écrans, et sur plusieurs OS il doit donner le même résultat. Ca complexifie énormément le travail ! Si on veut un truc vraiment rapide, il faut le coder soi-même, ça me semble normal...
Déjà, avec la lib vector, on a un truc qui ressemble à des listes d'opérations graphiques. Et ça existe aussi pour l'OpenGL qui, mine de rien, est toujours bel et bien là. Je crois me souvenir qu'il y avait un exemple de plot rapide avec.
Marc56 a écrit :Déjà, dans « l'ancien temps » (années 90') les programmes de traitement d'image rusaient par exemple en traitant par zones (un peu comme le jpg progressif) et jamais en traitant l'image toute entière.

C'est par ce type d'approche qu'il faut commencer (je pense)
Complètement d'accord.
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Traitement d'image temps reel

Message par Zorro »

djes a écrit : Oui, ce serait sans doute possible, mais PB est surtout un support multi-plateformes, il n'est pas fait pour être parfait dans tout.
là tu met le doigt sur LE probleme de Purebasic !

c'est tres attirant d'avoir un langage qui marche sur plusieurs plateformes
mais c'est le boulet !! je n'ose penser ce qu'aurai pu faire Fred si le PureBasic n'avait été devellopé QUE sur Windows :)
tout ce temps passé a faire marcher ses fonctions sur les autres systemes... :roll:

:lol: les possesseurs de Mac et de Linux apprécieront ... :lol: mais le fond de ce que je dis reste vrais ... :)

d'ailleurs en l'etat, il aurai peut etre mieux fait de develloper un Purebasic par OS (avec des fonctions spécifiques a chaque )...

a moins d'avoir proposé d'entré un compilo crossCompilation
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
case
Messages : 1528
Inscription : lun. 10/sept./2007 11:13

Re: Traitement d'image temps reel

Message par case »

Zorro a écrit :je n'ose penser ce qu'aurai pu faire Fred si le PureBasic n'avait été devellopé QUE sur Windows
si on vas par la je n'ose penser ce qu'aurai pu faire Fred si le PureBasic n'avait été devellopé QUE sur Amiga :mrgreen:

plus sérieusement il y a déjà moyen de convertir l'image en zone mémoire et poker les valeurs que l'on veux puis de faire l'inverse avec les api windows


j'utilise ces deux procédures quand je veux faire une telle chose

Code : Tout sélectionner

Procedure getmem(ID) ; copie une image dans la memoire pour y effectuer des operations avec peek et poke :) 
	ImageID=  ImageID(id)
	Hdc = CreateCompatibleDC_ ( GetDC_ ( ImageID ))
	If HDC
		bmi.BITMAPINFO
		bm.BITMAP
		GetObject_ ( ImageID , SizeOf(BITMAP), @bm.BITMAP)
		bmi\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
		bmi\bmiheader\biWidth = bm\bmWidth
		bmi\bmiheader\biHeight = bm\bmHeight
		bmi\bmiheader\biPlanes = 1
		bmi\bmiheader\biBitCount = 32
		bmi\bmiheader\biCompression = #BI_RGB
		HList = AllocateMemory (bm\bmWidth*bm\bmHeight*4)
		GetDIBits_ (hDC, ImageID ,0,bm\bmHeight,HList,bmi, #DIB_RGB_COLORS ) 	
		ProcedureReturn HList
	EndIf	
EndProcedure
Procedure putmem(id,mem) ;copie une zone memoire dans une image existante
	ImageID=  ImageID(id)
	Hdc = CreateCompatibleDC_ ( GetDC_ ( ImageID ))
	If HDC
		bmi.BITMAPINFO
		bm.BITMAP
		GetObject_ ( ImageID , SizeOf(BITMAP), @bm.BITMAP)
		bmi\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
		bmi\bmiheader\biWidth = bm\bmWidth
		bmi\bmiheader\biHeight = bm\bmHeight
		bmi\bmiheader\biPlanes = 1
		bmi\bmiheader\biBitCount = 32
		bmi\bmiheader\biCompression = #BI_RGB
		SetDIBits_ (hDC, ImageID ,0,bm\bmHeight,mem,bmi, #DIB_RGB_COLORS ) 			
	EndIf
EndProcedure
ImageImage
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Traitement d'image temps reel

Message par G-Rom »

Bonjour à tous, 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 :
http://www.purebasic.fr/french/viewtopi ... =3&t=15909

Je ne sais pas si elle couvre tout tes besoins, mais je te garantie que c'est du "fast" , tu auras les mêmes résultat qu'avec photoshop. J'ai les sources c++ de dispo qq part chez moi. je peu libéré les sources et rajouté des fct° manquante si besoin.
la dll fonctionne simplement avec des "kernel" , c'est tableau de float qui font des opérations sur chaque pixels en gros... ( https://en.wikipedia.org/wiki/Kernel_(image_processing) )


https://docs.gimp.org/fr/plug-in-convmatrix.html
http://xmcvs.free.fr/astroart/Chapitre4.pdf
http://lodev.org/cgtutor/filtering.html

Évidement, il faudrait rajouté la possibilité d'annuler un effet en cours , de récupéré la progression d'un effet, etc... via un pool event.
Bonne lecture !
Répondre