bon, j'ai codé un palliatif en attendant que Fred intégre la couche alpha dans ResizeImage
voilà la bête, il faut toujours un png nommé test mis avec le code.
par exemple cette image :
Code : Tout sélectionner
UsePNGImageDecoder()
Procedure ResizeAlphaImage(Image, Width, Height)
Protected bmi.BITMAPINFO, hdc.l, Memoire, n, nn, bm.BITMAP, Fin, Position, Resultat, ImageAlpha, Memoire2, Memoire3
GetObject_(ImageID(Image), 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
Memoire = AllocateMemory(bm\bmWidth * bm\bmHeight * 4)
If Memoire
hdc = CreateCompatibleDC_(GetDC_(ImageID(Image)))
If hdc
GetDIBits_(hdc, ImageID(Image), 0, bm\bmHeight, Memoire, @bmi, #DIB_RGB_COLORS) ; on récupère la zone mémoire de l'image
DeleteDC_(hdc)
; On convertit la couche Alpha en couleur grise
Fin = Memoire + bm\bmWidth * bm\bmHeight * 4 - 4
For Position = Memoire To Fin Step 4
PokeL(Position, PeekB(Position + 3))
Next
ImageAlpha = CreateImage(#PB_Any, bm\bmWidth, bm\bmHeight, 32)
If ImageAlpha
hdc = CreateCompatibleDC_(GetDC_(ImageID(ImageAlpha)))
If hdc
SetDIBits_(hdc, ImageID(ImageAlpha), 0, bm\bmHeight, Memoire, @bmi, #DIB_RGB_COLORS) ; on envoie la couche alpha dans la nouvelle image
DeleteDC_(hdc)
; On redimensionne les images
ResizeImage(Image, Width, Height)
ResizeImage(ImageAlpha, Width, Height)
GetObject_(ImageID(Image), 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
Memoire2 = AllocateMemory(bm\bmWidth * bm\bmHeight * 4)
If Memoire2
Memoire3 = AllocateMemory(bm\bmWidth * bm\bmHeight * 4)
If Memoire3
hdc = CreateCompatibleDC_(GetDC_(ImageID(ImageAlpha)))
If hdc
GetDIBits_(hdc, ImageID(ImageAlpha), 0, bm\bmHeight, Memoire2, @bmi, #DIB_RGB_COLORS) ; on récupère la zone mémoire de l'image
DeleteDC_(hdc)
hdc = CreateCompatibleDC_(GetDC_(ImageID(Image)))
If hdc
GetDIBits_(hdc, ImageID(Image), 0, bm\bmHeight, Memoire3, @bmi, #DIB_RGB_COLORS) ; on récupère la zone mémoire de l'image
; On recrée la couche alpha de l'image finale
Fin = bm\bmWidth * bm\bmHeight * 4 - 4
For Position = 0 To Fin Step 4
PokeB(Memoire3 + Position + 3, PeekB(Memoire2 + Position))
Next
SetDIBits_(hdc, ImageID(Image), 0, bm\bmHeight, Memoire3, @bmi, #DIB_RGB_COLORS) ; on envoie la couche alpha dans la nouvelle image
DeleteDC_(hdc)
Resultat = ImageAlpha
EndIf
EndIf
FreeMemory(Memoire3)
EndIf
FreeMemory(Memoire2)
EndIf
EndIf
FreeImage(ImageAlpha)
EndIf
EndIf
FreeMemory(Memoire)
EndIf
ProcedureReturn Resultat
EndProcedure
LoadImage(1, "test.png")
If OpenWindow(0, 0, 0, 300, 300, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
End
EndIf
x = ImageWidth(1) / 2
y = ImageHeight(1) / 2
Temps1 = ElapsedMilliseconds()
For n = 0 To 100
CopyImage(1, 3)
ResizeImage(3, x, y, #PB_Image_Raw)
Next
Temps2 = ElapsedMilliseconds()
For n = 0 To 100
CopyImage(1, 4)
ResizeAlphaImage(4, x, y)
Next
Temps3 = ElapsedMilliseconds()
MessageRequester("Temps", "Normal = " + Str(Temps2 - Temps1) + Chr(10) + "Alpha = " + Str(Temps3 - Temps2))
CreateImage(0, 300, 300)
StartDrawing(ImageOutput(0))
Box(0, 0, 300, 300, GetSysColor_(#COLOR_3DFACE))
DrawAlphaImage(ImageID(1), 0, 0)
DrawAlphaImage(ImageID(3), 0, 150)
DrawAlphaImage(ImageID(4), 150, 150)
StopDrawing()
ImageGadget(0, 0, 0, 300, 300, ImageID(0))
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Menu
Select EventMenu() ; Menus
EndSelect
Case #PB_Event_Gadget
Select EventGadget() ; Gadgets
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
comment ça fonctionne ?
c'est pas la bonne question, j'ai fait au plus simple et donc pas très rapide
en gros, je récupère la couche alpha que je transforme en image en nuance de gris
je redim l'image de base et l'image représentant la couche alpha
puis je recombine les 2 images.
il serait tellement plus simple de reprendre l'algo qui gère les couche R, G ou B et de l'appliquer à l'alpha mais bon, l'ami Fred n'a pas répondu à ma demande.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]