Code: Select all
#include %A_ScriptDir%
#Include Gdip_All.ahk
InputFile := "ColorReplaced.png"
OutputFile := "ColorReplaced2.png"
pToken := Gdip_Startup()
pBitmap := Gdip_CreateBitmapFromFile(InputFile)
E := Gdip_FilterColor(pBitmap, 0xFFC0C0C0, 0xFFFFFFFF, 100)
Gdip_SaveBitmapToFile(pBitmap, OutputFile)
Gdip_DisposeImage(pBitmap)
Gdip_Shutdown(pToken)
return
Gdip_FilterColor(pBitmap, Color, ReplaceColor, Variation=0)
{
static _FilterColor
if !_FilterColor
{
MCode_FilterColor := "83EC288B44243C8BC8C1E918894C243C8BC8C1E91081E1FF000000894C240C0FB6CC25FF000000894C2410894424148B442440"
. "8BC8C1E918894C24188BC80FB6D425FF000000C1E910894424248B44243481E1FF00000085C0894C241C895424200F8E020100008B54242C5355568B7"
. "4245033DB578B7C2440895C241489442418B90100000085FF0F8EC10000008D4A028D040B8BDA2BD983C303895C24508BDA2BD983C301895C24442BD1"
. "897C24108B5C24448B4C24500FB62C030FB60C018B5C244C0FB63803DE3BCB7F688B5C244C2BDE3BCB7C5E8B4C241C8D1C313BFB7F532BCE3BF97C4D8"
. "B4C24208D3C313BEF7F422BCE3BE97C3C8B7C24240FB60C028D1C373BCB7F2D2BFE3BCF7C270FB64C24288B7C2450880C070FB64C242C8B7C24448808"
. "0FB64C2430880C070FB64C2434880C02B90100000083C004294C24100F8569FFFFFF8B7C24408B54243C8B5C2414035C2448294C2418895C24140F852"
. "1FFFFFF5F5E5D5B33C083C428C3"
VarSetCapacity(_FilterColor, StrLen(MCode_FilterColor)//2)
Loop % StrLen(MCode_FilterColor)//2 ;%
NumPut("0x" SubStr(MCode_FilterColor, (2*A_Index)-1, 2), _FilterColor, A_Index-1, "char")
}
Variation := (Variation > 255) ? 255 : (Variation < 0) ? 0 : Variation
Gdip_GetImageDimensions(pBitmap, w, h)
E1 := Gdip_LockBits(pBitmap, 0, 0, w, h, Stride1, Scan01, BitmapData1)
E := DllCall(&_FilterColor, "uint", Scan01, "int", w, "int", h, "int", Stride1, "uint", Color, "uint", ReplaceColor, "int", Variation)
Gdip_UnlockBits(pBitmap, BitmapData1)
return (E = "") ? -1 : E
}
And below is the MCode that MCode4GCC generated.
Code: Select all
"2,x86:QVdBVkFVQVRVV1ZTSIPsOIuEJKgAAAAx7UmJz0SJhCSQAAAARIuEJKAAAABEiYwk"
. "mAAAAESNNJUAAAAAicGJRCQsi4QksAAAAInPQYnKRYnBwe8YRInGQYHhAAD/AIl8"
. "JCAPtv2LjCSQAAAAQYHiAAD/AEyJw8HuGEHB6hBBwekQiXwkKIXJD7bfRQ+2wESJ"
. "VCQkvwMAAAAPjuUAAACNDAMpw0WNJAGJXCQUQY0cAEEpwUEpwESNHAaJTCQQKcZE"
. "iUwkDIlcJBhEiUQkHEyJ+YXSRo0MN4n4D46OAAAAZpBBicCNWP1JAchFD7YQRTna"
. "d25BOfJyaUSNaP9JAc1FD7ZVAEU54ndYRDtUJAxyUUSNeP5JAc9FD7YXRDtUJBB3"
. "P0Q7VCQUcjhBidpJAcpBD7YaO1wkGHcoO1wkHHIiD7ZcJCBBiBgPtlwkJEGIXQAP"
. "tlwkKEGIHw+2XCQsQYgakIPABEQ5yA+FdP///4PFAQO8JJgAAAA5rCSQAAAAD4VN"
. "////McBIg8Q4W15fXUFcQV1BXkFfw5CQkJCQkJCQkJA="
The source code is:
Code: Select all
int Gdip_FilterColor(unsigned char * Bitmap, int w, int h, int Stride, unsigned int Color, unsigned int ReplaceColor, int v)
{
unsigned int p, A1, R1, G1, B1, A2, R2, G2, B2, tA, tR, tG, tB;
A1 = (Color & 0xff000000) >> 24;
R1 = (Color & 0x00ff0000) >> 16;
G1 = (Color & 0x0000ff00) >> 8;
B1 = Color & 0x000000ff;
A2 = (ReplaceColor & 0xff000000) >> 24;
R2 = (ReplaceColor & 0x00ff0000) >> 16;
G2 = (ReplaceColor & 0x0000ff00) >> 8;
B2 = ReplaceColor & 0x000000ff;
for (int y = 0; y < h; ++y)
{
for (int x = 0; x < w; ++x)
{
p = (4*x)+(y*Stride);
tA = Bitmap[3+p];
tR = Bitmap[2+p];
tG = Bitmap[1+p];
tB = Bitmap[p];
if ((tA <= A1+v && tA >= A1-v) && (tR <= R1+v && tR >= R1-v) && (tG <= G1+v && tG >= G1-v) && (tB <= B1+v && tB >= B1-v))
{
Bitmap[3+p] = A2;
Bitmap[2+p] = R2;
Bitmap[1+p] = G2;
Bitmap[p] = B2;
}
}
}
return 0;
}