http://www.purebasic.fr/english/viewtopic.php?t=26238
Code: Select all
; Fast method of copying pixel data from an image to an array
Procedure CopyImageToArray(ImageID, Array(1))
Width=ImageWidth(ImageID)
Height=ImageHeight(ImageID)
SourceBlock=AllocateMemory(Width*Height*SizeOf(LONG))
bmi.BITMAPINFO
bmi\bmiHeader\biSize=SizeOf(BITMAPINFOHEADER)
bmi\bmiHeader\biWidth=Width
bmi\bmiHeader\biHeight=Height
bmi\bmiHeader\biPlanes=1
bmi\bmiHeader\biBitCount=32
bmi\bmiHeader\biCompression=#BI_RGB
hdc=StartDrawing(ImageOutput(ImageID))
; Copy source image to API bitmap structure
GetDIBits_(hdc,ImageID(ImageID),0,Height,SourceBlock,bmi,#DIB_RGB_COLORS)
*SourcePixel.LONG=SourceBlock
For i=0 To (Width*Height)-1
R=*SourcePixel\l&$FF
G=*SourcePixel\l>>8&$FF
B=*SourcePixel\l>>16
; *SourcePixel\l=R|G<<8|B<<16
Array((Width*Height)-(((i/Width)*Width)+Width)+(i%Width))=RGB(B,G,R)
*SourcePixel+SizeOf(LONG)
Next
; Copy API bitmap structure back to image ID
SetDIBits_(hdc,ImageID(ImageID),0,Height,SourceBlock,bmi,#DIB_RGB_COLORS)
FreeMemory(SourceBlock)
StopDrawing()
EndProcedure
Procedure CopyArrayToImage(Array(1),ImageID)
Width=ImageWidth(ImageID)
Height=ImageHeight(ImageID)
SourceBlock=AllocateMemory(Width*Height*SizeOf(LONG))
bmi.BITMAPINFO
bmi\bmiHeader\biSize=SizeOf(BITMAPINFOHEADER)
bmi\bmiHeader\biWidth=Width
bmi\bmiHeader\biHeight=Height
bmi\bmiHeader\biPlanes=1
bmi\bmiHeader\biBitCount=32
bmi\bmiHeader\biCompression=#BI_RGB
hdc=StartDrawing(ImageOutput(ImageID))
; Copy source image to API bitmap structure
GetDIBits_(hdc,ImageID(ImageID),0,Height,SourceBlock,bmi,#DIB_RGB_COLORS)
*SourcePixel.LONG=SourceBlock
For i=0 To (Width*Height)-1
Color=Array((Width*Height)-(((i/Width)*Width)+Width)+(i%Width))
*SourcePixel\l=Blue(Color)|Green(Color)<<8|Red(Color)<<16
*SourcePixel+SizeOf(LONG)
Next
; Copy API bitmap structure back to image ID
SetDIBits_(hdc,ImageID(ImageID),0,Height,SourceBlock,bmi,#DIB_RGB_COLORS)
FreeMemory(SourceBlock)
StopDrawing()
EndProcedure