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 ?
Question sur LoadImage
Re: Question sur LoadImage
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.
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.
-
- Messages : 355
- Inscription : dim. 01/déc./2013 15:29
Re: Question sur LoadImage
Merci nico pour ta réponse 

Re: Question sur LoadImage
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(...)
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
-
- Messages : 355
- Inscription : dim. 01/déc./2013 15:29
Re: Question sur LoadImage
Jolie travail Nico
C'est super rapide comme code là
Avec un test de deux image de 4096 * 4096 et en désactivant le débogueur, ça dure environ 1 secondes
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

C'est super rapide comme code là

Avec un test de deux image de 4096 * 4096 et en désactivant le débogueur, ça dure environ 1 secondes

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
