Page 1 sur 1

Question sur LoadImage

Publié : lun. 10/mars/2014 21:11
par Lord Nelson
Bonjour,

Quand je charge une image avec LoadImage, celui-ci me renvoie une valeur parfois positif, parfois négatif, cette valeur correspond à quoi ?
Puis-je avoir accès à cette image, je m’explique...

Je voudrait avoir accès directement à la zone de mémoire ou LoadImage
charge l'image pour manipuler l'image directement dans la mémoire.

Quand on utilise LoadImage, cette image est bien chargé en mémoire non ?!
Et ça prends un peut de temps même s'il est minime, donc je voudrait éditer, modifier cette image directement
dans cette mémoire au lieux de passer par autre chose mais peut être que je ne m'y prends pas bien !

Quoi qu'il en soit, elle sert à quoi cette valeur que renvoie cette commande ?

Re: Question sur LoadImage

Publié : lun. 10/mars/2014 23:00
par nico
C'est un Handle comme souvent (un identifiant représentant une zone mémoire)
Dans le cas présent, l'appellation est Hbitmap

Pour récupérer et modifier les valeurs, il faut passer par les API SetDIBits et GetDIBits.

Re: Question sur LoadImage

Publié : mar. 11/mars/2014 9:22
par Lord Nelson
Merci nico pour ta réponse :)

Re: Question sur LoadImage

Publié : mar. 11/mars/2014 21:48
par nico
Cela a été compliqué et ardu (parce que ça fait longtemps que j'ai pas joué avec ça), donc voici un exemple qui superpose deux images nommées 1 et 2 et met le résultat dans 1:
Rappel : ImageID(...) = Hbitmap = loadimage(...)

Code : Tout sélectionner

Structure BGRA
  Blue.a
  Green.a
  Red.a
  Alpha.a
EndStructure


Procedure SuperpositionDeDeuxImages(ImageID1.l, ImageID2.l)
  
  If IsImage(ImageID1) <> 0 And IsImage(ImageID2) <> 0
    
    ImageWidth = ImageWidth(ImageID1) : ImageHeight = ImageHeight(ImageID1)
    
    *mem1 = GlobalAlloc_(#GMEM_FIXED | #GMEM_ZEROINIT, ImageWidth*ImageHeight*4)
    *mem2 = GlobalAlloc_(#GMEM_FIXED | #GMEM_ZEROINIT, ImageWidth*ImageHeight*4)
    
    If *mem1 <> 0 And *mem2 <> 0
      bmi.BITMAPINFO
      bmi\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
      bmi\bmiHeader\biWidth = ImageWidth
      bmi\bmiHeader\biHeight = ImageHeight
      bmi\bmiHeader\biPlanes = 1
      bmi\bmiHeader\biBitCount = 32
      bmi\bmiHeader\biCompression = #BI_RGB
      
      hdcimage1 = StartDrawing(ImageOutput(ImageID1))
      hdc1 = CreateCompatibleDC_(hdcimage1)
      Image1=CreateCompatibleBitmap_(hdcimage1,ImageWidth,ImageHeight)
      SelectObject_(hdc1, Image1)
      BitBlt_(hdc1,0,0,ImageWidth,ImageHeight,hdcimage1,0,0,#SRCCOPY)
      StopDrawing()
      
      
      hdcimage2 = StartDrawing(ImageOutput(ImageID2)) 
      hdc2 = CreateCompatibleDC_(hdcimage2)
      Image2=CreateCompatibleBitmap_(hdcimage2,ImageWidth,ImageHeight)
      SelectObject_(hdc2, Image2)
      BitBlt_(hdc2,0,0,ImageWidth,ImageHeight,hdcimage2,0,0,#SRCCOPY)
      StopDrawing()
      
      Result1 = GetDIBits_(hdc1, Image1, 0, ImageHeight, *mem1, bmi, #DIB_RGB_COLORS)
      
      Result2 = GetDIBits_(hdc2, Image2, 0, ImageHeight, *mem2, bmi, #DIB_RGB_COLORS)
      
      *color1.BGRA= *mem1
      *color2.BGRA = *mem2
      
      For a = 0 To (ImageWidth*ImageHeight)-1
        *color1\Blue = ( *color2\Blue + *color1\Blue ) /2
        *color1\Green = (*color2\Green + *color1\Green ) /2
        *color1\Red = (*color2\Red + *color1\Red ) /2
        
        *color2 + 4
        *color1 + 4
      Next a
      
      hdcimage1 = StartDrawing(ImageOutput(ImageID1))
      If hdcimage1 <> 0
        If SetDIBits_(hdc1, Image1, 0, ImageHeight, *mem1, bmi, #DIB_RGB_COLORS)<>0
          BitBlt_(hdcimage1,0,0,ImageWidth,ImageHeight,hdc1,0,0,#SRCCOPY)
          Result=1
        EndIf
        StopDrawing()
      EndIf
      
      DeleteObject_(hdc1)
      DeleteObject_(hdc2)
    EndIf
    
    If *mem1 <> 0
      GlobalFree_(*mem1)
    EndIf
    
    If *mem2 <> 0
      GlobalFree_(*mem2)
    EndIf
  EndIf
  
  ProcedureReturn Result
EndProcedure


UseJPEGImageDecoder()
;UsePNGImageDecoder()

#Fenetre = 0
#Image = 0

; Au besoin changer le chemin et nom de fichier des images !
LoadImage(1, "C:\Users\Public\Pictures\Sample Pictures\Hydrangeas.jpg")
LoadImage(2, "C:\Users\Public\Pictures\Sample Pictures\Koala.jpg")

; Exemple d'utilisation de plusieurs onglets...
If OpenWindow(#Fenetre, 0, 0, 600, 600, "Image - Utilisation des API : GetDIBits et SetDIBits", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget |#PB_Window_ScreenCentered)
  
  ImageGadget(#Image, 0, 0, 600, 600, 0)
  
  If SuperpositionDeDeuxImages(1, 2) = 1
    SetGadgetState(#Image, ImageID(1))
  EndIf
  
  Repeat
    event=WaitWindowEvent()
    
  Until event=#PB_Event_CloseWindow
EndIf

Re: Question sur LoadImage

Publié : mar. 11/mars/2014 23:18
par Lord Nelson
Jolie travail Nico :)

C'est super rapide comme code là :D

Avec un test de deux image de 4096 * 4096 et en désactivant le débogueur, ça dure environ 1 secondes :P
Par contre, je ne sais pas comment utiliser se code, c'est rageant :(

Mais tu m'as montré que c’était possible et super rapide !
Tu utilise l'image directement en mémoire et sans rien charger en plus, pas de tableau ni rien, directement en mémoire !

Je te remercie, même si je comprends rien à se code, d'autres comprendront
Très belle exemple.

Édit: Tu pourrais me commenter un max le code pour que je puisse comprendre et me débrouillé stp :)