Created
January 31, 2016 05:05
-
-
Save turbo/de9f710670659546faaf to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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