Parametes:
PixelData : Series of RRGGBB values delimited with Pipe "|".
W,H : The dimension of the image in PixelData.
ResizeW, ResizeH : The resized dimensions if image needs to be upscaled.
Gradient : Default value false. If true, image will be upscaled as a gradient otherwise as pixelated blocks.
DIB : By default, the function returns a DIB. Pass false if you need DDB (recommended).
The function - along with demo code
Code: Select all
CreateDIB(PixelData, W, H, ResizeW:=0, ResizeH:=0, Gradient:=0, DIB:=1) {
Static OSV ; CreateDIB v0.90, by SKAN on CT41/D345 @ tiny.cc/createdib
Local
If ! VarSetCapacity(OSV)
{
FileGetVersion, OSV, user32.dll
OSV := Format("{1:}.{2:}", StrSplit(OSV,".")*)
}
LR_1 := 0x2000|0x8|0x4 ; LR_CREATEDIBSECTION | LR_COPYDELETEORG | LR_COPYRETURNORG
LR_2 := 0x8|0x4 ; LR_COPYDELETEORG | LR_COPYRETURNORG
Flags := ( OSV>6.3 ? (Gradient ? LR_2 : LR_1) : (Gradient ? LR_1 : LR_2) )
WB := Ceil((W*3)/2)*2, VarSetCapacity(BMBITS, WB*H, 0), P := &BMBITS, PE := P+(WB*H)
Loop, Parse, PixelData, |
P := P<PE ? Numput("0x" . A_LoopField, P+0, "UInt")-(W & 1 && Mod(A_Index*3, W*3)=0 ? 0 : 1) : P
hBM := DllCall("CreateBitmap", "Int",W, "Int",H, "UInt",1, "UInt",24, "Ptr",0, "Ptr")
hBM := DllCall("CopyImage", "Ptr",hBM, "UInt",0, "Int",0, "Int",0, "UInt",LR_1, "Ptr")
DllCall("SetBitmapBits", "Ptr",hBM, "UInt",WB*H, "Ptr",&BMBITS)
hBM := DllCall("CopyImage", "Ptr",hBM, "Int",0, "Int",0, "Int",0, "Int",Flags, "Ptr")
hBM := DllCall("CopyImage", "Ptr",hBM, "Int",0, "Int",ResizeW, "Int",ResizeH, "UInt",Flags, "Ptr")
hBM := DllCall("CopyImage", "Ptr",hBM, "Int",0, "Int",0, "Int",0, "UInt",LR_2, "Ptr")
Return DllCall("CopyImage", "Ptr",hBM, "Int",0, "Int",0, "Int",0, "UInt",DIB ? LR_1 : LR_2, "Ptr")
}
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Usage Example follows
#NoEnv
#SingleInstance, Force
#Warn
SetBatchLines -1
PixelData_1 := "
( LTrim Join|
FFFFFF|000000|FFFFFF|000000|FFFFFF|000000|FFFFFF|000000
000000|FFFFFF|000000|FFFFFF|000000|FFFFFF|000000|FFFFFF
FFFFFF|000000|FFFFFF|000000|FFFFFF|000000|FFFFFF|000000
000000|FFFFFF|000000|FFFFFF|000000|FFFFFF|000000|FFFFFF
FFFFFF|000000|FFFFFF|000000|FFFFFF|000000|FFFFFF|000000
000000|FFFFFF|000000|FFFFFF|000000|FFFFFF|000000|FFFFFF
FFFFFF|000000|FFFFFF|000000|FFFFFF|000000|FFFFFF|000000
000000|FFFFFF|000000|FFFFFF|000000|FFFFFF|000000|FFFFFF
)"
PixelData_2 := "
( LTrim Join|
CC0000|CC0000|CC0000|CC0000|CC0000|CC0000|CC0000|CC0000|CC0000
AA0000|AA0000|AA0000|AA0000|AA0000|AA0000|AA0000|AA0000|AA0000
990000|990000|990000|990000|990000|990000|990000|990000|990000
880000|880000|880000|880000|880000|880000|880000|880000|880000
770000|770000|770000|770000|770000|770000|770000|770000|770000
660000|660000|660000|660000|660000|660000|660000|660000|660000
550000|550000|550000|550000|550000|550000|550000|550000|550000
440000|440000|440000|440000|440000|440000|440000|440000|440000
330000|330000|330000|330000|330000|330000|330000|330000|330000
)"
PixelData_3 := "FF0000|00FF00|0000FF|0000FF|FF0000|00FF00"
Gui, 1:Margin, 0, 0
Gui, 1:Add, Picture,, % "HBITMAP:" . CreateDIB(PixelData_1, 8,8, 200,200, 0,0)
Gui, 1:Show, x100 y100, Eg.1
Gui, 2:Margin, 0, 0
Gui, 2:Add, Picture,, % "HBITMAP:" . CreateDIB(PixelData_2, 9,9, 200,200, 1,0)
Gui, 2:Show, x320 y100, Eg.2
Gui, 3:Margin, 0, 0
Gui, 3:Add, Picture,, % "HBITMAP:" . CreateDIB(PixelData_3, 3,2, 200,200, 1,0)
Gui, 3:Show, x550 y100, Eg.3
Return
GuiClose:
2GuiClose:
3GuiClose:
ExitApp
- Screen shot of demo :