(AHK)(AutoHotkey)(DIBを作る方法修正版)

 先日 書いた DIB を 生成する方法ですが → http://d.hatena.ne.jp/morakana/20090509
ほとんど影響はないと言いながら 輝度が 1つでもズレると やっぱり気持ち悪い・・・
ということで RepaintDIB と組み合わせてみる事で なんとかしてみた 笑)
;---------------------------------------------------------------------------------------------------------------------------------------------------------
; imgctl_NewDIB(NewWidth, NewHeight, R, G, B)     新規にDIBを作成して hDIBを返します
;---------------------------------------------------------------------------------------------------------------------------------------------------------
; 横:NewWidth 縦:NewHeight のサイズで 新規に DIBを生成します
; R G B に 輝度を設定する事で 塗りつぶす色を設定する事が出来ます
;
; BMPファイルのイメージを生成して MtoDIBに渡すことで DIBを生成しています
; 生成に成功すると DIBのハンドルが、 失敗すると 0が返ってきます
Imgctl_NewDIB(NewWidth, NewHeight, R = 255, G = 255, B = 255)
{
	BinDataImage := "0x42,0x4D,0x3A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00"
	VarSetCapacity(buf, 58, 0x00)
	Loop Parse, BinDataImage, CSV
		NumPut((A_LoopField + 0), buf, (a_index - 1), "UChar")
	If !(hNewDIB := Imgctl_MtoDIB(&buf, 58))
		Return 0
	If ( Imgctl_ResizeDIB(hNewDIB, NewWidth, NewHeight) and Imgctl_RepaintDIB(hNewDIB, "0,0,0-" . R . "," . G . "," . B) )
		Return hNewDIB
	Imgctl_DeleteDIB(buf2)
	Return 0
}
;---------------------------------------------------------------------------------------------------------------------------------------------------------
; BOOL RepaintDIB(HDIB hDIB, const REPAINTINFO *repis, DWORD dwRepaintNum)
;
; 注意 : REPAINTINFO を 文字列で設定するように変更しました
;
; 白 を 黒 に 置き換える場合は "255,255,255-0,0,0" と書きます
; 16進数表記でも表記可能です "0xff,0xff,0xff-0x0,0x0,0x0"
; 
; 色の置き換えを複数個指定したい場合は | で区切ります
; 白 を 黒 に 黒 を 緑 に 赤 を 青 に 置き換える時は
; "255,255,255-0,0,0|0,0,0-0,255,0|255,0,0-0,0,255" と書きます
;
Imgctl_RepaintDIB(hDIB, RepaintInformation)
{
	Num := 0
	Arr := 0
	Loop, Parse, RepaintInformation, |
	{
		Num += 1
		Loop, Parse, A_LoopField, -
		{
			Loop, Parse, A_LoopField, CSV
			{
				Arr += 1
				[%Num%][%Arr%] := A_LoopField
			}
		}
		Arr := 0
	}
	VarSetCapacity(RI, (Num * 8), 0x00)
	Loop, %Num%
	{
		Offset := (A_Index - 1) * 8
		NumPut([%A_Index%][1] + 0, RI, (Offset + 0), "UChar")
		NumPut([%A_Index%][2] + 0, RI, (Offset + 1), "UChar")
		NumPut([%A_Index%][3] + 0, RI, (Offset + 2), "UChar")
		NumPut([%A_Index%][4] + 0, RI, (Offset + 4), "UChar")
		NumPut([%A_Index%][5] + 0, RI, (Offset + 5), "UChar")
		NumPut([%A_Index%][6] + 0, RI, (Offset + 6), "UChar")
	}
	Return DllCall("imgctl.dll\RepaintDIB", "UInt", hDIB, "UInt", &RI, "UInt", Num, "Int")
}
;---------------------------------------------------------------------------------------------------------------------------------------------------------
; BOOL ResizeDIB(HDIB hDIB, long lWidth, long lHeight)
Imgctl_ResizeDIB(hDIB, NewWidth, NewHeight)
{
	Return DllCall("imgctl.dll\ResizeDIB", "UInt", hDIB, "Int", NewWidth, "Int", NewHeight, "Int")
}
;---------------------------------------------------------------------------------------------------------------------------------------------------------