Pseudo-usage:
Code: Select all
hImg32 = LoadImage(32bit image)
hImg24 = ConvertImage32to24(hImg32)
FreeImage(hImg32)
ImageGadget(ImageId(hImg24))
Code: Select all
EnableExplicit
Procedure.i ConvertImage32to24(hImg32)
Protected width,height, stride32,stride24, hImg24, *buf32, *buf24, x,y, *p8_24.Ascii, *p8_32.Ascii
If ImageDepth(hImg32) <> 32: ProcedureReturn 0: EndIf
width = ImageWidth(hImg32)
height = ImageHeight(hImg32)
hImg24 = CreateImage(#PB_Any, width, height, 24) ;Create empty 24bit image
If hImg24 = 0: ProcedureReturn 0: EndIf
If StartDrawing(ImageOutput(hImg32)) = 0:
FreeImage(hImg24)
ProcedureReturn 0
EndIf
stride32 = DrawingBufferPitch()
*buf32 = AllocateMemory(height*stride32)
CopyMemory(DrawingBuffer(), *buf32, height*stride32) ;Create copy of 32bit image buffer, may not be needed but its safe
StopDrawing()
If StartDrawing(ImageOutput(hImg24)) = 0:
FreeMemory(*buf32): FreeImage(hImg24)
ProcedureReturn 0
EndIf
stride24 = DrawingBufferPitch()
*buf24 = DrawingBuffer()
For y = 0 To height-1 ;Copy RGB(skipping A) from 32bit buffer to 24bit buffer
*p8_24 = *buf24 + (y * stride24)
*p8_32 = *buf32 + (y * stride32)
For x = 0 To width-1
*p8_24\a = *p8_32\a ;B
*p8_24+1: *p8_32+1
*p8_24\a = *p8_32\a ;G
*p8_24+1: *p8_32+1
*p8_24\a = *p8_32\a ;R
*p8_24+1: *p8_32+2 ;A (skip)
Next x
Next y
StopDrawing()
FreeMemory(*buf32) ;Free copy of 32bit image buffer
ProcedureReturn hImg24
EndProcedure
UsePNGImageDecoder()
Define hImg32 = LoadImage(#PB_Any, "C:\temp\beach32.png")
If hImg32
Define hImg24 = ConvertImage32to24(hImg32)
FreeImage(hImg32)
If hImg24
If OpenWindow(0, 0, 0, 800, 600, "Convert 32bit image to 24bit", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ImageGadget(0, 0, 0, 800, 600, ImageID(hImg24))
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
FreeImage(hImg24)
Else
MessageRequester("Error","Couldn't convert")
EndIf
Else
MessageRequester("Error","Couldn't load hImg32")
EndIf