Question sur LoadImage

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Question sur LoadImage

Message 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 ?
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Question sur LoadImage

Message 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.
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Question sur LoadImage

Message par Lord Nelson »

Merci nico pour ta réponse :)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Question sur LoadImage

Message 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
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Question sur LoadImage

Message 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 :)
Répondre