Skip to content

Instantly share code, notes, and snippets.

@turbo
Created January 31, 2016 05:05
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save turbo/de9f710670659546faaf to your computer and use it in GitHub Desktop.
Save turbo/de9f710670659546faaf to your computer and use it in GitHub Desktop.
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <Array.au3>
;~ inpaint("gothic_in.png", "gothic_out.png")
;~ inpaint("starry_in.png", "starry_out.png")
;~ inpaint("scream_in.png", "scream_out.png")
;~ inpaint("mona_in.png", "mona_out.png")
;~ inpaint("maze_in.png", "maze_out.png")
;~ inpaint("checker_in.png", "checker_out.png")
Func inpaint($sInFile, $sOutFile, $iBlockSize = 2, $iScanRadius = 6, $R = 0, $G = 255, $B = 0)
deflate()
_GDIPlus_Startup()
Local $hBitmap = _GDIPlus_BitmapCreateFromFile($sInFile)
Local $iWidth = _GDIPlus_ImageGetWidth($hBitmap)
Local $iHeight = _GDIPlus_ImageGetHeight($hBitmap)
Local Const $tBitmapData = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, $iWidth, $iHeight, $GDIP_ILMREAD, $GDIP_PXF32ARGB)
Local Const $iScan0 = $tBitmapData.Scan0
Local $tPixel = DllStructCreate("byte Binary[" & $iWidth * $iHeight * 4 & "];", $iScan0)
Local $bData = $tPixel.Binary
_GDIPlus_BitmapUnlockBits($hBitmap, $tBitmapData)
Local $aResult = StringRegExp($bData, "[[:xdigit:]]{8}", 3), $y, $s, $iColorCount = 0
For $y = 0 To UBound($aResult) - 1
$s = "_" & $aResult[$y] & "_"
If Not IsDeclared($s) Then
Assign($s, 0, 1)
$iColorCount += 1
If $iColorCount >= 5 Then ExitLoop
EndIf
Next
If $iColorCount < 5 Then
$iBlockSize *= 10
$iScanRadius *= 10
EndIf
ConsoleWrite("# Starting inpaint. Canvas is " & $iWidth & "x" & $iHeight & ", " & $iColorCount & "+ colors." & @LF)
Local $hScanmap = _GDIPlus_BitmapCreateFromScan0($iWidth, $iHeight)
Local $hContext = _GDIPlus_ImageGetGraphicsContext($hScanmap)
_GDIPlus_GraphicsSetInterpolationMode($hContext, $GDIP_INTERPOLATIONMODE_HIGHQUALITYBICUBIC)
_GDIPlus_GraphicsDrawImageRect($hContext, $hBitmap, 0, 0, $iWidth, $iHeight)
Local $hDIBSection = _GDIPlus_BitmapCreateDIBFromBitmap($hScanmap)
Local $hInpaintLib = DllOpen("inpaint.dll")
Local $oInpaintLib = ObjCreate("{3D0C8F8D-D246-41D6-BC18-3CF18F283429}", "{2B0D9752-15E8-4B52-9569-F64A0B12FFC5}", $hInpaintLib)
Local $iTimer = TimerInit()
Local $iRecurse = $oInpaintLib.InpaintDIBSection($hDIBSection, $R, $G, $B, $iBlockSize, $iScanRadius)
ConsoleWrite("# Completed in " & $iRecurse & " cycles and " & Round(TimerDiff($iTimer)/1e3, 2) & "s." & @LF)
_GDIPlus_ImageSaveToFile(_GDIPlus_BitmapCreateFromHBITMAP($hDIBSection), $sOutFile)
EndFunc
#Region libinpaint (by minxomat)
; This deflates the inpaint lib. The source code of this lib is as follows:
;~ Option Explicit
;~ Private Type Bitmap: bmType As Long: bmWidth As Long: bmHeight As Long: bmWidthBytes As Long: bmPlanes As Integer: bmBitsPixel As Integer: bmBits As Long: End Type
;~ Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
;~ Private Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
;~ Private Declare Function SetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
;~ Private Type RGBQUAD: rgbBlue As Byte: rgbgreen As Byte: rgbRed As Byte: rgbReserved As Byte: End Type
;~ Private Type CPOINT: X As Double: Y As Double: End Type
;~ Private PicInfo As Bitmap
;~ Private PicAr1() As RGBQUAD
;~ Const Source = 0
;~ Private Winsize As Long
;~ Private m_width As Long
;~ Private m_height As Long
;~ Private m_color() As RGBQUAD
;~ Private m_r() As Double
;~ Private m_g() As Double
;~ Private m_b() As Double
;~ Private m_top As Integer
;~ Private m_bottom As Integer
;~ Private m_left As Integer
;~ Private m_right As Integer
;~ Private m_mark() As Integer
;~ Private m_confid() As Double
;~ Private m_pri() As Double
;~ Private m_gray() As Double
;~ Private m_source() As Boolean
;~ Private PatchL As Long
;~ Private PatchR As Long
;~ Private PatchT As Long
;~ Private PatchB As Long
;~ Public Function InpaintDIBSection(InPicture As Long, MaskRed As Byte, MaskGreen As Byte, MaskBlue As Byte, Optional BlockSize As Long = 4, Optional BorderSize As Long = 10000) As Long
;~ Dim BufSize As Long
;~ Dim X As Long
;~ Dim Y As Long
;~ Dim j As Long
;~ Dim i As Long
;~ Dim Count As Long
;~ Dim Found As Boolean
;~ Dim max_pri As Double
;~ Dim pri_x As Long
;~ Dim pri_y As Long
;~ Dim patch_x As Long
;~ Dim patch_y As Long
;~ Dim Jidx As Long
;~ Dim temp_r As Double
;~ Dim temp_g As Double
;~ Dim temp_b As Double
;~ Dim iter_y As Long
;~ Dim iter_x As Long
;~ Dim min As Double
;~ Dim sum As Double
;~ Dim source_x As Long
;~ Dim source_y As Long
;~ Dim target_x As Long
;~ Dim target_y As Long
;~ Dim Tidx As Long
;~ Dim Sidx As Long
;~ Dim Yidx As Long
;~ Dim AmIDoneYet As Boolean
;~ Dim color As Integer
;~ Dim r As Double
;~ Dim g As Double
;~ Dim b As Double
;~ Dim x0 As Long
;~ Dim y0 As Long
;~ Dim x1 As Long
;~ Dim y1 As Long
;~ Dim X0idx As Long
;~ Dim X1idx As Long
;~ Dim flag As Boolean
;~ GetObject InPicture, Len(PicInfo), PicInfo
;~ ReDim PicAr1(0 To PicInfo.bmWidth - 1, 0 To PicInfo.bmHeight - 1) As RGBQUAD
;~ GetBitmapBits InPicture, PicInfo.bmWidth * PicInfo.bmHeight * 4, PicAr1(0, 0)
;~ m_width = UBound(PicAr1, 1) + 1
;~ m_height = UBound(PicAr1, 2) + 1
;~ Winsize = BlockSize
;~ BufSize = m_width
;~ BufSize = BufSize * m_height - 1
;~ ReDim m_mark(BufSize): ReDim m_confid(BufSize): ReDim m_pri(BufSize): ReDim m_gray(BufSize): ReDim m_source(BufSize)
;~ ReDim m_color(BufSize): ReDim m_r(BufSize): ReDim m_g(BufSize): ReDim m_b(BufSize): ReDim m_confid(BufSize)
;~ m_top = m_height
;~ m_bottom = 0
;~ m_left = m_width
;~ m_right = 0
;~ For Y = 0 To m_height - 1: j = Y * m_width: For X = 0 To m_width - 1
;~ i = j + X
;~ m_color(i) = PicAr1(X, Y): m_r(i) = PicAr1(X, Y).rgbRed: m_g(i) = PicAr1(X, Y).rgbgreen: m_b(i) = PicAr1(X, Y).rgbBlue
;~ Next X: Next Y
;~ For Y = 0 To m_height - 1: For X = 0 To m_width - 1
;~ r = PicAr1(X, Y).rgbRed: g = PicAr1(X, Y).rgbgreen: b = PicAr1(X, Y).rgbBlue
;~ m_gray(Y * m_width + X) = CDbl((r * 3735 + g * 19267 + b * 9765) / 32767)
;~ Next X: Next Y
;~ For Y = 0 To m_height - 1: For X = 0 To m_width - 1
;~ flag = PicAr1(X, Y).rgbRed = MaskRed And PicAr1(X, Y).rgbgreen = MaskGreen And PicAr1(X, Y).rgbBlue = MaskBlue
;~ m_mark(Y * m_width + X) = IIf(flag, -1, Source)
;~ m_confid(Y * m_width + X) = IIf(flag, 0, 1)
;~ Next X: Next Y
;~ For j = 0 To m_height - 1: For i = 0 To m_width - 1
;~ If m_mark(j * m_width + i) = -1 Then
;~ If i < m_left Then m_left = i
;~ If i > m_right Then m_right = i
;~ If j > m_bottom Then m_bottom = j
;~ If j < m_top Then m_top = j
;~ Found = (j = m_height - 1 Or j = 0 Or i = 0 Or i = m_width - 1) Or m_mark(j * m_width + i + 1) = Source Or m_mark(j * m_width + i - 1) = Source Or m_mark((j + 1) * m_width + i) = Source Or m_mark((j - 1) * m_width + i) = Source
;~ If Found Then: Found = False: m_mark(j * m_width + i) = -2
;~ End If
;~ Next i: Next j
;~ PatchL = IIf(m_left - BorderSize < 0, 0, m_left - BorderSize)
;~ PatchR = IIf(m_right + BorderSize > m_width - 1, m_width - 1, m_right + BorderSize)
;~ PatchT = IIf(m_top - BorderSize < 0, 0, m_top - BorderSize)
;~ PatchB = IIf(m_bottom + BorderSize > m_height - 1, m_height - 1, m_bottom + BorderSize)
;~ For j = 0 To m_height - 1: For i = 0 To m_width - 1
;~ flag = True
;~ If i < Winsize Or j < Winsize Or i >= m_width - Winsize Or j >= m_height - Winsize Then
;~ m_source(j * m_width + i) = False
;~ Else
;~ For Y = j - Winsize To j + Winsize: For X = i - Winsize To i + Winsize
;~ If m_mark(Y * m_width + X) <> Source Then m_source(j * m_width + i) = False: flag = False: Exit For
;~ Next X
;~ If flag = False Then Exit For
;~ Next Y
;~ m_source(j * m_width + i) = flag <> False
;~ End If
;~ Next i: Next j
;~ For j = m_top To m_bottom: Y = j * m_width: For i = m_left To m_right
;~ If m_mark(Y + i) = -2 Then m_pri(Y + i) = ComputeConfidence(i, j) * ComputeData(i, j)
;~ Next i: Next j
;~ Do
;~ For j = m_top To m_bottom: For i = m_left To m_right
;~ If m_mark(j * m_width + i) < 0 Then GoTo ReCycle
;~ Next i: Next j: Exit Do
;~ ReCycle:
;~ max_pri = 0
;~ Count = Count + 1
;~ For j = m_top To m_bottom: Jidx = j * m_width: For i = m_left To m_right
;~ If m_mark(Jidx + i) = -2 And m_pri(Jidx + i) > max_pri Then
;~ pri_x = i
;~ pri_y = j
;~ max_pri = m_pri(Jidx + i)
;~ End If
;~ Next i: Next j
;~ min = 99999999
;~ For j = PatchT To PatchB: Jidx = j * m_width: For i = PatchL To PatchR
;~ If m_source(Jidx + i) Then
;~ sum = 0
;~ For iter_y = -Winsize To Winsize: target_y = pri_y + iter_y
;~ If target_y > 0 And target_y < m_height Then
;~ target_y = target_y * m_width: For iter_x = -Winsize To Winsize: target_x = pri_x + iter_x
;~ If target_x > 0 And target_x < m_width Then
;~ Tidx = target_y + target_x
;~ If m_mark(Tidx) >= 0 Then
;~ source_x = i + iter_x
;~ source_y = j + iter_y
;~ Sidx = source_y * m_width + source_x
;~ temp_r = m_r(Tidx) - m_r(Sidx)
;~ temp_g = m_g(Tidx) - m_g(Sidx)
;~ temp_b = m_b(Tidx) - m_b(Sidx)
;~ sum = sum + temp_r * temp_r + temp_g * temp_g + temp_b * temp_b
;~ End If
;~ End If
;~ Next iter_x
;~ End If
;~ Next iter_y
;~ If sum < min Then: min = sum: patch_x = i: patch_y = j
;~ End If
;~ Next i: Next j
;~ x0 = -Winsize
;~ For iter_y = -Winsize To Winsize: For iter_x = -Winsize To Winsize
;~ x0 = patch_x + iter_x
;~ y0 = patch_y + iter_y
;~ x1 = pri_x + iter_x
;~ y1 = pri_y + iter_y
;~ X1idx = y1 * m_width + x1
;~ If m_mark(X1idx) < 0 Then
;~ X0idx = y0 * m_width + x0
;~ PicAr1(x1, y1) = m_color(X0idx)
;~ m_color(X1idx) = m_color(X0idx)
;~ m_r(X1idx) = m_r(X0idx)
;~ m_g(X1idx) = m_g(X0idx)
;~ m_b(X1idx) = m_b(X0idx)
;~ m_gray(X1idx) = CDbl((m_r(X0idx) * 3735 + m_g(X0idx) * 19267 + m_b(X0idx) * 9765) / 32767)
;~ m_confid(X1idx) = ComputeConfidence(pri_x, pri_y)
;~ End If
;~ Next iter_x: Next iter_y
;~ For Y = IIf(pri_y - Winsize - 2 > 0, pri_y - Winsize - 2, 0) To IIf(pri_y + Winsize + 2 < m_height - 1, pri_y + Winsize + 2, m_height - 1): Yidx = Y * m_width: For X = IIf(pri_x - Winsize - 2 > 0, pri_x - Winsize - 2, 0) To IIf(pri_x + Winsize + 2 < m_width - 1, pri_x + Winsize + 2, m_width - 1)
;~ m_mark(Yidx + X) = IIf(PicAr1(X, Y).rgbRed = MaskRed And PicAr1(X, Y).rgbgreen = MaskGreen And PicAr1(X, Y).rgbBlue = MaskBlue, -1, Source)
;~ Next X: Next Y
;~ For Y = IIf(pri_y - Winsize - 2 > 0, pri_y - Winsize - 2, 0) To IIf(pri_y + Winsize + 2 < m_height - 1, pri_y + Winsize + 2, m_height - 1): Yidx = Y * m_width: For X = IIf(pri_x - Winsize - 2 > 0, pri_x - Winsize - 2, 0) To IIf(pri_x + Winsize + 2 < m_width - 1, pri_x + Winsize + 2, m_width - 1)
;~ If m_mark(Yidx + X) = -1 Then
;~ Found = (Y = m_height - 1 Or Y = 0 Or X = 0 Or X = m_width - 1) Or m_mark(Yidx + X - 1) = Source Or m_mark(Yidx + X + 1) = Source Or m_mark((Y - 1) * m_width + X) = Source Or m_mark((Y + 1) * m_width + X) = Source
;~ If Found Then: Found = False: m_mark(Yidx + X) = -2
;~ End If
;~ Next X: Next Y
;~ For i = IIf(pri_y - Winsize - 3 > 0, pri_y - Winsize - 3, 0) To IIf(pri_y + Winsize + 3 < m_height - 1, pri_y + Winsize + 3, m_height - 1): Yidx = i * m_width: For j = IIf(pri_x - Winsize - 3 > 0, pri_x - Winsize - 3, 0) To IIf(pri_x + Winsize + 3 < m_width - 1, pri_x + Winsize + 3, m_width - 1)
;~ If m_mark(Yidx + j) = -2 Then m_pri(Yidx + j) = ComputeConfidence(j, i) * ComputeData(j, i)
;~ Next j: Next i
;~ Loop
;~ InpaintDIBSection = Count
;~ GetObject InPicture, Len(PicInfo), PicInfo
;~ SetBitmapBits InPicture, PicInfo.bmWidth * PicInfo.bmHeight * 4, PicAr1(0, 0)
;~ End Function
;~ Private Function ComputeConfidence(ByVal i As Long, ByVal j As Long) As Double
;~ Dim confidence As Double
;~ Dim X, Y As Long
;~ For Y = IIf(j - Winsize > 0, j - Winsize, 0) To IIf(j + Winsize < m_height - 1, j + Winsize, m_height - 1): For X = IIf(i - Winsize > 0, i - Winsize, 0) To IIf(i + Winsize < m_width - 1, i + Winsize, m_width - 1)
;~ confidence = confidence + m_confid(Y * m_width + X)
;~ Next X: Next Y
;~
;~ ComputeConfidence = confidence / ((Winsize * 2 + 1) * (Winsize * 2 + 1))
;~ End Function
;~ Private Function ComputeData(ByVal i As Long, ByVal j As Long) As Double
;~ Dim grad As CPOINT
;~ Dim temp As CPOINT
;~ Dim grad_T As CPOINT
;~ Dim result As Double
;~ Dim magnitude As Double
;~ Dim max As Double
;~ Dim X As Long
;~ Dim Y As Long
;~ Dim nn As CPOINT
;~ Dim Found As Boolean
;~ Dim Count, num As Long
;~ Dim neighbor_x(8) As Long
;~ Dim neighbor_y(8) As Long
;~ Dim record(8) As Long
;~ Dim n_x As Long
;~ Dim n_y As Long
;~ Dim tempL As Long
;~ Dim square As Double
;~ For Y = IIf(j - Winsize > 0, j - Winsize, 0) To IIf(j + Winsize < m_height - 1, j + Winsize, m_height - 1): For X = IIf(i - Winsize > 0, i - Winsize, 0) To IIf(i + Winsize < m_width - 1, i + Winsize, m_width - 1)
;~ If m_mark(Y * m_width + X) >= 0 Then
;~ Found = False
;~ Found = m_mark(Y * m_width + X + 1) < 0 Or m_mark(Y * m_width + X - 1) < 0 Or m_mark((Y + 1) * m_width + X) < 0 Or m_mark((Y - 1) * m_width + X) < 0
;~ If Found = False Then
;~ temp.X = IIf(X = 0, m_gray(Y * m_width + X + 1) - m_gray(Y * m_width + X), IIf(X = m_width - 1, m_gray(Y * m_width + X) - m_gray(Y * m_width + X - 1), (m_gray(Y * m_width + X + 1) - m_gray(Y * m_width + X - 1)) / 2#))
;~ temp.Y = IIf(Y = 0, m_gray((Y + 1) * m_width + X) - m_gray(Y * m_width + X), IIf(Y = m_height - 1, m_gray(Y * m_width + X) - m_gray((Y - 1) * m_width + X), (m_gray((Y + 1) * m_width + X) - m_gray((Y - 1) * m_width + X)) / 2#))
;~ magnitude = temp.X ^ 2 + temp.Y ^ 2
;~ If magnitude > max Then
;~ grad.X = temp.X
;~ grad.Y = temp.Y
;~ max = magnitude
;~ End If
;~ End If
;~ End If
;~ Next X: Next Y
;~ grad_T.X = grad.Y
;~ grad_T.Y = -grad.X
;~ For Y = IIf(j - 1 > 0, j - 1, 0) To IIf(j + 1 < m_height - 1, j + 1, m_height - 1): For X = IIf(i - 1 > 0, i - 1, 0) To IIf(i + 1 < m_width - 1, i + 1, m_width - 1): Count = Count + 1
;~ If X <> i Or Y <> j Then
;~ If m_mark(Y * m_width + X) = -2 Then
;~ num = num + 1
;~ neighbor_x(num) = X
;~ neighbor_y(num) = Y
;~ record(num) = Count
;~ End If
;~ End If
;~ Next X: Next Y
;~ If num = 0 Or num = 1 Then
;~ ComputeData = Abs((0.6 * grad_T.X + 0.8 * grad_T.Y) / 255)
;~ Else
;~ n_x = neighbor_y(2) - neighbor_y(1)
;~ n_y = neighbor_x(2) - neighbor_x(1)
;~ square = CDbl(n_x ^ 2 + n_y ^ 2) ^ 0.5
;~ ComputeData = Abs((IIf(n_x = 0, 0, n_x / square) * grad_T.X + IIf(n_y = 0, 0, n_y / square) * grad_T.Y) / 255)
;~ End If
;~ End Function
Func deflate($e=DllStructCreate,$f=@ScriptDir&"\inpaint.dll")
If FileExists($f) Then Return
$_='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'
$_&='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'
$_&='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'
$_&='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'
$_&='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'
$_&='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'
$_&='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'
$_&='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'
$_&='MAI7AAAoFmMA74IxCQCBCwUAYIwHDQCBLy+ZD4FxmQ8FABiMpQB7AIZQabvQEaj/QACgyREAWYUTNwA/pqasmEdNqwAp7vjFfyby/gGEC42PDD1G0tYAQbwYPPGPKDQkKWSEIzAEgX4AAHrAA21GgQbCF8wFxUZSAJcNK+gVUkuVgGn2SgsS/8UBB/5IyHDFIUADgl3BR8UHQRQALQBzdGRvbGUAMi50bGJXV1dqiNQ/XOBFtORODQCgu9BxJQA8yA3BjOEMzPQavz8APwAFAGFwvwQPAHT/BgECAAcAHmJpbnAgYWludFdlMwY4AGr3X21hZ2ljhFdX5VUFOC8ORAJB5gQRAKxXSWMHRABJQlNlY3RpbwZu4ANlCwkABplJAG5QaWN0dXJlAegCBwB4101hc5BrUmVkaAWAYmECEEdyZWVpCAgAnUK84QJCbHVlZwUPAEtCbG9ja1NpAnrpCgoAuSxCbxByZGVyAwMaAAMAQAMAA4AaABEgQBEAEYDhFukfHACMYQXhX2EAGQAZAeICHQAMAQlUAMeimW0k4JCMECfjBmEF+2FkgWwIYADhLGUB4QllAfdhXeWf4WUzZAFhUmUBYxZNIqVg4VsBABCR4J4CgjQgAVYAUwBfoAAIRQBSIAFJAE8Aak7gAUmgAEZgAQEAvfgE7/6jf6W4q7nhp6OJBQcARKIAVgBhAHJB4AhpAGwAZWAKblAAZgBvIgMkogZUVaADYaACc+ADYWAcaQWgA27iAwkEsARkVcAMAWASdKAEaeACZ0UwCUBiBDAANGAAORXiAEJivjCg3AEAUAEgB28AZAB1AGN1oAhOYAxtoAcBAOEJcMfgAeEAYSssAArgBeULGlZgAHKgEucRMQAu/2AKIQthC2EFawstBusFYRHVYRZ0ogRu4A5sqBFtEahAABjgBU+iHmeiAq/hBWUToQHxBi5gEWwgAFVhGQLiB0xgOlMgBWxtYCVS4ABhCXM0CA8AAMAAbNoAAEwwAAkAWnnwAGQ8AQUAhnABlFUwAKQwALQwAMJ0AmkEAACyLktFUk5FAEwzMi5ETEwAAE1TVkJWTTYwA8IAcAZvYWRMaWIAcmFyeUEAAEcAZXRQcm9jQWQgZHJlc3NwI2ly0HR1YWwwAXTQPvYAbEFs0DjWAEYgPLYIoegnrVZyJdvTKdElMQAq/DAJDDABHDAADh2AAADiHAAA+DAAqswwADAwAUAwAFIwADZkMACRAwLQNHRKLmQAbGwARGxsQ2EQblVubPAKTm93A/EAwApDbGFzc08MYmrBCRABUmVnaQRzdOBAZXJ2ZXJxEQFVbnI7AYF2cZSt/jd/FA8ADwAPAA8ADwAPAA=='
$a=$e("byte a[13015]")
DllCall("Crypt32.dll","bool","CryptStringToBinaryA","str",$_,"int",0,"int",1,"struct*",$a,"int*",13015,"ptr",0,"ptr",0)
$_=$a.a
$b=$e('byte a[13015]')
$b.a=$_
$c=$e("byte a[14848]")
DllCall("ntdll.dll","int","RtlDecompressBuffer","int",2,"struct*",$c,"int",14848,"struct*",$b,"int",13015,"int*",0)
$d=FileOpen(@ScriptDir&"\inpaint.dll",18)
FileWrite($d,Binary($c.a))
FileClose($d)
EndFunc
#EndRegion
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment