(AHK)(AutoHotkey)(DIBを作る方法修正版)
先日 書いた DIB を 生成する方法ですが → http://d.hatena.ne.jp/morakana/20090509
ほとんど影響はないと言いながら 輝度が 1つでもズレると やっぱり気持ち悪い・・・
ということで RepaintDIB と組み合わせてみる事で なんとかしてみた 笑)
ほとんど影響はないと言いながら 輝度が 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") } ;---------------------------------------------------------------------------------------------------------------------------------------------------------