1 (изменено: Drugoy, 2015-03-24 15:08:57)

Тема: AHK: показать картинку из base64 (без временного файла, GDI+)

Есть картинка, закодированная в base64 (предположим, что base64-код находится уже сразу внутри переменной).
Требуется отобразить её в GUI окна скрипта, без сохранения её в файл.

Я видел функцию serzh82saratov'а

DataToFile(InData, TrgFile)
{
    DllCall("Crypt32.dll\CryptStringToBinary" (A_IsUnicode ? "W" : "A"), UInt,&InData, UInt,StrLen(InData), UInt,1, UInt,0, UIntP,Bytes, Int,0, Int,0, "CDECL Int") 
    VarSetCapacity(OutData, Req := Bytes * (A_IsUnicode ? 2 : 1))
    DllCall("Crypt32.dll\CryptStringToBinary" (A_IsUnicode ? "W" : "A"), UInt,&InData, UInt,StrLen(InData), UInt,1, Str,OutData, UIntP,Req, Int,0, Int,0, "CDECL Int")
    File := FileOpen(TrgFile, "w"), File.length := 0, File.RawWrite(OutData, Bytes)
    File.Close(), VarSetcapacity(OutData, 0)
    Return TrgFile
}

которая преобразовывает base64 код из переменой InData в файл TrgFile.

Отобразить в GUI картинку из файла - задача тривиальная:

Gui, Add, Picture,, % TrgFile

А вот не из файла картинку можно отобразить (насколько я знаю) только используя GDI+.
Для этого используется функция Gdip_DrawImage(), которой нужен pBitmap картинки.
А во всех примерах в документации по GDI+ для получения pBitmap из картинки используется Gdip_CreateBitmapFromFile().

Можно было бы использовать Gdip_CreateBitmapFromClipboard(), но не хочется использовать clipboard, так что из потенциальных решений остаётся только Gdip_CreateBitmapFromHBITMAP() и возможно Gdip_CreateBitmapFromHICON(), но описания для этих функций нет.
Интернеты пишут, что hIcon - это handle к MS Win GDI icon, я не знаю что это, но похоже это не то, что надо.
Соответственно, остаётся использовать Gdip_CreateBitmapFromHBITMAP(), но у меня возникла проблема состыковки Crypt32.dll\CryptStringToBinary и Gdip_CreateBitmapFromHBITMAP().
Помогите, пожалуйста.

Вот мой нерабочий код, который выдаёт msgbox с 43-ей строки. В 37-ой строке пробовал в функцию отправлять аргумент и без "&", но результат тот же самый.

+ открыть спойлер
#SingleInstance, Force
#NoEnv
SetBatchLines, -1
ImgInB64 := "AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAB6Vzh+elc453pXOP96Vzj/elc4/3pXOP96Vzj/elc4/3pXOP96Vzj/elc4/3pXOJaFUSEAhVEhAIVRIQCFUSEAfVo754RSI/+FUSH/hVEh/4VRIf+FUSH/hVEh/4VRIf+FUSH/hVEh/4VRIf+AVzL/fVo7e4VRIQCFUSEAhVEhAIBeQP+JVSb/j10w/7qbf/+QXzP/iVUm/4lVJv+PXTD/upt//5BfM/+JVSb/iFYp/4BeP/+AXkAPiVUmAIlVJgCEY0X/jlst/7udgf//////xaqS/45bLf+OWy3/u52B///////FqpL/jlst/45bLf+JXzr/hGNFio5bLQCOWy0AiWlL/5RiNf+ZaT//vp+D/5prQf+UYjX/lGI1/5lpP/++n4P/mmtB/5RiNf+UYjX/k2I2/4poSf+JaUs8lGI1AI5vUv+aaj3/yrCY///////////////////////////////////////t5d3/mmo9/5pqPf+WbET/jm9SpZpqPQCUdVn/oXJH//79/f/Boob/oXJH/6FyR/+hckf/oXJH/6FyR/+hckf/oXJH/6FyR/+hckf/oXJH/5d0Vf+UdVlmmnxg/6d6T//DpIf//v39/+3k3P/h0sP/1sCs/8qvlf+5lXL/rYNb/6d6T/+nek//p3pP/6d6T/+lelL/mnxgz5+CaP+ugln/s4lj///////LrpT/zrSb/9/Nvf/m2cz/7+be///////17+r/x6iM/66CWf+ugln/q4Jc/5+CaM+liW//totj/7qSbP//////upJs/7aLY/+2i2P/totj/7aLY/+2i2P/zK6T//////+2i2P/totj/6mJbP+liW9mq492/76Vbv/Cm3f//////8Kbd/++lW7/vpVu/76Vbv++lW7/vpVu/8ajgf//////vpVu/7eTcf+rj3alvpVuALCVff/Fnnn/yKSB////////////////////////////////////////////4s+9/8Seef+yln3/sJV9PMWeeQC1m4P/zKaC/9OzlP/+/v7/zKaC/8ymgv/MpoL/zKaC/8ymgv/MpoL/zKaC/8ymgv/AoIP/tZuDisymggDMpoIAuaCI///////+/v7/5M25/9Ovjv/Tr47/06+O/9Ovjv/Tr47/06+O/9Ovjv/QrY3/uqCI/7mgiA/Tr44A06+OALykjeTXuZ3/2ruf/9q7n//au5//2ruf/9q7n//au5//2ruf/9q7n//au5//xqyT/7ykjXjau58A2rufANq7nwC/p5B7v6eQ5L+nkP+/p5D/v6eQ/7+nkP+/p5D/v6eQ/7+nkP+/p5D/v6eQ/7+nkJb///8A2rufANq7nwDau58AAA8AAAAHAAAAAwAAAAMAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAMAAAADAAAABwAAAA8AAA=="

; Uncomment if Gdip.ahk is not in your standard library
; #Include, Gdip.ahk


; Start gdi+
If !pToken := Gdip_Startup()
{
    MsgBox, 48, gdiplus error!, Gdiplus failed to start. Please ensure you have gdiplus on your system
    ExitApp
}
OnExit, Exit


; Create a layered window (+E0x80000 : must be used for UpdateLayeredWindow to work!) that is always on top (+AlwaysOnTop), has no taskbar entry or caption
Gui, 1: -Caption +E0x80000 +LastFound +OwnDialogs +Owner +AlwaysOnTop


; Show the window
Gui, 1: Show, NA


; Get a handle to this window we have created in order to update it later
hwnd1 := WinExist()

; Get a bitmap from the image
; pBitmap := Gdip_CreateBitmapFromFile(A_ScriptDir "\Gif-1.gif")

    DllCall("Crypt32.dll\CryptStringToBinary" (A_IsUnicode ? "W" : "A"), UInt,&ImgInB64, UInt,StrLen(ImgInB64), UInt,1, UInt,0, UIntP,Bytes, Int,0, Int,0, "CDECL Int") 
    VarSetCapacity(bitmap, Req := Bytes * (A_IsUnicode ? 2 : 1))
    DllCall("Crypt32.dll\CryptStringToBinary" (A_IsUnicode ? "W" : "A"), UInt,&ImgInB64, UInt,StrLen(ImgInB64), UInt,1, Str,bitmap, UIntP,Req, Int,0, Int,0, "CDECL Int")

pBitmap := Gdip_CreateBitmapFromHBITMAP(&bitmap)


; Check to ensure we actually got a bitmap from the file, in case the file was corrupt or some other error occured
If !pBitmap
{
    MsgBox, 48, File loading error!, Could not load the image specified
    ExitApp
}


; Get the width and height of the bitmap we have just created from the file
; This will be the dimensions that the file is
Width := Gdip_GetImageWidth(pBitmap), Height := Gdip_GetImageHeight(pBitmap)


; Create a gdi bitmap with width and height of what we are going to draw into it. This is the entire drawing area for everything
; We are creating this "canvas" at half the size of the actual image
; We are halving it because we want the image to show in a gui on the screen at half its dimensions
hbm := CreateDIBSection(Width//2, Height//2)


; Get a device context compatible with the screen
hdc := CreateCompatibleDC()


; Select the bitmap into the device context
obm := SelectObject(hdc, hbm)


; Get a pointer to the graphics of the bitmap, for use with drawing functions
G := Gdip_GraphicsFromHDC(hdc)


; We do not need SmoothingMode as we did in previous examples for drawing an image
; Instead we must set InterpolationMode. This specifies how a file will be resized (the quality of the resize)
; Interpolation mode has been set to HighQualityBicubic = 7

Gdip_SetInterpolationMode(G, 7)


; DrawImage will draw the bitmap we took from the file into the graphics of the bitmap we created
; We are wanting to draw the entire image, but at half its size
; Coordinates are therefore taken from (0,0) of the source bitmap and also into the destination bitmap
; The source height and width are specified, and also the destination width and height (half the original)
; Gdip_DrawImage(pGraphics, pBitmap, dx, dy, dw, dh, sx, sy, sw, sh, Matrix)
; d is for destination and s is for source. We will not talk about the matrix yet (this is for changing colours when drawing)

Gdip_DrawImage(G, pBitmap, 0, 0, Width//2, Height//2, 0, 0, Width, Height)


; Update the specified window we have created (hwnd1) with a handle to our bitmap (hdc), specifying the x,y,w,h we want it positioned on our screen
; So this will position our gui at (0,0) with the Width and Height specified earlier (half of the original image)
UpdateLayeredWindow(hwnd1, hdc, 0, 0, Width//2, Height//2)



; Select the object back into the hdc
SelectObject(hdc, obm)


; Now the bitmap may be deleted
DeleteObject(hbm)


; Also the device context related to the bitmap may be deleted
DeleteDC(hdc)


; The graphics may now be deleted
Gdip_DeleteGraphics(G)


; The bitmap we made from the image may be deleted
Gdip_DisposeImage(pBitmap)
Return

;#######################################################################

Esc::
Exit:

; gdi+ may now be shutdown on exiting the program
Gdip_Shutdown(pToken)
ExitApp

2 (изменено: teadrinker, 2015-03-27 04:10:04)

Re: AHK: показать картинку из base64 (без временного файла, GDI+)

Drugoy пишет:

Я видел функцию serzh82saratov'а

Вряд ли эта функция принадлежит руке коллеги serzh82saratov, уж он-то точно знает, что пойнтеры имеют размерность Ptr, а не UInt.
Если я правильно вас понял, то вот пример (постил уже ранее):

SetBatchLines, -1
Hex1 = 
(
FFD8FFE10EF64578696600004D4D002A00000008000C01000003000000010313000001010003000000010313000001020003000000030000009E010600030000000100020000011200030000000100010000011500030000000100030000011A000500000001000000A4011B000500000001000000AC012800030000000100020000013100020000001C000000B40132000200000014000000D08769000400000001000000E40000011C000800080008001E848000002710001E84800000271041646F62652050686F746F73686F70204353352057696E646F777300323031343A30353A31312032303A34363A3439000004900000070000000430323231A001000300000001FFFF0000A00200040000000100000064A003000400000001000000640000000000000006010300030000000100060000011A0005000000010000016A011B0005000000010000017201280003000000010002000002010004000000010000017A020200040000000100000D740000000000000048000000010000004800000001FFD8FFED000C41646F62655F434D0001FFEE000E41646F626500648000000001FFDB0084000C08080809080C09090C110B0A0B11150F0C0C0F1518131315131318110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C010D0B0B0D0E0D100E0E10140E0E0E14140E0E0E0E14110C0C0C0C0C11110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC00011080064006403012200021101031101FFDD00040007FFC4013F0000010501010101010100000000000000030001020405060708090A0B0100010501010101010100000000000000010002030405060708090A0B1000010401030204020507060805030C33010002110304211231054151611322718132061491A1B14223241552C16233347282D14307259253F0E1F163733516A2B283264493546445C2A3743617D255E265F2B384C3D375E3F3462794A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F637475767778797A7B7C7D7E7F711000202010204040304050607070605350100021103213112044151617122130532819114A1B14223C152D1F0332462E1728292435315637334F1250616A2B283072635C2D2449354A317644555367465E2F2B384C3D375E3F34694A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F62737475767778797A7B7C7FFDA000C03010002110311003F005D2856EE9ED9682E976A403DFF00F522C6CD8FB5DF0368F51D03C352B5BA3F50C2CA2FC6C263D82B2092F8D7739A3C4FEEACACD0E3977388E6C719F892A9F331AC38C6F5A1AF276BE17332E7B9B26E227EB8C67BF0CA7C43FE931C576337331CE5C7D9C3C1B641236FF5423FD60B3A4BEDA7F6586066D3EA6C05BEE9D376EFE4ACFBB808454FC9E20610C9C52D38870DFA0FF7A2D8E707EBC9EC026A7E89F8A9A0D5B89DA0900F8223770796932009D557E6F1119272E21B71F0EB7C3F2B6F96CB78E028EFC17FD6F99924B73EAEF47C2EA62F1956BEAF4B66C153438B8BB77EF7F556766D35D1997D15CB99558E634B84121A76FB959E5FE113CE018E5802631C86244BD2320E28B97CDFFC63C3CB4E709E1C92E09CB17144C3D52C67865FA48B104E5D23C6C6FE50A9E488EB7903BFAD7CFF009CE57B1CC65527C1EDFF00AA0A9E7003EB06481FE9AFFF00AA2ABF31CB4B979E4C32224615AC76F5438D971F3B0E73EE7CC422611C8655197CDE8CBEDFE8FF0075224921D7918F6BDCCAEC6BDCDFA4D0751D954A3F63B06401009009D877F2489274904BFFD026074EC4C1739D8ECDAEB60BC924FD1DEEFCE43EB608C164FEF8FC8E575EE871F6F8F047F2D54EAF0EC30C71D8038193AEBAFEECB937357B53034D0F82B90C84F3B86533291E38EBEA9C9E6AEE022F4DB716BBEC39403AB7517B1B237458EAAC650EFEB36ED9EE4F6D3498DD7B5BF10EFF00C8A87D9F1FFEE4B3FCD7FF00E413B93FE6220FF5B6FEF3BDCE648CB24C7AC5803E4983F2FF00758F4BC470E836DD92D9C9ADFB438BA4C123CFF75C9A9E4AD1A2BA8746C968B5AEF783BC0303E8788DCA9534D727F4CCFB9DFF009043991FA8C83CB7FF000583E1D9447348133908CC81E99CBD3EDC7FAA9AB7BD801638B4F88247E4573A4B70ECCD1F6E737D1DAE2E2F24027B7B9566D4CDA3F4CCFF00A5FF00904BD367FA567FD2FF00C8ADBE5C09F238F1F14A0658630E380971C7D1F3424F25F10C95F12E632509C467C92E19FCA7F59B4A2D9EA5F63AFAA0385B7D069616ED3227DBBB5599D574FACD96383EB5DA7C5D2AC7A6DDEDFD2363C7DDFF009140EA403BEB2E56E76D9BEC9719D353FBAB9FE7E1C39F2C388CF8638E1C73F9E5C387878A7C4F4FF0DC825CAF233E1E1F5E6918C47A63C5CCF1543F7BFC05C72A96174D1897DB70B37FABDA2235DDE2B4FD0A7FD3B3EE7FFE41234D007F3ED3E41AEFFC8AA03880201152DF58BBB29619CA139466658C9303EDE6F4F16FFA281247F471FF00EE437FCD77FE4524384F87F8D164F7A3DA7FF85E5FFBC7FFD1B65AC93034D48FFA70AA66E562DD38B45EC193BF6ED74F2396FD172B8276813C8FCA0FB7FE92A0DE875373C660B9C5DEA1B3610235331B93A510411DFB34E19278E719C044989BF58E28FF008AE2DD957B481ED275E5AD3F95A8432EC1F9B59F8D6DFF00C8A59421F1E04A0A1CA0BC11BD7E6DFF00BCF55CCE2C7EECAA111B6C3FAAEB62DA1FD2F2AE755592C70F686C34FD1E5AD8541B955833F6766BFBA5C3FEFC8F8907A7E50718E23E202AB4D1658E10C73993048048FBC296308CC989028C80D7E56862E1C72E6243887B72E2F4194655ED465E9E12DDAECC7730135113AE8FFEF6B94BF553DAC69F8B4FF06A36474BBF13071B2DE5BE96503E900497003F7F45516E60C7118E318C8FA0087A652E1E287A255C4F23CD4CCB3E599040C929648F18F5F0643C70E2FEB3278A24439C35EED1FF009240EA801FAC9987806E7FE24A23B80975B11F58F33CEE3FC0FF0015CD7C52321CD67241A2615297E9FEADEBBE1462794E404660C819F14018FEAB8B3F6FEB7F5D42B61FF08D1F1DDFF914E71DDD9EC3FDA03FEA8B546BADF63C31825CEE0262D2D7169D083047C16669BF0BD1D4B8B8465B9017C321191E1EF51F6D97A1673023C6447E549460A487A7B1FB7FB1359BF7A1FE24BFF563FFD2BE47BC88D408E79236B5381100FDFF001433635A37B9C19C7B9C606AE9D77152658CB41D8F6D81A4365A41D7E4A469F8BC8E6FF3C7FACEFCAABAECEFAAA753600C6C961321A3F75C7F82CEE9BF5568CEC0A728E43D86D125A1A081A96F8F928C64C7CB6288C92D2C8BAFDEE29BD063E7A3CC994F8782B863BF17E8FF00E82E761541FD2B2DE4EAD3A0F92D8FAB6437A53C3DDB03AC7092606A1AB32860C7C3EA34CC863DCC07898F62BBD2B13EDBD18D1BF645B3313C34259E309E29194B823C702655C540F5E162C59251CD96318F171CCFE186324CEE8373DAD6BB2CB98C10C041200FE4FBD64E4D3F67C8B299DDE998DD112BADA99E9D4CAE67634367E02160753E9F94722FC90D0699DDBA471F09567E15F13C9973CE1CC668F057EAF88431714F8BA7CBEA9399F17F8562C58233E5B0CB8F8BF59C27265E1C7C32DF8B8BD2E627EBBFF8A3CCF3B67F06264DD6C877D61C970EEF1FF52C52FC7FF9BC5E73FCA2C7FF0016FF00DD12F3C7FF004DB1D32B7BB2D8E6B4B9AC92E31A090EE56C66744AABC5B728B06EDA5F21CEE4899FDD59FD15E1A6E9EFB63FE92D2CBCDB5D8D656492DD8E0070385878E04E3891C3564CB885FF008AED7C479B31F88CA22538188C78E3EDC8C38BFCA7EB3FF0C79AD524B549557A57FFD3AFF595C5BD25F3A12FA87DDEE50FAA7071F21A34FD2FF00ABFD67C7E8D574EADD85926DC8758DDF59BCDA76ED7735EE2DF6B957FAB59B90CEA4315A47A3635D6384027706E8772AF8F30C99233008FD1D592780C3969C2C1D78DEA2D8353FF00E2DDFF0052F567EAE69D1717FAA7FEA9C875D3EB3BD1FA21E08DDCF62AEF4EC3FB0E1558BBFD4F4811BE22649771AF8A8FE25923C11C77EBE213AFEAD4A29F87822133DE42BE8F2991506B3AB348D5973C8F995A1F56BFE4F70FE5FF00DF5AADF57C1A9E1F4D01B55996097BFF0079DFBCF51E9581660639A9EF0F24CCB66388EEA497318E7C9C85D4E7C1C313D7825C326CF2F194B983203D31C8788F6BC01BAB9FC2C0CAC5C3CF764B366FAC6DD4198DC4FD125740ABF50FE8391FF16EFC8AA72C6B3E2FF690FF00A6DFE624472D9E3FBD8E5FF44BC99E10FAAC9EB971EDBFFEFAC443C21F52FF00962DFEB4FF00D1AD745F1EFE6B179CBFE8BCCFFC5BFF0074CBCF1FFD3753A209F5C7937FEFCB42E04E35DA7E63BF21547A2D76816590456E801DD8C6E957F305A71AC15EAEDA4011CC88591847EA47916FFC5643FD273208A12C7FF3630E279A494FD2B3D4F4B69F52636C6B292A147B787D5EBBDC87EF0DB8F7FD0FDFFEE7F59FFFD4E1AF8F51C477D56B7D5DFF00972B1E353FFEA1645A0FB4F8B41FC0233245F5B8123E8EA34EE15481A313D9BD923C509476E214FA5E26B92DF2064FC9682CEC420640F2933E508D87D5BA76758EAF12E16BD837380044098FCE0D55FE2209CA08068405FF008D26B725288C744806523C209D65A476619E01C9A3C44FE54E9B3DD1978EDF10EFC13A8CFC98FF00BA7FE949D0E4B7CDFED3FF0051C14ABF50FE8391FF0016EFC8AC285D536EA9F53A435E0B4C73051C3211CB091DA328C8F9464D8CD132C5388DE5194479CA2F1C543AA47EDBB63B6DFC58C5A3D5B02AC27D6DA8B9C1ED24EE8EC7C80543AB376F5BB879547EF635741F18CD0CDCAE0CB8EF82667C37A7F55E7BE05827839EC98B2571C0E3E2AD779713B9D2C39D815806012E0E3E527856AD8635AD1303C7C954E9449C0680620BBDDF39472D05FBB76E0443815431FF00371FEE847C43FDD9CC7FB59FFD372BFEF676EBF4E67E52925B5BFB6767E6EE88F2DA92ADFF00AB9DDB3FFC6C7FFFD5E1DFF419FD51F914ABE6AFECCFDEB01254874F3740BED589FD206EFDD77E459BF55FF61FDAEEFD9DF68F5BD3F7FAD11B7737E8ECFCEDCBC9D2439DF9A7F37C91DBE5F9A7F339BCBEF8BE5F9E7F37CFF2C3F9B7DCAEFE74A82F1049531B0F27A187CA3C83EDE92F104915CFA97D63FE769FEABBF2AC8EAF3FB77227FE0E3E1B1B0B84496CF31FF6B394FF00AA7FD271B93FFB73CC7F7B0FE517D57A3CFD87CF73A3F0568EE8311BBBF8AF2049458BF9B8F9069FC47FDD9CC7FB49FF00D27D1FF49FB63B4CFF00DF525E7092ADFF00AB9DBFFE65BFFFD9FFED15B850686F746F73686F7020332E30003842494D040400000000000F1C015A00031B25471C02000002A800003842494D042500000000001032C4B085E11CA1FA2154120320C140AD3842494D043A000000000093000000100000000100000000000B7072696E744F75747075740000000500000000436C7253656E756D00000000436C7253000000005247424300000000496E7465656E756D00000000496E746500000000436C726D000000004D70426C626F6F6C010000000F7072696E745369787465656E426974626F6F6C000000000B7072696E7465724E616D6554455854000000010000003842494D043B0000000001B200000010000000010000000000127072696E744F75747075744F7074696F6E7300000012000000004370746E626F6F6C0000000000436C6272626F6F6C00000000005267734D626F6F6C000000000043726E43626F6F6C0000000000436E7443626F6F6C00000000004C626C73626F6F6C00000000004E677476626F6F6C0000000000456D6C44626F6F6C0000000000496E7472626F6F6C000000000042636B674F626A630000000100000000000052474243000000030000000052642020646F7562406FE000000000000000000047726E20646F7562406FE0000000000000000000426C2020646F7562406FE000000000000000000042726454556E744623526C74000000000000000000000000426C6420556E744623526C7400000000000000000000000052736C74556E74462350786C40690000000000000000000A766563746F7244617461626F6F6C010000000050675073656E756D00000000506750730000000050675043000000004C656674556E744623526C74000000000000000000000000546F7020556E744623526C7400000000000000000000000053636C20556E74462350726340590000000000003842494D03ED00000000001000C800000001000200C80000000100023842494D042600000000000E000000000000000000003F8000003842494D040D0000000000040000001E3842494D04190000000000040000001E3842494D03F3000000000009000000000000000001003842494D040A00000000000100003842494D271000000000000A000100000000000000023842494D03F5000000000048002F66660001006C66660006000000000001002F6666000100A1999A0006000000000001003200000001005A00000006000000000001003500000001002D000000060000000000013842494D03F80000000000700000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800003842494D0408000000000010000000010000024000000240000000003842494D041E000000000004000000003842494D041A00000000033F000000060000000000000000000000640000006400000005004B006F006D005F00390000000100000000000000000000000000000000000000010000000000000000000000640000006400000000000000000000000000000000010000000000000000000000000000000000000010000000010000000000006E756C6C0000000200000006626F756E64734F626A6300000001000000000000526374310000000400000000546F70206C6F6E6700000000000000004C6566746C6F6E67000000000000000042746F6D6C6F6E670000006400000000526768746C6F6E670000006400000006736C69636573566C4C73000000014F626A6300000001000000000005736C6963650000001200000007736C69636549446C6F6E67000000000000000767726F757049446C6F6E6700000000000000066F726967696E656E756D0000000C45536C6963654F726967696E0000000D6175746F47656E6572617465640000000054797065656E756D0000000A45536C6963655479706500000000496D672000000006626F756E64734F626A6300000001000000000000526374310000000400000000546F70206C6F6E6700000000000000004C6566746C6F6E67000000000000000042746F6D6C6F6E670000006400000000526768746C6F6E67000000640000000375726C54455854000000010000000000006E756C6C54455854000000010000000000004D7367655445585400000001000000000006616C74546167544558540000000100000000000E63656C6C54657874497348544D4C626F6F6C010000000863656C6C546578745445585400000001000000000009686F727A416C69676E656E756D0000000F45536C696365486F727A416C69676E0000000764656661756C740000000976657274416C69676E656E756D0000000F45536C69636556657274416C69676E0000000764656661756C740000000B6267436F6C6F7254797065656E756D0000001145536C6963654247436F6C6F7254797065000000004E6F6E6500000009746F704F75747365746C6F6E67000000000000000A6C6566744F75747365746C6F6E67000000000000000C626F74746F6D4F75747365746C6F6E67000000000000000B72696768744F75747365746C6F6E6700000000003842494D042800000000000C000000023FF00000000000003842494D0414000000000004000000013842494D040C000000000D900000000100000064000000640000012C0000753000000D7400180001FFD8FFED000C41646F62655F434D0001FFEE000E41646F626500648000000001FFDB0084000C08080809080C09090C110B0A0B11150F0C0C0F1518131315131318110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C010D0B0B0D0E0D100E0E10140E0E0E14140E0E0E0E14110C0C0C0C0C11110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC00011080064006403012200021101031101FFDD00040007FFC4013F0000010501010101010100000000000000030001020405060708090A0B0100010501010101010100000000000000010002030405060708090A0B1000010401030204020507060805030C33010002110304211231054151611322718132061491A1B14223241552C16233347282D14307259253F0E1F163733516A2B283264493546445C2A3743617D255E265F2B384C3D375E3F3462794A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F637475767778797A7B7C7D7E7F711000202010204040304050607070605350100021103213112044151617122130532819114A1B14223C152D1F0332462E1728292435315637334F1250616A2B283072635C2D2449354A317644555367465E2F2B384C3D375E3F34694A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F62737475767778797A7B7C7FFDA000C03010002110311003F005D2856EE9ED9682E976A403DFF00F522C6CD8FB5DF0368F51D03C352B5BA3F50C2CA2FC6C263D82B2092F8D7739A3C4FEEACACD0E3977388E6C719F892A9F331AC38C6F5A1AF276BE17332E7B9B26E227EB8C67BF0CA7C43FE931C576337331CE5C7D9C3C1B641236FF5423FD60B3A4BEDA7F6586066D3EA6C05BEE9D376EFE4ACFBB808454FC9E20610C9C52D38870DFA0FF7A2D8E707EBC9EC026A7E89F8A9A0D5B89DA0900F8223770796932009D557E6F1119272E21B71F0EB7C3F2B6F96CB78E028EFC17FD6F99924B73EAEF47C2EA62F1956BEAF4B66C153438B8BB77EF7F556766D35D1997D15CB99558E634B84121A76FB959E5FE113CE018E5802631C86244BD2320E28B97CDFFC63C3CB4E709E1C92E09CB17144C3D52C67865FA48B104E5D23C6C6FE50A9E488EB7903BFAD7CFF009CE57B1CC65527C1EDFF00AA0A9E7003EB06481FE9AFFF00AA2ABF31CB4B979E4C32224615AC76F5438D971F3B0E73EE7CC422611C8655197CDE8CBEDFE8FF0075224921D7918F6BDCCAEC6BDCDFA4D0751D954A3F63B06401009009D877F2489274904BFFD026074EC4C1739D8ECDAEB60BC924FD1DEEFCE43EB608C164FEF8FC8E575EE871F6F8F047F2D54EAF0EC30C71D8038193AEBAFEECB937357B53034D0F82B90C84F3B86533291E38EBEA9C9E6AEE022F4DB716BBEC39403AB7517B1B237458EAAC650EFEB36ED9EE4F6D3498DD7B5BF10EFF00C8A87D9F1FFEE4B3FCD7FF00E413B93FE6220FF5B6FEF3BDCE648CB24C7AC5803E4983F2FF00758F4BC470E836DD92D9C9ADFB438BA4C123CFF75C9A9E4AD1A2BA8746C968B5AEF783BC0303E8788DCA9534D727F4CCFB9DFF009043991FA8C83CB7FF000583E1D9447348133908CC81E99CBD3EDC7FAA9AB7BD801638B4F88247E4573A4B70ECCD1F6E737D1DAE2E2F24027B7B9566D4CDA3F4CCFF00A5FF00904BD367FA567FD2FF00C8ADBE5C09F238F1F14A0658630E380971C7D1F3424F25F10C95F12E632509C467C92E19FCA7F59B4A2D9EA5F63AFAA0385B7D069616ED3227DBBB5599D574FACD96383EB5DA7C5D2AC7A6DDEDFD2363C7DDFF009140EA403BEB2E56E76D9BEC9719D353FBAB9FE7E1C39F2C388CF8638E1C73F9E5C387878A7C4F4FF0DC825CAF233E1E1F5E6918C47A63C5CCF1543F7BFC05C72A96174D1897DB70B37FABDA2235DDE2B4FD0A7FD3B3EE7FFE41234D007F3ED3E41AEFFC8AA03880201152DF58BBB29619CA139466658C9303EDE6F4F16FFA281247F471FF00EE437FCD77FE4524384F87F8D164F7A3DA7FF85E5FFBC7FFD1B65AC93034D48FFA70AA66E562DD38B45EC193BF6ED74F2396FD172B8276813C8FCA0FB7FE92A0DE875373C660B9C5DEA1B3610235331B93A510411DFB34E19278E719C044989BF58E28FF008AE2DD957B481ED275E5AD3F95A8432EC1F9B59F8D6DFF00C8A59421F1E04A0A1CA0BC11BD7E6DFF00BCF55CCE2C7EECAA111B6C3FAAEB62DA1FD2F2AE755592C70F686C34FD1E5AD8541B955833F6766BFBA5C3FEFC8F8907A7E50718E23E202AB4D1658E10C73993048048FBC296308CC989028C80D7E56862E1C72E6243887B72E2F4194655ED465E9E12DDAECC7730135113AE8FFEF6B94BF553DAC69F8B4FF06A36474BBF13071B2DE5BE96503E900497003F7F45516E60C7118E318C8FA0087A652E1E287A255C4F23CD4CCB3E599040C929648F18F5F0643C70E2FEB3278A24439C35EED1FF009240EA801FAC9987806E7FE24A23B80975B11F58F33CEE3FC0FF0015CD7C52321CD67241A2615297E9FEADEBBE1462794E404660C819F14018FEAB8B3F6FEB7F5D42B61FF08D1F1DDFF914E71DDD9EC3FDA03FEA8B546BADF63C31825CEE0262D2D7169D083047C16669BF0BD1D4B8B8465B9017C321191E1EF51F6D97A1673023C6447E549460A487A7B1FB7FB1359BF7A1FE24BFF563FFD2BE47BC88D408E79236B5381100FDFF001433635A37B9C19C7B9C606AE9D77152658CB41D8F6D81A4365A41D7E4A469F8BC8E6FF3C7FACEFCAABAECEFAAA753600C6C961321A3F75C7F82CEE9BF5568CEC0A728E43D86D125A1A081A96F8F928C64C7CB6288C92D2C8BAFDEE29BD063E7A3CC994F8782B863BF17E8FF00E82E761541FD2B2DE4EAD3A0F92D8FAB6437A53C3DDB03AC7092606A1AB32860C7C3EA34CC863DCC07898F62BBD2B13EDBD18D1BF645B3313C34259E309E29194B823C702655C540F5E162C59251CD96318F171CCFE186324CEE8373DAD6BB2CB98C10C041200FE4FBD64E4D3F67C8B299DDE9
)

Hex2 = 
(
98DD112BADA99E9D4CAE67634367E02160753E9F94722FC90D0699DDBA471F09567E15F13C9973CE1CC668F057EAF88431714F8BA7CBEA9399F17F8562C58233E5B0CB8F8BF59C27265E1C7C32DF8B8BD2E627EBBFF8A3CCF3B67F06264DD6C877D61C970EEF1FF52C52FC7FF9BC5E73FCA2C7FF0016FF00DD12F3C7FF004DB1D32B7BB2D8E6B4B9AC92E31A090EE56C66744AABC5B728B06EDA5F21CEE4899FDD59FD15E1A6E9EFB63FE92D2CBCDB5D8D656492DD8E0070385878E04E3891C3564CB885FF008AED7C479B31F88CA22538188C78E3EDC8C38BFCA7EB3FF0C79AD524B549557A57FFD3AFF595C5BD25F3A12FA87DDEE50FAA7071F21A34FD2FF00ABFD67C7E8D574EADD85926DC8758DDF59BCDA76ED7735EE2DF6B957FAB59B90CEA4315A47A3635D6384027706E8772AF8F30C99233008FD1D592780C3969C2C1D78DEA2D8353FF00E2DDFF0052F567EAE69D1717FAA7FEA9C875D3EB3BD1FA21E08DDCF62AEF4EC3FB0E1558BBFD4F4811BE22649771AF8A8FE25923C11C77EBE213AFEAD4A29F87822133DE42BE8F2991506B3AB348D5973C8F995A1F56BFE4F70FE5FF00DF5AADF57C1A9E1F4D01B55996097BFF0079DFBCF51E9581660639A9EF0F24CCB66388EEA497318E7C9C85D4E7C1C313D7825C326CF2F194B983203D31C8788F6BC01BAB9FC2C0CAC5C3CF764B366FAC6DD4198DC4FD125740ABF50FE8391FF16EFC8AA72C6B3E2FF690FF00A6DFE624472D9E3FBD8E5FF44BC99E10FAAC9EB971EDBFFEFAC443C21F52FF00962DFEB4FF00D1AD745F1EFE6B179CBFE8BCCFFC5BFF0074CBCF1FFD3753A209F5C7937FEFCB42E04E35DA7E63BF21547A2D76816590456E801DD8C6E957F305A71AC15EAEDA4011CC88591847EA47916FFC5643FD273208A12C7FF3630E279A494FD2B3D4F4B69F52636C6B292A147B787D5EBBDC87EF0DB8F7FD0FDFFEE7F59FFFD4E1AF8F51C477D56B7D5DFF00972B1E353FFEA1645A0FB4F8B41FC0233245F5B8123E8EA34EE15481A313D9BD923C509476E214FA5E26B92DF2064FC9682CEC420640F2933E508D87D5BA76758EAF12E16BD837380044098FCE0D55FE2209CA08068405FF008D26B725288C744806523C209D65A476619E01C9A3C44FE54E9B3DD1978EDF10EFC13A8CFC98FF00BA7FE949D0E4B7CDFED3FF0051C14ABF50FE8391FF0016EFC8AC285D536EA9F53A435E0B4C73051C3211CB091DA328C8F9464D8CD132C5388DE5194479CA2F1C543AA47EDBB63B6DFC58C5A3D5B02AC27D6DA8B9C1ED24EE8EC7C80543AB376F5BB879547EF635741F18CD0CDCAE0CB8EF82667C37A7F55E7BE05827839EC98B2571C0E3E2AD779713B9D2C39D815806012E0E3E527856AD8635AD1303C7C954E9449C0680620BBDDF39472D05FBB76E0443815431FF00371FEE847C43FDD9CC7FB59FFD372BFEF676EBF4E67E52925B5BFB6767E6EE88F2DA92ADFF00AB9DDB3FFC6C7FFFD5E1DFF419FD51F914ABE6AFECCFDEB01254874F3740BED589FD206EFDD77E459BF55FF61FDAEEFD9DF68F5BD3F7FAD11B7737E8ECFCEDCBC9D2439DF9A7F37C91DBE5F9A7F339BCBEF8BE5F9E7F37CFF2C3F9B7DCAEFE74A82F1049531B0F27A187CA3C83EDE92F104915CFA97D63FE769FEABBF2AC8EAF3FB77227FE0E3E1B1B0B84496CF31FF6B394FF00AA7FD271B93FFB73CC7F7B0FE517D57A3CFD87CF73A3F0568EE8311BBBF8AF2049458BF9B8F9069FC47FDD9CC7FB49FF00D27D1FF49FB63B4CFF00DF525E7092ADFF00AB9DBFFE65BFFFD93842494D042100000000005500000001010000000F00410064006F00620065002000500068006F0074006F00730068006F00700000001300410064006F00620065002000500068006F0074006F00730068006F0070002000430053003500000001003842494D04060000000000070004000000010100FFE10DF0687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F003C3F787061636B657420626567696E3D22EFBBBF222069643D2257354D304D7043656869487A7265537A4E54637A6B633964223F3E203C783A786D706D65746120786D6C6E733A783D2261646F62653A6E733A6D6574612F2220783A786D70746B3D2241646F626520584D5020436F726520352E302D633036302036312E3133343737372C20323031302F30322F31322D31373A33323A30302020202020202020223E203C7264663A52444620786D6C6E733A7264663D22687474703A2F2F7777772E77332E6F72672F313939392F30322F32322D7264662D73796E7461782D6E7323223E203C7264663A4465736372697074696F6E207264663A61626F75743D222220786D6C6E733A786D704D4D3D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F6D6D2F2220786D6C6E733A73744576743D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F73547970652F5265736F757263654576656E74232220786D6C6E733A64633D22687474703A2F2F7075726C2E6F72672F64632F656C656D656E74732F312E312F2220786D6C6E733A70686F746F73686F703D22687474703A2F2F6E732E61646F62652E636F6D2F70686F746F73686F702F312E302F2220786D6C6E733A786D703D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F2220786D6C6E733A786D705269676874733D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F7269676874732F2220786D704D4D3A446F63756D656E7449443D2243443445384330393239463534463439454244433032434533383137443844302220786D704D4D3A496E7374616E636549443D22786D702E6969643A44373531443444383242443945333131383330373944343234374437383645302220786D704D4D3A4F726967696E616C446F63756D656E7449443D224344344538433039323946353446343945424443303243453338313744384430222064633A666F726D61743D22696D6167652F6A706567222070686F746F73686F703A436F6C6F724D6F64653D2233222070686F746F73686F703A49434350726F66696C653D22322E30362F4435302F5032322D4542552220786D703A437265617465446174653D22323030372D30322D32385430343A35313A31302B30343A30302220786D703A4D6F64696679446174653D22323031342D30352D31315432303A34363A34392B30343A30302220786D703A4D65746164617461446174653D22323031342D30352D31315432303A34363A34392B30343A30302220786D705269676874733A4D61726B65643D2246616C7365223E203C786D704D4D3A486973746F72793E203C7264663A5365713E203C7264663A6C692073744576743A616374696F6E3D227361766564222073744576743A696E7374616E636549443D22786D702E6969643A4436353144344438324244394533313138333037394434323437443738364530222073744576743A7768656E3D22323031342D30352D31315432303A34363A34392B30343A3030222073744576743A736F6674776172654167656E743D2241646F62652050686F746F73686F70204353352057696E646F7773222073744576743A6368616E6765643D222F222F3E203C7264663A6C692073744576743A616374696F6E3D227361766564222073744576743A696E7374616E636549443D22786D702E6969643A4437353144344438324244394533313138333037394434323437443738364530222073744576743A7768656E3D22323031342D30352D31315432303A34363A34392B30343A3030222073744576743A736F6674776172654167656E743D2241646F62652050686F746F73686F70204353352057696E646F7773222073744576743A6368616E6765643D222F222F3E203C2F7264663A5365713E203C2F786D704D4D3A486973746F72793E203C2F7264663A4465736372697074696F6E3E203C2F7264663A5244463E203C2F783A786D706D6574613E2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020203C3F787061636B657420656E643D2277223F3EFFE202304943435F50524F46494C450001010000022041444245021000006D6E74725247422058595A2007CE00020016000F00330029616373704150504C000000006E6F6E65000000000000000000000000000000000000F6D6000100000000D32D4144424500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A63707274000000FC0000002464657363000001200000006C777470740000018C00000014626B7074000001A00000001472545243000001B40000000E67545243000001C40000000E62545243000001D40000000E7258595A000001E4000000146758595A000001F8000000146258595A0000020C00000014746578740000000028632920313939382041646F62652053797374656D7320496E632E00646573630000000000000011322E30362F4435302F5032322D454255000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058595A20000000000000F6DC000100000000D33A58595A2000000000000000000000000000000000637572760000000000000001020F0000637572760000000000000001020F0000637572760000000000000001020F000058595A200000000000007C920000433C000005EE58595A2000000000000051EC0000A8B80000056058595A2000000000000028580000140B0000C7DFFFEE000E41646F626500640000000001FFDB0084000604040405040605050609060506090B080606080B0C0A0A0B0A0A0C100C0C0C0C0C0C100C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C010707070D0C0D18101018140E0E0E14140E0E0E0E14110C0C0C0C0C11110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC00011080064006403011100021101031101FFDD0004000DFFC401A20000000701010101010000000000000000040503020601000708090A0B0100020203010101010100000000000000010002030405060708090A0B1000020103030204020607030402060273010203110400052112314151061361227181143291A10715B14223C152D1E1331662F0247282F12543345392A2B26373C235442793A3B33617546474C3D2E2082683090A181984944546A4B456D355281AF2E3F3C4D4E4F465758595A5B5C5D5E5F566768696A6B6C6D6E6F637475767778797A7B7C7D7E7F738485868788898A8B8C8D8E8F82939495969798999A9B9C9D9E9F92A3A4A5A6A7A8A9AAABACADAEAFA110002020102030505040506040803036D0100021103042112314105511361220671819132A1B1F014C1D1E1234215526272F1332434438216925325A263B2C20773D235E2448317549308090A18192636451A2764745537F2A3B3C32829D3E3F38494A4B4C4D4E4F465758595A5B5C5D5E5F5465666768696A6B6C6D6E6F6475767778797A7B7C7D7E7F738485868788898A8B8C8D8E8F839495969798999A9B9C9D9E9F92A3A4A5A6A7A8A9AAABACADAEAFAFFDA000C03010002110311003F0005E488EDDFCAD0F2895A40F20E4CAA7F688EA47FC5998FA1883886CEDBDABCB38EBA604A4070C3F88FF31E7FE610A35DD442AF051732D13A50733B669F37D72F797D2BB2CDE97113FEA70FF721BF2EBE991EBB62FAA053A72CCA6EC3A965318EB5515273274719913E0FAF83D2E1F6E93E1003F9DFA13AFCC29FCA12DDD91F2CA42B0089BEB3E8A327C65B6E4180FD9CD9F6647388CBC6BBBF4F13CC63E2EAC4C74CC3ED6FEF07F55EA7B17FBA3FD6FD0DE6A9DCBB15762A8DD10575AB01E37308FF009283250E61A7527F772FEACBEE50D7D78F9AB5153D7EB7775FF91A732F3F23EF78BEC03FE110FEA4BFDCA8E613DD3B15762AFF00FFD02FF256BDA15F89B4BD1609E18ED9C3334F4DFD5914506EDD38E4700881C31E41BFB6239E7319731899E4F4FA3FA0C1BCCA92FE9DD42465215AE243C883424B139A3D48FDE4BDEFA97626407478B7DFC38FDC95E6C7B207AA5EE6AEDA3E98FBCB47A66F5E75B1981AF8C0438CC44A41D8F66CB24A631C646113FCD7669F3881C42623C04C8C5DE69CCE39A50948CC08C65EA7A47E577927CBFE64B5BB3AADC4B6ED6E63102DBC6923C8642C08F8BF978E6FF411C30D24252C78F2CA729FAA7FD17CEFDA5D76ABF94278F1E6CB8610862F46397A7D7149F58D1F4EB2D5AF6CE18F9C36D3C9146F2280E551880580D83674D83B334B38097858FD438BE978DCDED076846463E3E6F49FE7A5E22861D5B4B68D027FA4C64D053A3AE737ED2E9316138FC38C61C465F4FF009AF71EC57696A3530D40CD927978611E1F125C5C3C5E2255E6A555F3A6ACA3A0BCBBA7FC8E39CF67E47DEEC3B00FEFE1FD53FEE109982F7CA515D5B4CED1C52ABBA7DB553523B6F964B1CA22C87170EB70E5918C2519CA3F5463FC2AB95B94FF00FFD17683E5BD1F469647D3E131C973C5A662CCC4F02EDD189C9C6007270F3EB7266004CD88A5DF98A84796E224749A3DFF00D8B0CC3ED1FEEFE2F49EC5FF008EFF00C9397FBD798F6C8763F397C1EEBB6CED1F8A6DE59BAD2ADAFEE1F53457B77B1BE8A30EBCC0B896D644B7602868CB314E2DFB1F6B3753048D9E5B55199C6443EA51F2DE91FF003A1DDDE5F47CB5082608B2B316600B2EDB1A1D9B2917C4017578B3E6C7A8C78C922E32E2FF006497E6BBB5C011881DE5EEBB149329126F68B22D1A5963B28DA3768CD4EEA4A9EBED9D7FB39107451BEF9FFBA7CABDB791FE54C95FCDC7FF004CC320F2BA69336B2A75974167C1DA43331019E9F0D586F5AE5FDB53D4474C7F2E25E2F147E8FE6FF13A0ECD8E2966FDF11C147EA40F9CFF0044C3E67B63A4F0FA8A49118CC6C596A3896A124F7CE43B525A83A6C2751C5E37164E2E3F4CBEA8F0BE93EC6C7178BA918ABC3E0C5F4FBB231CF3B0A7E606B40EC7EB97469F396BFC7357A8E52F7B95D81FDFE3FEA9FF0072970EA3301F414BF4FD256CAE679C4A64F5ABB114A7C55F1CCACDA9E388155C2E8BB2FB17F29967938F8FC5FE8F0FF171F7A6198AEF5FFFD23495F8C86B19A7C7401878B8FD796711EE7504A47E7A58E5D016199C5BC62443EA302C2BBEDF0D5B7AE61EBB7C7BFA777A7F64F2E486AEE10394F872F489461FCDFE7BCE45869F5DF528947898E6FF009A721D95B1957AB93D8F6C6AF3111BC338F3FE3C5FEF66DFE8ED3EB4FD2900DF6AC737FCD19B9E23DCE8CEA327FA9CFF00D363FF008A641636D6ABE49D4E25BB8A4067426650E02FD8D882A1BEE5CA6523C6367519F2CBF398CF04AF84FA7D3FD2FE970B1D4B0B46343A840BEE44BFF3466076AFAA31BF4FF59EC3B235992329562C93D87D2717FBEC89EE9D630259A28BD8580A90C3D4EE7DD73A9EC2C9286922042531EAF5478787EAFE94A2F9A7B5B93C5ED1C9223C23E8FDDCFEB8FEEE3FCCE38FFB25716D17FCB4C43FE0FF00E69CDC7E625FEA73FF0061FF0016F35C23BC20351B589A7B606EE1401AA09E7BEE36145CE4BDA8999F8760E3FABEBFF37F99C4FA2FB059658C673184F371787FDDF0FA3EBFABC496340F9B1126FCC2D5C4B28855AF6E034AC090A399EA14139CEE7177EF76DD919250CB03189C9203E88D7ABD3FD3F4ADFD17A6FF00D5DA0A569F626FBFEC6627047F9C3FD93D78ED0D47FCA3E5FF004F83FEAA3474ED240AFE958C9F058A6FE2A31E08FF003BEF65F9DD4FFA84FF00E5661FF8B77E8ED27FEAEB1FFC899BFE69C7823FCEFB0A7F39A8FF005097FCACC3FF0014FF00FFD33078E2A9A2800F229EC3E3A7E1967087504049BCC1A8D8DF46DA669D7F0A6A7EB04549397553465DD585728D462328D479BB3EC6D6E9B067E2CC0CE1C328F0C3EAE2FF004D0FF74F3C9359D49242AED1B32123E28623D36EEB94F65DCB8AFA53E85DADD9B8222062251E2BFF002997CBFA6B1758BA1D62B76AFF0035BC47FE35CDBF863CFE6E9CE8A1DF3FF9593FF8A645A55E2CDE54D5EEDED6DD9E174FDD88F821078F55523289C3D61D36AB4FC3ABC404A7EA07D5C5C52EBF4F131D1A9599279E9B0107B234A9FA9CE1CDA58E4FAB7A77D84E7C37E1E59C6FCB1CFF00DE27DA7CFA7B59C64DA32022A02CA76DCFF329CE8FB330648E0888C808EFE9943FA47FA4F9DFB41332D6E4333E24FD3C53FA38BF771FE1FA51
)

Hex3 = 
(
04E987F66743F346FE0B99F59C7FA99FF4D1FF008A74DE9F34B3565D3BD58099A54A1257F76ADDC75A30CE43DA832271F8951FAB8783D5FCDFE770BE91EC09CA2398E28C720FDDF1F1CFC2FE7FD3E8C9FEF507E7048DBCFDAD176F4D1AF26AB52B4AB1ED9CFEA2B7769D8D2947340C4711FE6DF0F492156CAD9CD12F621FEB8917FE353987C03BC3DA9D6651CF164FF34E29FF00D3C543A3CBFEEBB8B690F82CC80FFC315C7C33DE3E6C7F95203EA86687FC929FFD3BE35BFA1F50A5782D3F9BD44A7DFCA98F8525FE57D3D7D47FD264E2FF004BC1C4FF00FFD43250C2351507901ED4E484F1FF0086CB9D42431F922D63D797565BB90B99DA73132AD3E224D2BF4E34D5E0012E2B799DE0A5D4C3C1D87E3983D93CE7F8EF7D9BB577863FEAFF00C4A89CDCBA54FF0046087CB5ABAB9205015153BB0151B663653FBC8BA3D79AD5E14AAC2C679E68E90C92425A8ECAAC47BEE0666E03039231911B9EF73FB4324E1827287D7189E1FE266B7BE57BCD2F43D335291A3FAA6A4AC6D514B17017F9AA29F8E745A6CD8F8A586008F09F36D60CB92B3E4224737FBD4AF331C04BF5582695E131A170B5AD057B8CE47DA7D1E6CD2C671C6531112BE11EE7D27D82ED2D369B1E619B243119CA1C3E24B878BD325DF980B4F3EEB640A56E9C9DA9D687F8E729A8EAEE7B0CFEFF001FE3BD29B4B4B8BB9D60B74F5267AF15040AD057BD330A3124D07BBD4EA71E081C990F0423CE4A72C524523C520E32212AEBE041A11808A6C84C4E22513E990E28B5438B3A2FFFD53761FBF65E3F1282B507624715AE5CEA4F35EAB42AA7A02371DC35715E8F10D4A8350B9FF8CAFF00F123987D95CE7EFF00F8A7D77B4BFBAC5FD4FF007B1431CDBBA864BA1DAA49E52D66527E38C8E23C7E115CC6C83F791743AFFF001CC2CC3F2D888FCAB2899C44924F200CC428A32281D4E69BB56121A889ABF4C67FE6F13BFC5921384803C89C72FE8CE955BC97772C51A49A9992289690A9566555FF002416A01F2CDFFF00A2F8024F83BFF5BFE38F23FE83A6451CDB7F53FE3EC6350B4FAA5ECF6BCB9FA2E539D295A77A6759A2D4F8F86392B87C48F170BC8EB74DE066962BE2F0E5C3C4A03A8F9E64B8C84FCC3FF94F75BAEF5B927E8E299E51ABE727D77B03FBEC7F8E8EF25DADC49AEC33471178A1E5EABD0955E48D4E4728D2C499877FED6668474338488139D7047F8A7C338F170B3BD6FC81A6C5A55EEA6F6F1997D279B92C9213C9816E54E9D70F8D86723100F17A9E5743DA5DA1038C1C83C2E2C70E1A8FF77C518FF37F9AF26A1CC57D45FFD633373146BEB4AEB10A0F8DC85156909152C77E996DBAA0093B735F05CC174A4C32C73221085A360D46F98C410792251239850BFB3B47B2BA0B0C619A163508B5AFA6C49E9D6A30C401C9C9C59F219C6E523BC7F88B1BF2C7E53D8EB5A0D8EA6DA94B03DD21668963560A4315A0248F0CD5EAFB6658B2CA1C20F0F9BDACF3106A927B08458687E64B4E65961964851C8A7229F06FF31DB36427C4607F9C389D46BB7D5E1FC754EBCAFA41D5FC98B6625F47F7E1F995E5D146D4A8F1C3AFD6FE5B538F25717EE387FD949CAD160F1A39A375FE112FF73066D6B0FA16B0C15AFA48A95E95E200AE72997271CCCBF9D232FF004CEFE11E1881DC184F98B43D47EBD7D7EB18369C8C9EA075FB341DAB5CF43EC3ED7D3F838B0717EF6B8387865F57F5BE97CE7B77B1F53E365CFC3FB9BE3E2E28FD3FD5FA98F9D8573A7796417E6032C9E79D55C1146946C37FD8419E53AC15297BDF5CF67CFEF717E3A273F975308FEBE1BF6BD2A77DFE2C8688F36CF6ECFF0073FF00253FDE32FD6359BB934ABAB766678CC0E02EC16810D32E3A7C71B901EADDE4743AAC92CF8E24FA7C4C7FEEE2F1DDE9F466A9F70B2FFFD729FCC9768FCAB286D8B4D6AA7DC81CAB91D47D0E3F677F7C3DDFA14BF29E874FBF41F0FF00A4835F9A8FE995E8FE92E476B7D71F77E966175C4D9CF426A607A7FC8B7CCC7578BEA1EF08FF00CB5A8F24E95FEA3FFC9D6CE4BB57FC627F8FE17B7CBF5179CDFDAA476FE708981E50DE4A54D3B16AE74DA7371C67FA1175BABFF1BC27C9907E5B9FF9D7A9E127EB55CC7F68C7AF17FC247FBA93B1EC63EACFFF000F97FB9832AEC739E776F3BF2DF97758D2F4AD7E4D4A0308B8857D1AB2B5789627EC934EA3371D9531F9CC55FEA81A7DA6CB19E8B2089FE0924EDF64FCB3D583E2652BF39D5BCDF7EC0D4196A4FF00B14CF2AD77D73FEB3EB7ECF7F798BF1FC2C8BF2E28DFA457B911537A776CAF43D5BBDBC1B61FF929FEF1965F2B9D2EF895FF0074CB407D90F4CCD9FD27DCF0FD9DFE338FFE190FF761E3D534CD1BEF3D5FFFD08A7E65E9FE4DB5F2F5BC9A3EA6D73A83CF199A06BD6B822328C4D632C54716E3BF1CD0E9B36694AA7F4BB8F0E2370002977E5AEB37F0F98C69B1B01673C724F2A1505BD444D8F2EBE19B4D2C8DD381DA78C18F17F145EB3059FD69CDA54A2CC1D4484569F01ED976AB51E140CEAE9D4E970F899046E93AF2DE8BFA1344B5D2C4DF5816C18094AF1AF262DD2A7C7394D567F1B219D70F13D74E566D20F38685692C771676491DADC6AAAEF3CD434792A0727EE736DD9BAA94604C8F1471FD2EB33EFABC210DE55D0A7D1B4F6B59A54958B06E48081B281DF2CED5ED08EA4C0C418F870E0F57BDDEF67E8A5825909225E364F17FABB2739AA76481D745745BEFF8C2FF00AB363D8E7FC2F17FC322EB3B647F81E5FF0085C9E62DF64FCB3D743E4052CF36EFE67BEDA84B834F9A479E57DA1FDE4FFAC5F5BF673FBCC3EEFF007AC9BF2EACEF234BAB831B2DB4C102C846CDC4B06A7C8E434513B9E8BEDCEA31C8E3C608E3C7C5C70FE6F188F0B2AD652E9F4CB9582AD27A6CAA806EDC96941999901E12F13A2988E78489A119C3FDD3C8FEA17BF5BFA97A2DF5BE5C3D1A7C5CBC299A4E037C35BBEE9F9DC5E178DC43C1AE2F13F8387F9CFF00FFD1E15794F5DC8FDADF6F1EB9AD8F27772659F9782BE75B704D2B6D29A8FF008C35FE19769BEA703B487EE8FC1EE1A4EFA8C5E20354F8FC38F6A7F707E1F7BACECEFEFC7C7EE6459CA3D3243E6000EA363BD080D4F03F10CD9E8FFBA9B81905EB30FBD6652F5AEC5503AE7FC71AFBFE30BFEACD87647F8DE2FF008645D6F6BFF8A65FF85C9E62DF64FCB3D783E3E9779C80FF00165F71E8047FF0D1A1FE19E57DA1FDE4FF00AF27D6BD9BFEF317F57FDEB3CF24ACB27962D114F152F2076E878F36E993D2FF00761D2FB5DFF1A13F743FDC04EEE4AC5146895E2BB9AF5A01E27DF324BCCBCFF89FF9585C6A7FBEAD7BFF00755CD6D7EFFE2FA6F89FEB0FFC92FF00A78FFFD2E1170ADF0378A29FF8519AD8BBA28B88B2DEC0E8C5768C725343D40EB8C4A262C3E91D25C2EA0809D807624F805EB9776A7F707E1FEE9E7FB3BFBE1F1FB91DA3F9AFCBDACCF241A65EADCCD127A8EAAAE28B502BF128EE739AC9A79C05C853BCC1ADC594D425C4421F5F929AA58C7FCCAE7EE3999A43FB99FC1891FE198BFCE59953D53B1552BAB64B9B696DE42424CA518AF5A1F0CBB4F9E587247247EA81E268D4E08E6C72C72FA72478580F99F46B6D2E6863B76765963666E64135069B500CF4AEC0ED4C9AC84A5311061211F47B9F33F683B2B1E8E718E332227132F5FBD8CF9D6329E6DD414FF25B91F4C2A7389ED0FEF27FD693DE7B35FDE62F77FBD2CDBC8E59BCB300078157968FE14724D3EFC9E90FEEC3A5F6B87FAE13FEAC3FDC26AC81A6F53D50EA578B835A81F2197BCC0611E9A7FCAC2F4A87D3F5294AF6F47302BF7EFA4FFCE83FCCFF00A7CFFFD3E19353D386BFC8BFF11CD68E65DD2A414E56FF0024E5FF0004311CD0793E92D269FA4179FF00BEDEB4F0E03A65FDA7FDC1FF0037FDD3CFF67FF7C3DD2FB98FFE58FF00827F4ADDFE81FAF7D6FD0FDF7D6F870F4F9AFD9E1FB5CA99A6D778BC238F86AFF85C8EC9FCBF19F0B8F8B87F8D96DFFF00BD727CC53EECC6C7F4BDA69AB8021F26E43B15762AC2FCFD4FACDA78FA4FFF0012CEF7D8EBF0B27F5E3FEE5F3FF6CFFBDC7FD497FBA617E78E7FE30D4F957FDD14AF5E3E8AD3F0CE6B5DF5CBFAD27AAF673FBDC7EEFF007A599F906BFE1A5EBCBD49787DE2B96693FBB74FED87F8FCBFA90FF729EB7A946E3C79F7A52B4A664BCB301FDF7FCAC1EDCF9FD1FDD7F4CD77F96FC773E91BFF00207F99FF004F9FFFD9
)

Hex := Hex1 . Hex2 . Hex3

pToken := GdipStartup()
pBitmap := GetBitmapFromHex(hex, hBitmap)
GdipGetImageDimensions(pBitmap, Width, Height)

SS_BITMAP := 0xE, STM_SETIMAGE := 0x172, IMAGE_BITMAP := 0
Gui, Margin, 0, 0
Gui, Add, Text, hWndPic w%Width% h%Height% +%SS_BITMAP%
PostMessage, STM_SETIMAGE, IMAGE_BITMAP, hBitmap,, ahk_id %Pic%
Gui, Show

DllCall("gdiplus\GdipDisposeImage", "ptr", pBitmap)
DllCall("DeleteObject", "ptr", hBitmap)
GdipShutdown(pToken)
Return

GuiClose:
GuiEscape:
   ExitApp

Hex2Bin(ByRef buff, hex)
{
   VarSetCapacity(buff, len := StrLen(hex)//2)
   Loop % len
      NumPut("0x" . SubStr(hex, 1 + (A_Index - 1)*2, 2), buff, A_Index - 1, "UChar")
}

GetBitmapFromHex(hex, ByRef hBitmap)
{
   Hex2Bin(buff, hex)
   nSize := StrLen(hex)//2

   if A_OSVersion not in WIN_XP,WIN_2003,WIN_2000
      SHCreateMemStream := "Shlwapi\SHCreateMemStream"
   else  {
      hShlwapi := DllCall("LoadLibrary", Str, "Shlwapi", Ptr)
      SHCreateMemStream := DllCall("GetProcAddress", Ptr, hShlwapi, UInt, 12, Ptr)
      DllCall("FreeLibrary", Ptr, hShlwapi)
   }
   pStream := DllCall(SHCreateMemStream, Ptr, &buff, UInt, nSize, Ptr)
   
   DllCall("gdiplus\GdipCreateBitmapFromStream", Ptr, pStream, PtrP, pBitmap)
   ObjRelease(pStream)
   
   DllCall("gdiplus\GdipCreateHBITMAPFromBitmap", "ptr", pBitmap, "ptr*", hBitmap, "uint", 0xffffffff)
   Return pBitmap
}

GdipGetImageDimensions(pBitmap, ByRef Width, ByRef Height)
{
   DllCall("gdiplus\GdipGetImageWidth", "ptr", pBitmap, "uint*", Width)
   DllCall("gdiplus\GdipGetImageHeight", "ptr", pBitmap, "uint*", Height)
}

GdipStartup()
{
   if !DllCall("GetModuleHandle", "str", "gdiplus", "ptr")
      DllCall("LoadLibrary", "str", "gdiplus")
   VarSetCapacity(si, A_PtrSize = 8 ? 24 : 16, 0), si := Chr(1)
   DllCall("gdiplus\GdiplusStartup", "uptr*", pToken, "ptr", &si, "ptr", 0)
   return pToken
}

GdipShutdown(pToken)
{
   DllCall("gdiplus\GdiplusShutdown", "uptr", pToken)
   if hModule := DllCall("GetModuleHandle", "str", "gdiplus", "ptr")
      DllCall("FreeLibrary", "ptr", hModule)
   return 0
}

Здесь переменная с кодом картинки разбита на три части, учитывая, что максимальная длина текста, которую позволяют записывать AHK-скрипты в секцию продолжения равна 16,383 символам. Если переменная считывается непосредственно из файла, разбивать не нужно.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: показать картинку из base64 (без временного файла, GDI+)

teadrinker пишет:

Вряд ли эта функция принадлежит руке коллеги serzh82saratov, уж он-то точно знает, что пойнтеры имеют размерность Ptr, а не UInt.

Ну, не знаю, может он скопировал чужие ошибки, а может ещё что (на самом деле не важно, он же тоже пытался помочь и в его скрипте этот код работал с его примером).

teadrinker пишет:

Если я правильно вас понял, то вот пример (постил уже ранее):

+ открыть спойлер

QFT

SetBatchLines, -1
Hex :=  "AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAB6Vzh+elc453pXOP96Vzj/elc4/3pXOP96Vzj/elc4/3pXOP96Vzj/elc4/3pXOJaFUSEAhVEhAIVRIQCFUSEAfVo754RSI/+FUSH/hVEh/4VRIf+FUSH/hVEh/4VRIf+FUSH/hVEh/4VRIf+AVzL/fVo7e4VRIQCFUSEAhVEhAIBeQP+JVSb/j10w/7qbf/+QXzP/iVUm/4lVJv+PXTD/upt//5BfM/+JVSb/iFYp/4BeP/+AXkAPiVUmAIlVJgCEY0X/jlst/7udgf//////xaqS/45bLf+OWy3/u52B///////FqpL/jlst/45bLf+JXzr/hGNFio5bLQCOWy0AiWlL/5RiNf+ZaT//vp+D/5prQf+UYjX/lGI1/5lpP/++n4P/mmtB/5RiNf+UYjX/k2I2/4poSf+JaUs8lGI1AI5vUv+aaj3/yrCY///////////////////////////////////////t5d3/mmo9/5pqPf+WbET/jm9SpZpqPQCUdVn/oXJH//79/f/Boob/oXJH/6FyR/+hckf/oXJH/6FyR/+hckf/oXJH/6FyR/+hckf/oXJH/5d0Vf+UdVlmmnxg/6d6T//DpIf//v39/+3k3P/h0sP/1sCs/8qvlf+5lXL/rYNb/6d6T/+nek//p3pP/6d6T/+lelL/mnxgz5+CaP+ugln/s4lj///////LrpT/zrSb/9/Nvf/m2cz/7+be///////17+r/x6iM/66CWf+ugln/q4Jc/5+CaM+liW//totj/7qSbP//////upJs/7aLY/+2i2P/totj/7aLY/+2i2P/zK6T//////+2i2P/totj/6mJbP+liW9mq492/76Vbv/Cm3f//////8Kbd/++lW7/vpVu/76Vbv++lW7/vpVu/8ajgf//////vpVu/7eTcf+rj3alvpVuALCVff/Fnnn/yKSB////////////////////////////////////////////4s+9/8Seef+yln3/sJV9PMWeeQC1m4P/zKaC/9OzlP/+/v7/zKaC/8ymgv/MpoL/zKaC/8ymgv/MpoL/zKaC/8ymgv/AoIP/tZuDisymggDMpoIAuaCI///////+/v7/5M25/9Ovjv/Tr47/06+O/9Ovjv/Tr47/06+O/9Ovjv/QrY3/uqCI/7mgiA/Tr44A06+OALykjeTXuZ3/2ruf/9q7n//au5//2ruf/9q7n//au5//2ruf/9q7n//au5//xqyT/7ykjXjau58A2rufANq7nwC/p5B7v6eQ5L+nkP+/p5D/v6eQ/7+nkP+/p5D/v6eQ/7+nkP+/p5D/v6eQ/7+nkJb///8A2rufANq7nwDau58AAA8AAAAHAAAAAwAAAAMAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAMAAAADAAAABwAAAA8AAA=="

pToken := GdipStartup()
pBitmap := GetBitmapFromHex(hex, hBitmap)
GdipGetImageDimensions(pBitmap, Width, Height)

SS_BITMAP := 0xE, STM_SETIMAGE := 0x172, IMAGE_BITMAP := 0
Gui, Margin, 0, 0
Gui, Add, Text, hWndPic w%Width% h%Height% +%SS_BITMAP%
PostMessage, STM_SETIMAGE, IMAGE_BITMAP, hBitmap,, ahk_id %Pic%
Gui, Show

DllCall("gdiplus\GdipDisposeImage", "ptr", pBitmap)
DllCall("DeleteObject", "ptr", hBitmap)
GdipShutdown(pToken)
Return

GuiClose:
GuiEscape:
   ExitApp

Hex2Bin(ByRef buff, hex)
{
   VarSetCapacity(buff, len := StrLen(hex)//2)
   Loop % len
      NumPut("0x" . SubStr(hex, 1 + (A_Index - 1)*2, 2), buff, A_Index - 1, "UChar")
}

GetBitmapFromHex(hex, ByRef hBitmap)
{
   Hex2Bin(buff, hex)
   nSize := StrLen(hex)//2

   pStream := DllCall("Shlwapi\SHCreateMemStream", Ptr, &buff, UInt, nSize, Ptr)
   
   DllCall("gdiplus\GdipCreateBitmapFromStream", Ptr, pStream, PtrP, pBitmap)
   ObjRelease(pStream)
   
   DllCall("gdiplus\GdipCreateHBITMAPFromBitmap", "ptr", pBitmap, "ptr*", hBitmap, "uint", 0xffffffff)
   Return pBitmap
}

GdipGetImageDimensions(pBitmap, ByRef Width, ByRef Height)
{
   DllCall("gdiplus\GdipGetImageWidth", "ptr", pBitmap, "uint*", Width)
   DllCall("gdiplus\GdipGetImageHeight", "ptr", pBitmap, "uint*", Height)
}

GdipStartup()
{
   if !DllCall("GetModuleHandle", "str", "gdiplus", "ptr")
      DllCall("LoadLibrary", "str", "gdiplus")
   VarSetCapacity(si, A_PtrSize = 8 ? 24 : 16, 0), si := Chr(1)
   DllCall("gdiplus\GdiplusStartup", "uptr*", pToken, "ptr", &si, "ptr", 0)
   return pToken
}

GdipShutdown(pToken)
{
   DllCall("gdiplus\GdiplusShutdown", "uptr", pToken)
   if hModule := DllCall("GetModuleHandle", "str", "gdiplus", "ptr")
      DllCall("FreeLibrary", "ptr", hModule)
   return 0
}

Спасибо огромное, это то, что нужно!

teadrinker пишет:

Здесь переменная с кодом картинки разбита на три части, учитывая, что максимальная длина текста, которую позволяют записывать AHK-скрипты в секцию продолжения равна 16,383 символам. Если переменная считывается непосредственно из файла, разбивать не нужно.

Спасибо, не знал или знал, но забыл. Правда, у меня и на 16383 символов ругается, что многовато. Опытным путём проверил, что надо не более 16377 символов.
С анимированным gif, кстати не работает.

В документации по AHK есть ссылка/рекомендация по этому поводу - использовать AniGIF.dll + одноимённую библиотеку.

Но в библиотеке функция заточена опять-таки на работу с файлом:

AniGif_LoadGifFromFile(_agHwnd, _gifFile)
{
; WAGM_LOADGIFFROMFILE EQU WAGM_BASE+0 ;wParam:N/A, lParam:lpFileName
VarSetCapacity(var, StrPut(_gifFile, "cp0") * 2)
StrPut(_gifFile, &var, "cp0")
SendMessage, 2024, 0, &var, , ahk_id %_agHwnd%
}

Не поможете ли и с этим?

4 (изменено: Drugoy, 2015-03-24 22:26:56)

Re: AHK: показать картинку из base64 (без временного файла, GDI+)

Ух, поторопился я вас хвалить! :-)
Вопрос был про картинку закодированную в Base64, а ваш код для картинки в HEX (не путать с НЁХ).

5

Re: AHK: показать картинку из base64 (без временного файла, GDI+)

Ну так не проблема переделать, там просто другой способ кодирования. Но в результате всё равно из строки получается массив байтов в памяти, соответствующий битовой карте изображения. Попозже попробую.
С gif-файлами не разбирался. Знаю, что AHK не поддерживает gif-анимирование, можно лишь последовательно показывать все фреймы из gif, как отдельные картинки.

Правда, у меня и на 16383 символов ругается, что многовато.

Может, знаки переноса строк не учли.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6 (изменено: teadrinker, 2015-03-27 03:17:30)

Re: AHK: показать картинку из base64 (без временного файла, GDI+)

С иконками и с картинками будут разные способы восстановления изображения из кода. В обоих примерах файлы сначала загружаются через URLDownloadToFile, но можно подставить свои.

+ Пример с иконкой

Иконки придётся кодировать немного по-другому, чем в вашем примере выше, так, чтобы информация была в том виде, в котором она находится в ресурсах. В этом случае есть winapi-функция получения хэндла иконки из данных CreateIconFromResourceEx().
Получение кодированной строки:

URLDownloadToFile, https://dl.dropboxusercontent.com/s/kb9xnsifvwktmk6/google.ico, % A_Desktop "\google.ico"
sFile := A_Desktop "\google.ico"

Bytes := GetIconData(sFile, IconData
                                    , 32   ; предпочитаемый размер иконки, если в ico-файле несколько форматов
                                    , 32)  ; предпочитаемая битность иконки, если в ico-файле несколько форматов
StringBASE64 := Trim(CryptBinaryToStringBASE64(&IconData, Bytes), " `n`r")
VarSetCapacity(IconData, 0)

; создаём текст, который можно вставлять скрипт, с учётом ограничения секции продолжения
Content := CreateCorrectVar(StringBASE64)

Run, notepad.exe,,, PID
WinWait, ahk_pid %PID%
ControlSetText, Edit1, % Content
Return

GetIconData(sFile, ByRef IconData, PreferSize, MinBitsPerPixel)
{
   ; Icons — http://msdn.microsoft.com/en-us/library/ms997538.aspx
   IcoFile := FileOpen(sFile, "r")

   IcoFile.Pos := 2, idx := 1, Size := 1024
   if IcoFile.ReadUShort() > 1
      Return IcoFile.Close()
   
   Loop % IcoFile.ReadUShort()
   {
      IcoFile.Pos := 6 + (A_Index - 1)*16
      S := IcoFile.ReadUChar()
      IcoFile.Seek(5, 1), BitCount := IcoFile.ReadUShort()
      if (S >= PreferSize && BitCount >= MinBitsPerPixel && S < Size)
         idx := A_Index, Size := S
   }

   IcoFile.Pos := 6 + (idx - 1)*16 + 8
   VarSetCapacity(IconData, 4 + (Size := IcoFile.ReadUInt()))
   NumPut(Size, IconData, "UInt")
   IcoFile.Pos := 6 + (idx - 1)*16 + 12
   IcoFile.Pos := IcoFile.ReadUInt()
   IcoFile.RawRead(&IconData + 4, Size)
   IcoFile.Close()
   
   Return Size + 4
}

CryptBinaryToStringBASE64(pData, Bytes)
{
   static CRYPT_STRING_BASE64 := 1
   DllCall("Crypt32.dll\CryptBinaryToString", Ptr, pData, UInt, Bytes, UInt, CRYPT_STRING_BASE64, Ptr, 0, UIntP, Chars)
   VarSetCapacity(OutData, Chars * (A_IsUnicode ? 2 : 1))
   DllCall("Crypt32.dll\CryptBinaryToString", Ptr, pData, UInt, Bytes, UInt, CRYPT_STRING_BASE64, Str, OutData, UIntP, Chars)
   Return OutData
}

CreateCorrectVar(string)
{
   Loop
      Content .= "Part" . A_Index . " = `r`n(`r`n" . str := SubStr(string, 16000*(A_Index - 1) + 1, 16000) . "`r`n)`r`n`r`n"
         , tail .= (A_Index = 1 ? "" : " . ") . "Part" . A_Index
   until StrLen(str) < 16000

   if StrLen(string) > 16000   ; с запасом
      Content .= "StringBASE64 := " . tail
   else
      Content := Trim(RegExReplace(Content, "^Part1", "StringBASE64"), " `n`r")
   
   Return Content
}

Восстановление изображения из строки без создания файла:

StringBASE64 =   ; здесь код, полученный из первого скрипта
(
qBAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAABILAAASCwAAAAAAAAAAAAD///8A
////AAAAAAcAAAAWAAAAJgAAAC4AAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAw
AAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAw
AAAAMAAAAC4AAAAlAAAAFgAAAAb///8A////AAAAAAEAAAALHh4eMZK/zZkusNTb
GKbR/xak0f8YqNT/GqjT/xup1f8aqdb/GKjW/xao1v8isNn/idbt//Ly8v/y8vL/
Watk/yZeMP8uazf/Lms3/y5rN/8uaDf/Lmc3/y1lNf8uZzT/LWI0/yxgM9gmUiuT
AwcELQAAAAoAAAABAAAACEFBQTlcyOPRFKjV/xeU0P8ajc//GpDQ/xqQ0f8aktT/
GpLU/xqU1v8alNb/GpXZ/xiV2f8Qi9T/V8rz////////////O3xC/yBQKP8mVy3/
JVcs/yZXLP8lVSz/JVQs/yRUK/8kUyv/KFsv/y5oOP8tZDbJCBMKMgAAAAcAAAAa
hcbZpBSq1/8ajc3/GpHS/xqR0/8ak9P/G5PW/xuU2P8bltj/G5bZ/xuX2P8bl9n/
HJnc/xqZ3P8Wltz/xfn////////k+Of/KV8w/yVWLf8mWC7/J1ku/ydYLv8mVi3/
JlUu/yZVLf8mVCz/JlIs/zJvOv8qXDKZAAAAFxERES0vuN/uGZLP/xuT1P8bk9P/
G5PU/xyW1/8cl9f/HJfX/xyY2P8cmNn/HJrc/xya3P8cmtz/HJ3f/xOV2/9h0fj/
//////////9jomz/IlEp/ylcMP8nWjD/KFow/yhaMP8oWTD/J1kv/ydXLv8nVy7/
K1wx/zNvO+MAAAAoTFhZRB613/8ck9T/HJbW/x2Y1/8dmNb/HZnZ/x2Y1/8dmdr/
HZzc/x2d3v8dnd7/HZze/x2f3v8doOH/Fpne/1DK9P///////////8voz/8mWy7/
KmAy/ypeMv8pXTH/Kl4y/yldMf8pXDH/Klwx/ylbMP8pWzD/N3Y//wgRCTZLWFtI
HrXg/x6X1v8emtj/Hpra/x6b2v8enNr/Hpzc/x+e3v8fnt//H5/f/x+g4f8foOL/
H6Lj/x+i4/8Vm+L/a9b7////////////8//0/y9qOP8pYDT/LGM0/yxjNP8rYDT/
K2A0/ytgNP8rXzP/K180/ypeMv84fEL/DR0PPVZaWkksveX/HpvZ/x+d2/8fndz/
H5/c/x+g3/8goOD/IKHg/yCh4P8gouL/IKPj/yCj4v8hpeX/HqXm/x6m6P/Y////
///////////7//v/NHE9/ytkNP8uZjf/LWY2/y5lNv8tZDb/LWQ2/y1kNf8tZTb/
LWM2/zuARv8OHhA9WlpaSWvW8v8Vltn/IaDb/yGi3v8hot//IaPg/yGj4P8hpOH/
Iafk/yGm5P8ip+X/Iqfk/yGn5f8WouT/gOD///////////////////L/8/8zcD3/
Lmk3/zBrOf8waTn/MGs5/zBoN/8uZzf/L2g4/y5nN/8vZzf/P4hK/w4fED1aWlpJ
9/7+/zqz5v8Wndz/IKPg/yOm4v8jpuL/I6bk/yOo5f8jqeb/JKrn/ySr6f8fqOX/
G6bn/4Dg////////////////////////yObM/y1qNv8ycTz/MnA8/zJwPP8ybjz/
Mm08/zJsO/8xbDv/MWs7/zFsOv9CkE7/DyESPVpaWkn+/v7//////2/V+P8preT/
GaPi/xqk4v8ep+T/Ianm/yOs6P8jrOj/HKjn/yuz7f+u8v//////////////////
//////////9jpG3/LW44/zV1P/81dT//NHQ+/zR0Pv80cj7/NHE+/zRwPf8zcD3/
Mm89/0SUUv8PIhI9VEE1Sf717v////////////H///+o7v//bdj9/0zE8/84uO3/
L7Xs/ymz7P9QyPb/5f//////////////////////////////weDE/zJ4Pv82eUL/
N3lC/zd4Qv83eUL/N3hC/zZ4Qf82dkH/NnZA/zZ0QP82c0D/SJtW/xAjEz1MJhJJ
2npH/96JZv/0vaT///Ll///////////////////////5////8f//////////////
/////////////////////97y4P8+hUn/N31C/zp/Rv85fkb/OX5F/zl9Rf85fEX/
OX1F/zl6RP85ekT/OXpE/zl5RP9KoFn/ESUVPU0sGEnYeUL/xlUr/8VUKP/NXjT/
02xG/9t8V//ji2b/6ZRu///s3//////////////////////////////////R69T/
QopO/zaBRP89hUn/PYRI/z2ESP88g0j/PIJI/zyCR/88gUf/PIFH/zyBR/87fkb/
O4BG/0+nXv8SJxY9TS4ZSdqAR//LYDb/y2A2/8xgNf/MXzL/y10v/8hVJv/bfln/
////////////////////////////////sti4/z+KS/86h0f/QItM/z+JTP8/iUz/
P4hL/z+IS/8+h0v/PodL/z6GSv8+hkr/PoVK/z6FSv89gkn/Uq1i/xMoFj1NLhpJ
3IRK/8tjN//MZDj/zWQ4/89lOP/PZTj/zV0u///cy///////////////////////
/////47Clv82iUX/QI5O/0KPUP9Cjk//QY5P/0GNT/9Bjk//QYxO/0GMTv9Bi07/
QItO/0CKTf9Aik3/QIhN/0CJTf9WsGb/FCkXPU4xG0nciE7/zGc5/81nOf/OaDr/
0Gg6/9BnOP/Taz3///rx//////////////////////+EvI3/NoxF/0WUU/9FlFT/
RZRU/0WUVP9Fk1P/RZJS/0SSUv9EkVL/RJBS/0SQUf9Ej1H/Q49R/0OPUf9DjlD/
Q41Q/1qza/8VKRk9TzIcSd2NT//Pazv/zms6/89oN//OZTT/zmIw/89jLv//7N//
////////////////4/bm/z2UTv9Jmlj/SZtZ/0mZV/9ImFf/SJhX/0iZWP9Il1b/
SJZV/0eWVf9HllX/R5VV/0eUVP9HlFT/R5NU/0aTVP9GklP/XrZv/xYqGT1PNB1J
3pFS/8xlNf/OZzX/2YJV/+GXc//opon/5p9+///i1f/////////////////v/fH/
SZ9Z/0meWf9Ln1v/S59d/0ueW/9KnVv/Sp1b/0qdW/9KnFn/Spxa/0qbWP9Jmlj/
SZlY/0maWP9JmFf/SZhX/0iXV/9huXX/FisaPU81HUnciEP/3pZv//zczP//////
//////////////////////////////////////////+v1rX/PZtP/0uhXf9Nol//
TaJf/02hXv9MoV3/TKBe/0ygXv9Mn1z/TJ9c/0yeW/9Ln1v/S51b/0ueW/9LnFr/
S5xa/2O8ef8XKxw9TzIZSfPUxv/////////////////////////9/+65oP/fkmX/
3YhW/+Oddv/4z7z///////////+z2bn/R6NZ/02lX/9Qp2L/UKZi/1CmYv9QpWD/
T6Vh/0+jYP9PpGH/T6Jf/0+jXv9OoV7/TqJf/06hXv9OoV7/ab97/xgsHD1WS0ZJ
/v7+///////////////////48v/bjV3/02sx/9V1Pf/Xd0D/13Q6/9ZuMf/qqor/
///////////O6dL/T6pe/1KuXf9UrGP/Uqll/1KpZf9SqGT/Uqlk/1GoZP9RqGT/
Uadi/1GnY/9RpmD/UKVg/1ClYP9rw3//GS0dPVpaWkn+/v7/////////////////
35xs/9VxN//ZfUX/2X5G/9l+Rv/bf0b/3IBH/9hvMv/51cX////////////E2Nz/
NIOI/1GqbP9btF//W7Rg/1qzYf9YsWH/VrBi/1avZP9Wr2L/Vq9h/1iwYP9XsF3/
V7Bd/2/Hgf8WKyM9WlpaSf7+/v////////////LMuf/UbzP/2H9H/9qAR//bg0n/
24FI/9yDSf/cg0j/23o9/+irhP////////////////9mZfH/CRbQ/yJIuP8zb6T/
PoSU/0aVh/9Mn33/TKJ2/0ygev9GmH7/QYeH/zd0kv8pV6D/GTbK/wECMD1aWlpJ
/v7+////////////3phj/9h8Qv/agkr/2oRJ/9uESf/chUr/3IVK/92FSv/dgUX/
451l/////////////////+Hh//8CAOL/AADj/wAA4f8AANz/AADW/wIF0v8ECM3/
AgbM/wABy/8AAMz/AADL/wAAyf8AANj/AAAxPVtbW0j+/v7///////3o3f/WeDr/
2oRJ/9uFS//bhUz/24ZL/92GTP/diEz/3YhM/92ERf/koGn/////////////////
/////zAw6P8AAN3/AADd/wAA2/8AANn/AADW/wAA1P8AANH/AADP/wAAy/8AAMn/
AADH/wAA1/8AADE9WlpaRP7+/v//////8s6+/9h4OP/bhkr/3IhN/9yITP/ciUz/
3olM/96JTP/fi03/3oNE/+mxhP//////////////////////VVXs/wAA3v8AAN7/
AADc/wAA2P8AANb/AADU/wAA0f8AAND/AADM/wAAyv8AAMn/AADY/wAAKTkbGxsw
////9v/////qu5//2X09/9yJTP/diUz/3otP/96LT//fjE//4IxP/+CNT//egUD/
8cm2//////////////////////9dXe3/AADe/wAA3v8AANv/AADZ/wAA1/8AANX/
AADT/wAA0f8AAM7/AADM/wAA0f8AANvrAAAAKQAAABnh4eGg/////+e3jP/bgkL/
3YxO/92MTv/ejU//4I1P/9+NT//gj0//4Y9P/9+BPv/849j/////////////////
/////0tL6/8AAOD/AADe/wAA3f8AANr/AADY/wAA1v8AANT/AADS/wAAz/8AAM//
AADh/wAAvJUAAAAXAAAABywsLDT6+vrW8tnB/+CVTf/fjlD/3o5P/9+OT//gj1D/
4Y9R/+GRUf/hjEv/5KBj/////v/////////////////+/v//Gxvn/wAA4f8AAOD/
AADd/wAA2/8AANj/AADX/wAA1f8AANP/AADY/wAA5f8AAN3MAAAdLwAAAAcAAAAB
AAAACywsLDTay8Sg7cFp5fDJiP/wyIf/8MmG//DJhv/wyYv/8cmJ/+/BZP/66eL/
/////////////////////+Pj/f8AAPH/AADx/wAA7/8AAO//AADt/wAA7P8AAOz/
AADr/wAA6v8AAOjjAADImQAAHTAAAAAK////AP///wAAAAABAAAABwAAABgAAAAq
TkIsRIBrS1l9aklbfWpJW31qS1t9aURbfnJjW4SEhFuEhIRbhISEW4SEhFuEhIRb
Ly9/WwAAfVsAAH1bAAB9WwAAfFsAAHxbAAB7WwAAe1sAAH1ZAABFQQAAACkAAAAX
AAAAB////wD///8AwAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAM=
)

Bytes := StringBase64ToData(StringBASE64, IconData)

if !hIcon := CreateIconFromData(&IconData, 32)
{
   MsgBox, Неверный формат файла
   ExitApp
}       
VarSetCapacity(IconData, 0)

Gui, +LastFound -DPIScale
SendMessage, WM_SETICON := 0x80, 0, hIcon   ; иконка в строку заголовка окна

Gui, Add, Pic, % "x80 y40 w32 h32 " . SS_ICON := 0x3
PostMessage, STM_SETIMAGE := 0x172, IMAGE_ICON := 1, hIcon, Static1  ; иконка в контрол Picture
Gui, Show, w192 h112

OnExit, Exit
Return

GuiClose:
GuiEscape:
   ExitApp
   
Exit:
   DllCall("DestroyIcon", Ptr, hIcon)
   ExitApp
   
StringBase64ToData(StringBase64, ByRef OutData)
{
   DllCall("Crypt32.dll\CryptStringToBinary", Ptr, &StringBase64 
      , UInt, StrLen(StringBase64), UInt, CRYPT_STRING_BASE64 := 1, UInt, 0, UIntP, Bytes, UIntP, 0, UIntP, 0)

   VarSetCapacity(OutData, Bytes) 
   DllCall("Crypt32.dll\CryptStringToBinary", Ptr, &StringBase64 
      , UInt, StrLen(StringBase64), UInt, CRYPT_STRING_BASE64, Str, OutData, UIntP, Bytes, UIntP, 0, UIntP, 0)
   Return Bytes
}

CreateIconFromData(pData, Size)
{
   Return DllCall("CreateIconFromResourceEx", Ptr, pData + 4
      , UInt, NumGet(pData + 0, "UInt"), UInt, true, UInt, 0x30000, Int, Size, Int, Size, UInt, 0)
}
+ Пример с картинкой (файлы gif, tiff, jpg, bmp, png)

Получение кодированной строки:

URLDownloadToFile, http://i.imgur.com/QoIAy4U.jpg, %A_Desktop%\test.jpg
sFile := A_Desktop "\test.jpg"

Bytes := GetPictureData(sFile, Data)
StringBASE64 := Trim(CryptBinaryToStringBASE64(&Data, Bytes), " `n`r")
VarSetCapacity(Data, 0)

Content := CreateCorrectVar(StringBASE64)

Run, notepad.exe,,, PID
WinWait, ahk_pid %PID%
ControlSetText, Edit1, % Content
Return

GetPictureData(sFile, ByRef Data)
{
   oFile := FileOpen(sFile, "r")
   oFile.Seek(0)
   oFile.RawRead(Data, len := oFile.Length)
   oFile.Close()
   Return len
}

CryptBinaryToStringBASE64(pData, Bytes)
{
   static CRYPT_STRING_BASE64 := 1
   DllCall("Crypt32.dll\CryptBinaryToString", Ptr, pData, UInt, Bytes, UInt, CRYPT_STRING_BASE64, Ptr, 0, UIntP, Chars)
   VarSetCapacity(OutData, Chars * (A_IsUnicode ? 2 : 1))
   DllCall("Crypt32.dll\CryptBinaryToString", Ptr, pData, UInt, Bytes, UInt, CRYPT_STRING_BASE64, Str, OutData, UIntP, Chars)
   Return OutData
}

CreateCorrectVar(string)
{
   Loop
      Content .= "Part" . A_Index . " = `r`n(`r`n" . str := SubStr(string, 16000*(A_Index - 1) + 1, 16000) . "`r`n)`r`n`r`n"
         , tail .= (A_Index = 1 ? "" : " . ") . "Part" . A_Index
   until StrLen(str) < 16000

   if StrLen(string) > 16000   ; с запасом
      Content .= "StringBASE64 := " . tail
   else
      Content := Trim(RegExReplace(Content, "^Part1", "StringBASE64"), " `n`r")
   
   Return Content
}

Создание изображения из строки:

Part1 = 
(
/9j/4AAQSkZJRgABAQAAAQABAAD/4gxYSUNDX1BST0ZJTEUAAQEAAAxITGlubwIQ
AABtbnRyUkdCIFhZWiAHzgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAA
AAAAAAAAAAAAAQAA9tYAAQAAAADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAA
AGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAACGAAAABRnWFlaAAACLAAA
ABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAAAIh2dWVkAAADTAAA
AIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0ZWNoAAAEMAAA
AAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0AAAAAENv
cHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAA
AAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2
LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZ
WiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAA
JKAAAA+EAAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAA
AAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYt
Mi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5J
RUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcg
Q29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBW
aWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZ
WiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAA
Ao8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAo
AC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCf
AKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEf
ASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJ
AdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKi
AqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOu
A7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTw
BP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZq
BnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgf
CDIIRghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woR
CicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxD
DFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62
DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFt
EYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRq
FIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReu
F9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7
G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8T
Hz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4
I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneier
J9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxu
LKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGC
Mbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbp
NyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTyk
POM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1
QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kd
SWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/d
UCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3
V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5s
Xr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9
ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5r
bsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4
d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/l
gEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokz
iZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLj
k02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3
nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adu
p+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJL
ssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2P
vgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6
ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO
1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM
4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO60
70DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH
/Jj9Kf26/kv+3P9t////7gAOQWRvYmUAZIAAAAAB/9sAQwAMCAgICQgMCQkMEQsK
CxEVDwwMDxUYExMVExMYEQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM
DAwM/9sAQwENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwM
DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AAEQgAgAEAAwEiAAIRAQMRAf/EABoA
AAMBAQEBAAAAAAAAAAAAAAMEBQIGAQD/xAA/EAACAQMCAwQHBQcDBAMAAAABAgMA
ERIEIQUiMRMyQVEUQlJhYnFyBiOBgpIVkaGissHC0dLiFjPw8oOx8f/EABoBAAMB
AQEBAAAAAAAAAAAAAAIDBAEFAAb/xAA6EQABAwMCAwQIAwcFAAAAAAABAAIRAxIh
MUEEIlETMkJhUmJxgYKRkqFyotIjM7HC0fDxBRSywfL/2gAMAwEAAhEDEQA/AImj
kCxAvs7NeNR5miwsJJM5HCgXeQA38e79T+tU+M4yIZDdVUObdLn1bb002KpHGFxU
rkb9WHNzV0hG+qmKeeZZWaVgeawiU7WAPLSCzNJrlYgsqMxbcAnbu7ey1D1OqJYx
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
WhhmfKPtauZh0+viWd5YmCuBiXXw
)

Part2 = 
(
J629nGsan0rUREKpa9lsB4d7wrrZdSrue05X
Bx32O3XresmWIDEWBO5NrUs1gGOaG+9EGm8OnTZcqnBNQrnUTsI1CqACdzsqfprU
XB59Nr4ZQckubMPO1dNJcraRgpNtwK+Romup5h43HS3lUrhM9SqO0lsHRIrApylG
Jd7noL2+LKlNfCUglCiwYA2+R8KrRwRsTgbrc3v5e6tajSxOMGbFLXJ8beG4pTKN
SeYi3ZE2owQOijcNGemG4Xrc++miGFwAGXztVPTaDQkBUF+l97X/AOVYm4ehB7Ny
L9fKwPurp0yAwDoEBqAlR5dfGkyRdWf8AL3A/pqzwsu2TkEx2t4Yi+2VvaakouB6
RdW887B2Byjv3QPiT6qpSyPDE2Jx5Nwtut/aoA52ZJKF7g4QN19LqlQlYQAdj2jA
keK9KO+rjSwZgbWuo3PlUkuskWORUqNwT3rEn+9GzLmQbKOU+O4Hz5q8HpRYjyak
m4FzfoWADXF+VVWhCdYFDHIhiSL7fvNeaeFpAGBNhIxvbck93asyaTVqw5SvU47+
J99YSTlaGjRe+mSSXGFiByn/AFrWogXUpZlzKbchufxoLRugu5YcoNrdTWUkdGZ0
8+vyrJ2KKIMjEJN9PJC99xjup8Kl8e0c0sUZW7u1r79Tf1R7NdXHJFJEUYAyPcN5
D6qBLwsTOrAlQQACVt8PdrwaRBGUZc14IdjGq5X0KYTYvstiEQi9tvGs6rQPqIo1
YWNiGbp71rpDw4ByDzbHfp0P+NfRafTySqtsrbe+9vKiD3zOiWaVK2NVzsOgkijS
RbJibLtjt7Xj+qjLFI8hEaqvgrKfE+1Ia6r9maZ4murcotdjb+FYj4dp0Uq7G6nb
cWFaS4+9Y1rBvov/2Q==
)

StringBASE64 := Part1 . Part2

Bytes := StringBase64ToData(StringBase64, Data)

pToken := GdipStartup()
pBitmap := GetBitmapFromData(&Data, Bytes, hBitmap)
VarSetCapacity(Data, 0)
GdipGetImageDimensions(pBitmap, Width, Height)

SS_BITMAP := 0xE, STM_SETIMAGE := 0x172, IMAGE_BITMAP := 0
Gui, -DPIScale +LastFound
Gui, Margin, 0, 0
Gui, Add, Pic, w%Width% h%Height% +%SS_BITMAP%
PostMessage, STM_SETIMAGE, IMAGE_BITMAP, hBitmap, Static1
Gui, Show

DllCall("gdiplus\GdipDisposeImage", Ptr, pBitmap)
DllCall("DeleteObject", Ptr, hBitmap)
GdipShutdown(pToken)
Return

GuiClose:
GuiEscape:
   ExitApp

StringBase64ToData(StringBase64, ByRef OutData)
{
   static CRYPT_STRING_BASE64 := 1
   
   DllCall("Crypt32.dll\CryptStringToBinary", Ptr, &StringBase64 
      , UInt, StrLen(StringBase64), UInt, CRYPT_STRING_BASE64, UInt, 0, UIntP, Bytes, UIntP, 0, UIntP, 0)

   VarSetCapacity(OutData, Bytes) 
   DllCall("Crypt32.dll\CryptStringToBinary", Ptr, &StringBase64 
      , UInt, StrLen(StringBase64), UInt, CRYPT_STRING_BASE64, Str, OutData, UIntP, Bytes, UIntP, 0, UIntP, 0)
   Return Bytes
}

GetBitmapFromData(pData, nSize, ByRef hBitmap)
{
   if A_OSVersion not in WIN_XP,WIN_2003,WIN_2000
      SHCreateMemStream := "Shlwapi\SHCreateMemStream"
   else  {
      hShlwapi := DllCall("LoadLibrary", Str, "Shlwapi", Ptr)
      SHCreateMemStream := DllCall("GetProcAddress", Ptr, hShlwapi, UInt, 12, Ptr)
      DllCall("FreeLibrary", Ptr, hShlwapi)
   }
   pStream := DllCall(SHCreateMemStream, Ptr, pData, UInt, nSize, Ptr)
   
   DllCall("gdiplus\GdipCreateBitmapFromStream", Ptr, pStream, PtrP, pBitmap)
   ObjRelease(pStream)
   
   DllCall("gdiplus\GdipCreateHBITMAPFromBitmap", "ptr", pBitmap, "ptr*", hBitmap, "uint", 0xffffffff)
   Return pBitmap
}

GdipGetImageDimensions(pBitmap, ByRef Width, ByRef Height)
{
   DllCall("gdiplus\GdipGetImageWidth", "ptr", pBitmap, "uint*", Width)
   DllCall("gdiplus\GdipGetImageHeight", "ptr", pBitmap, "uint*", Height)
}

GdipStartup()
{
   if !DllCall("GetModuleHandle", "str", "gdiplus", "ptr")
      DllCall("LoadLibrary", "str", "gdiplus")
   VarSetCapacity(si, A_PtrSize = 8 ? 24 : 16, 0), si := Chr(1)
   DllCall("gdiplus\GdiplusStartup", "uptr*", pToken, "ptr", &si, "ptr", 0)
   return pToken
}

GdipShutdown(pToken)
{
   DllCall("gdiplus\GdiplusShutdown", "uptr", pToken)
   if hModule := DllCall("GetModuleHandle", "str", "gdiplus", "ptr")
      DllCall("FreeLibrary", "ptr", hModule)
   return 0
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7 (изменено: k2, 2015-03-27 02:13:00)

Re: AHK: показать картинку из base64 (без временного файла, GDI+)

У меня последний скрипт (вывод jpg) выводит маленькую вертикальную палочку. Это правый верхний угол окна (у крестика), а окно, если его растянуть - пустое. Из поста n.2 тоже. Может, что-то с gdiplus.dll?

8

Re: AHK: показать картинку из base64 (без временного файла, GDI+)

Какая версия AHK у вас?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9 (изменено: k2, 2015-03-27 01:26:46)

Re: AHK: показать картинку из base64 (без временного файла, GDI+)

версия AHK: 1.1.20.01 Unicode 32-bit, WinXP SP2

10

Re: AHK: показать картинку из base64 (без временного файла, GDI+)

Попробую на XP.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11

Re: AHK: показать картинку из base64 (без временного файла, GDI+)

У меня на XP тоже не работает, точно не знаю, в чём причина. Возможно, этот вариант кодирования только для 64-битных систем. Попозже попробую разобраться.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12

Re: AHK: показать картинку из base64 (без временного файла, GDI+)

Хотя, вариант с иконкой работает на XP нормально.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13

Re: AHK: показать картинку из base64 (без временного файла, GDI+)

Разобрался. В системах ранее Windows Vista не задекларировано название функции "SHCreateMemStream", её нужно вызывать из библиотеки Shlwapi по порядковому номеру 12. Вариант с поддержкой XP:

Part1 =
(
/9j/4AAQSkZJRgABAQAAAQABAAD/4gxYSUNDX1BST0ZJTEUAAQEAAAxITGlubwIQ
AABtbnRyUkdCIFhZWiAHzgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAA
AAAAAAAAAAAAAQAA9tYAAQAAAADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAA
AGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAACGAAAABRnWFlaAAACLAAA
ABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAAAIh2dWVkAAADTAAA
AIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0ZWNoAAAEMAAA
AAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0AAAAAENv
cHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAA
AAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2
LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZ
WiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAA
JKAAAA+EAAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAA
AAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYt
Mi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5J
RUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcg
Q29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBW
aWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZ
WiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAA
Ao8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAo
AC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCf
AKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEf
ASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJ
AdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKi
AqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOu
A7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTw
BP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZq
BnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgf
CDIIRghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woR
CicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxD
DFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62
DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFt
EYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRq
FIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReu
F9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7
G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8T
Hz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4
I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneier
J9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxu
LKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGC
Mbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbp
NyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTyk
POM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1
QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kd
SWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/d
UCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3
V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5s
Xr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9
ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5r
bsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4
d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/l
gEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokz
iZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLj
k02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3
nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adu
p+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJL
ssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2P
vgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6
ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO
1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM
4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO60
70DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH
/Jj9Kf26/kv+3P9t////7gAOQWRvYmUAZIAAAAAB/9sAQwAMCAgICQgMCQkMEQsK
CxEVDwwMDxUYExMVExMYEQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM
DAwM/9sAQwENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwM
DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AAEQgAgAEAAwEiAAIRAQMRAf/EABoA
AAMBAQEBAAAAAAAAAAAAAAMEBQIGAQD/xAA/EAACAQMCAwQHBQcDBAMAAAABAgMA
ERIEIQUiMRMyQVEUQlJhYnFyBiOBgpIVkaGissHC0dLiFjPw8oOx8f/EABoBAAMB
AQEBAAAAAAAAAAAAAAIDBAEFAAb/xAA6EQABAwMCAwQIAwcFAAAAAAABAAIRAxIh
MUEEIlETMkJhUmJxgYKRkqFyotIjM7HC0fDxBRSywfL/2gAMAwEAAhEDEQA/AImj
kCxAvs7NeNR5miwsJJM5HCgXeQA38e79T+tU+M4yIZDdVUObdLn1bb002KpHGFxU
rkb9WHNzV0hG+qmKeeZZWaVgeawiU7WAPLSCzNJrlYgsqMxbcAnbu7ey1D1OqJYx
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
WhhmfKPtauZh0+viWd5YmCuBiXXw
)

Part2 =
(
J629nGsan0rUREKpa9lsB4d7wrrZdSrue05X
Bx32O3XresmWIDEWBO5NrUs1gGOaG+9EGm8OnTZcqnBNQrnUTsI1CqACdzsqfprU
XB59Nr4ZQckubMPO1dNJcraRgpNtwK+Romup5h43HS3lUrhM9SqO0lsHRIrApylG
Jd7noL2+LKlNfCUglCiwYA2+R8KrRwRsTgbrc3v5e6tajSxOMGbFLXJ8beG4pTKN
SeYi3ZE2owQOijcNGemG4Xrc++miGFwAGXztVPTaDQkBUF+l97X/AOVYm4ehB7Ny
L9fKwPurp0yAwDoEBqAlR5dfGkyRdWf8AL3A/pqzwsu2TkEx2t4Yi+2VvaakouB6
RdW887B2Byjv3QPiT6qpSyPDE2Jx5Nwtut/aoA52ZJKF7g4QN19LqlQlYQAdj2jA
keK9KO+rjSwZgbWuo3PlUkuskWORUqNwT3rEn+9GzLmQbKOU+O4Hz5q8HpRYjyak
m4FzfoWADXF+VVWhCdYFDHIhiSL7fvNeaeFpAGBNhIxvbck93asyaTVqw5SvU47+
J99YSTlaGjRe+mSSXGFiByn/AFrWogXUpZlzKbchufxoLRugu5YcoNrdTWUkdGZ0
8+vyrJ2KKIMjEJN9PJC99xjup8Kl8e0c0sUZW7u1r79Tf1R7NdXHJFJEUYAyPcN5
D6qBLwsTOrAlQQACVt8PdrwaRBGUZc14IdjGq5X0KYTYvstiEQi9tvGs6rQPqIo1
YWNiGbp71rpDw4ByDzbHfp0P+NfRafTySqtsrbe+9vKiD3zOiWaVK2NVzsOgkijS
RbJibLtjt7Xj+qjLFI8hEaqvgrKfE+1Ia6r9maZ4murcotdjb+FYj4dp0Uq7G6nb
cWFaS4+9Y1rBvov/2Q==
)

StringBASE64 := Part1 . Part2

Bytes := StringBase64ToData(StringBase64, Data)

pToken := GdipStartup()
pBitmap := GetBitmapFromData(&Data, Bytes, hBitmap)
VarSetCapacity(Data, 0)
GdipGetImageDimensions(pBitmap, Width, Height)

SS_BITMAP := 0xE, STM_SETIMAGE := 0x172, IMAGE_BITMAP := 0
Gui, -DPIScale +LastFound
Gui, Margin, 0, 0
Gui, Add, Pic, w%Width% h%Height% +%SS_BITMAP%
PostMessage, STM_SETIMAGE, IMAGE_BITMAP, hBitmap, Static1
Gui, Show

DllCall("gdiplus\GdipDisposeImage", Ptr, pBitmap)
DllCall("DeleteObject", Ptr, hBitmap)
GdipShutdown(pToken)
Return

GuiClose:
GuiEscape:
   ExitApp

StringBase64ToData(StringBase64, ByRef OutData)
{
   static CRYPT_STRING_BASE64 := 1

   DllCall("Crypt32.dll\CryptStringToBinary", Ptr, &StringBase64
      , UInt, StrLen(StringBase64), UInt, CRYPT_STRING_BASE64, UInt, 0, UIntP, Bytes, UIntP, 0, UIntP, 0)

   VarSetCapacity(OutData, Bytes)
   DllCall("Crypt32.dll\CryptStringToBinary", Ptr, &StringBase64
      , UInt, StrLen(StringBase64), UInt, CRYPT_STRING_BASE64, Str, OutData, UIntP, Bytes, UIntP, 0, UIntP, 0)
   Return Bytes
}

GetBitmapFromData(pData, nSize, ByRef hBitmap)
{
   if A_OSVersion not in WIN_XP,WIN_2003,WIN_2000
      SHCreateMemStream := "Shlwapi\SHCreateMemStream"
   else  {
      hShlwapi := DllCall("LoadLibrary", Str, "Shlwapi", Ptr)
      SHCreateMemStream := DllCall("GetProcAddress", Ptr, hShlwapi, UInt, 12, Ptr)
      DllCall("FreeLibrary", Ptr, hShlwapi)
   }
   pStream := DllCall(SHCreateMemStream, Ptr, pData, UInt, nSize, Ptr)

   DllCall("gdiplus\GdipCreateBitmapFromStream", Ptr, pStream, PtrP, pBitmap)
   ObjRelease(pStream)

   DllCall("gdiplus\GdipCreateHBITMAPFromBitmap", "ptr", pBitmap, "ptr*", hBitmap, "uint", 0xffffffff)
   Return pBitmap
}

GdipGetImageDimensions(pBitmap, ByRef Width, ByRef Height)
{
   DllCall("gdiplus\GdipGetImageWidth", "ptr", pBitmap, "uint*", Width)
   DllCall("gdiplus\GdipGetImageHeight", "ptr", pBitmap, "uint*", Height)
}

GdipStartup()
{
   if !DllCall("GetModuleHandle", "str", "gdiplus", "ptr")
      DllCall("LoadLibrary", "str", "gdiplus")
   VarSetCapacity(si, A_PtrSize = 8 ? 24 : 16, 0), si := Chr(1)
   DllCall("gdiplus\GdiplusStartup", "uptr*", pToken, "ptr", &si, "ptr", 0)
   return pToken
}

GdipShutdown(pToken)
{
   DllCall("gdiplus\GdiplusShutdown", "uptr", pToken)
   if hModule := DllCall("GetModuleHandle", "str", "gdiplus", "ptr")
      DllCall("FreeLibrary", "ptr", hModule)
   return 0
}

Отредактировал посты выше.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

14

Re: AHK: показать картинку из base64 (без временного файла, GDI+)

Последний - нормально, а из n.2 -  не работает.

15

Re: AHK: показать картинку из base64 (без временного файла, GDI+)

Там ошибка была, исправил.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

16

Re: AHK: показать картинку из base64 (без временного файла, GDI+)

Drugoy пишет:

Правда, у меня и на 16383 символов ругается, что многовато. Опытным путём проверил, что надо не более 16377 символов.

Выяснил, почему строка вида

Hex = 
(
FFD8FFE10EF64578696600004D4D002A00000008000C01000003000000010313000001010003000000010313000001020003000000030000009E010600030000000100020000011200030000000100010000011500030000000100030000011A000500000001000000A4011B000500000001000000AC012800030000000100020000013100020000001C000000B40132000200000014000000D08769000400000001000000E40000011C000800080008001E848000002710001E84800000271041646F62652050686F746F73686F70204353352057696E646F777300323031343A30353A31312032303A34363A3439000004900000070000000430323231A001000300000001FFFF0000A00200040000000100000064A003000400000001000000640000000000000006010300030000000100060000011A0005000000010000016A011B0005000000010000017201280003000000010002000002010004000000010000017A020200040000000100000D740000000000000048000000010000004800000001FFD8FFED000C41646F62655F434D0001FFEE000E41646F626500648000000001FFDB0084000C08080809080C09090C110B0A0B11150F0C0C0F1518131315131318110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C010D0B0B0D0E0D100E0E10140E0E0E14140E0E0E0E14110C0C0C0C0C11110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC00011080064006403012200021101031101FFDD00040007FFC4013F0000010501010101010100000000000000030001020405060708090A0B0100010501010101010100000000000000010002030405060708090A0B1000010401030204020507060805030C33010002110304211231054151611322718132061491A1B14223241552C16233347282D14307259253F0E1F163733516A2B283264493546445C2A3743617D255E265F2B384C3D375E3F3462794A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F637475767778797A7B7C7D7E7F711000202010204040304050607070605350100021103213112044151617122130532819114A1B14223C152D1F0332462E1728292435315637334F1250616A2B283072635C2D2449354A317644555367465E2F2B384C3D375E3F34694A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F62737475767778797A7B7C7FFDA000C03010002110311003F005D2856EE9ED9682E976A403DFF00F522C6CD8FB5DF0368F51D03C352B5BA3F50C2CA2FC6C263D82B2092F8D7739A3C4FEEACACD0E3977388E6C719F892A9F331AC38C6F5A1AF276BE17332E7B9B26E227EB8C67BF0CA7C43FE931C576337331CE5C7D9C3C1B641236FF5423FD60B3A4BEDA7F6586066D3EA6C05BEE9D376EFE4ACFBB808454FC9E20610C9C52D38870DFA0FF7A2D8E707EBC9EC026A7E89F8A9A0D5B89DA0900F8223770796932009D557E6F1119272E21B71F0EB7C3F2B6F96CB78E028EFC17FD6F99924B73EAEF47C2EA62F1956BEAF4B66C153438B8BB77EF7F556766D35D1997D15CB99558E634B84121A76FB959E5FE113CE018E5802631C86244BD2320E28B97CDFFC63C3CB4E709E1C92E09CB17144C3D52C67865FA48B104E5D23C6C6FE50A9E488EB7903BFAD7CFF009CE57B1CC65527C1EDFF00AA0A9E7003EB06481FE9AFFF00AA2ABF31CB4B979E4C32224615AC76F5438D971F3B0E73EE7CC422611C8655197CDE8CBEDFE8FF0075224921D7918F6BDCCAEC6BDCDFA4D0751D954A3F63B06401009009D877F2489274904BFFD026074EC4C1739D8ECDAEB60BC924FD1DEEFCE43EB608C164FEF8FC8E575EE871F6F8F047F2D54EAF0EC30C71D8038193AEBAFEECB937357B53034D0F82B90C84F3B86533291E38EBEA9C9E6AEE022F4DB716BBEC39403AB7517B1B237458EAAC650EFEB36ED9EE4F6D3498DD7B5BF10EFF00C8A87D9F1FFEE4B3FCD7FF00E413B93FE6220FF5B6FEF3BDCE648CB24C7AC5803E4983F2FF00758F4BC470E836DD92D9C9ADFB438BA4C123CFF75C9A9E4AD1A2BA8746C968B5AEF783BC0303E8788DCA9534D727F4CCFB9DFF009043991FA8C83CB7FF000583E1D9447348133908CC81E99CBD3EDC7FAA9AB7BD801638B4F88247E4573A4B70ECCD1F6E737D1DAE2E2F24027B7B9566D4CDA3F4CCFF00A5FF00904BD367FA567FD2FF00C8ADBE5C09F238F1F14A0658630E380971C7D1F3424F25F10C95F12E632509C467C92E19FCA7F59B4A2D9EA5F63AFAA0385B7D069616ED3227DBBB5599D574FACD96383EB5DA7C5D2AC7A6DDEDFD2363C7DDFF009140EA403BEB2E56E76D9BEC9719D353FBAB9FE7E1C39F2C388CF8638E1C73F9E5C387878A7C4F4FF0DC825CAF233E1E1F5E6918C47A63C5CCF1543F7BFC05C72A96174D1897DB70B37FABDA2235DDE2B4FD0A7FD3B3EE7FFE41234D007F3ED3E41AEFFC8AA03880201152DF58BBB29619CA139466658C9303EDE6F4F16FFA281247F471FF00EE437FCD77FE4524384F87F8D164F7A3DA7FF85E5FFBC7FFD1B65AC93034D48FFA70AA66E562DD38B45EC193BF6ED74F2396FD172B8276813C8FCA0FB7FE92A0DE875373C660B9C5DEA1B3610235331B93A510411DFB34E19278E719C044989BF58E28FF008AE2DD957B481ED275E5AD3F95A8432EC1F9B59F8D6DFF00C8A59421F1E04A0A1CA0BC11BD7E6DFF00BCF55CCE2C7EECAA111B6C3FAAEB62DA1FD2F2AE755592C70F686C34FD1E5AD8541B955833F6766BFBA5C3FEFC8F8907A7E50718E23E202AB4D1658E10C73993048048FBC296308CC989028C80D7E56862E1C72E6243887B72E2F4194655ED465E9E12DDAECC7730135113AE8FFEF6B94BF553DAC69F8B4FF06A36474BBF13071B2DE5BE96503E900497003F7F45516E60C7118E318C8FA0087A652E1E287A255C4F23CD4CCB3E599040C929648F18F5F0643C70E2FEB3278A24439C35EED1FF009240EA801FAC9987806E7FE24A23B80975B11F58F33CEE3FC0FF0015CD7C52321CD67241A2615297E9FEADEBBE1462794E404660C819F14018FEAB8B3F6FEB7F5D42B61FF08D1F1DDFF914E71DDD9EC3FDA03FEA8B546BADF63C31825CEE0262D2D7169D083047C16669BF0BD1D4B8B8465B9017C321191E1EF51F6D97A1673023C6447E549460A487A7B1FB7FB1359BF7A1FE24BFF563FFD2BE47BC88D408E79236B5381100FDFF001433635A37B9C19C7B9C606AE9D77152658CB41D8F6D81A4365A41D7E4A469F8BC8E6FF3C7FACEFCAABAECEFAAA753600C6C961321A3F75C7F82CEE9BF5568CEC0A728E43D86D125A1A081A96F8F928C64C7CB6288C92D2C8BAFDEE29BD063E7A3CC994F8782B863BF17E8FF00E82E761541FD2B2DE4EAD3A0F92D8FAB6437A53C3DDB03AC7092606A1AB32860C7C3EA34CC863DCC07898F62BBD2B13EDBD18D1BF645B3313C34259E309E29194B823C702655C540F5E162C59251CD96318F171CCFE186324CEE8373DAD6BB2CB98C10C041200FE4FBD64E4D3F67C8B299DDE998DD112BADA99E9D4CAE67634367E02160753E9F94722FC90D0699DDBA471F09567E15F13C9973CE1CC668F057EAF88431714F8BA7CBEA9399F17F8562C58233E5B0CB8F8BF59C27265E1C7C32DF8B8BD2E627EBBFF8A3CCF3B67F06264DD6C877D61C970EEF1FF52C52FC7FF9BC5E73FCA2C7FF0016FF00DD12F3C7FF004DB1D32B7BB2D8E6B4B9AC92E31A090EE56C66744AABC5B728B06EDA5F21CEE4899FDD59FD15E1A6E9EFB63FE92D2CBCDB5D8D656492DD8E0070385878E04E3891C3564CB885FF008AED7C479B31F88CA22538188C78E3EDC8C38BFCA7EB3FF0C79AD524B549557A57FFD3AFF595C5BD25F3A12FA87DDEE50FAA7071F21A34FD2FF00ABFD67C7E8D574EADD85926DC8758DDF59BCDA76ED7735EE2DF6B957FAB59B90CEA4315A47A3635D6384027706E8772AF8F30C99233008FD1D592780C3969C2C1D78DEA2D8353FF00E2DDFF0052F567EAE69D1717FAA7FEA9C875D3EB3BD1FA21E08DDCF62AEF4EC3FB0E1558BBFD4F4811BE22649771AF8A8FE25923C11C77EBE213AFEAD4A29F87822133DE42BE8F2991506B3AB348D5973C8F995A1F56BFE4F70FE5FF00DF5AADF57C1A9E1F4D01B55996097BFF0079DFBCF51E9581660639A9EF0F24CCB66388EEA497318E7C9C85D4E7C1C313D7825C326CF2F194B983203D31C8788F6BC01BAB9FC2C0CAC5C3CF764B366FAC6DD4198DC4FD125740ABF50FE8391FF16EFC8AA72C6B3E2FF690FF00A6DFE624472D9E3FBD8E5FF44BC99E10FAAC9EB971EDBFFEFAC443C21F52FF00962DFEB4FF00D1AD745F1EFE6B179CBFE8BCCFFC5BFF0074CBCF1FFD3753A209F5C7937FEFCB42E04E35DA7E63BF21547A2D76816590456E801DD8C6E957F305A71AC15EAEDA4011CC88591847EA47916FFC5643FD273208A12C7FF3630E279A494FD2B3D4F4B69F52636C6B292A147B787D5EBBDC87EF0DB8F7FD0FDFFEE7F59FFFD4E1AF8F51C477D56B7D5DFF00972B1E353FFEA1645A0FB4F8B41FC0233245F5B8123E8EA34EE15481A313D9BD923C509476E214FA5E26B92DF2064FC9682CEC420640F2933E508D87D5BA76758EAF12E16BD837380044098FCE0D55FE2209CA08068405FF008D26B725288C744806523C209D65A476619E01C9A3C44FE54E9B3DD1978EDF10EFC13A8CFC98FF00BA7FE949D0E4B7CDFED3FF0051C14ABF50FE8391FF0016EFC8AC285D536EA9F53A435E0B4C73051C3211CB091DA328C8F9464D8CD132C5388DE5194479CA2F1C543AA47EDBB63B6DFC58C5A3D5B02AC27D6DA8B9C1ED24EE8EC7C80543AB376F5BB879547EF635741F18CD0CDCAE0CB8EF82667C37A7F55E7BE05827839EC98B2571C0E3E2AD779713B9D2C39D815806012E0E3E527856AD8635AD1303C7C954E9449C0680620BBDDF39472D05FBB76E0443815431FF00371FEE847C43FDD9CC7FB59FFD372BFEF676EBF4E67E52925B5BFB6767E6EE88F2DA92ADFF00AB9DDB3FFC6C7FFFD5E1DFF419FD51F914ABE6AFECCFDEB01254874F3740BED589FD206EFDD77E459BF55FF61FDAEEFD9DF68F5BD3F7FAD11B7737E8ECFCEDCBC9D2439DF9A7F37C91DBE5F9A7F339BCBEF8BE5F9E7F37CFF2C3F9B7DCAEFE74A82F1049531B0F27A187CA3C83EDE92F104915CFA97D63FE769FEABBF2AC8EAF3FB77227FE0E3E1B1B0B84496CF31FF6B394FF00AA7FD271B93FFB73CC7F7B0FE517D57A3CFD87CF73A3F0568EE8311BBBF8AF2049458BF9B8F9069FC47FDD9CC7FB49FF00D27D1FF49FB63B4CFF00DF525E7092ADFF00AB9DBFFE65BFFFD9FFED15B850686F746F73686F7020332E30003842494D040400000000000F1C015A00031B25471C02000002A800003842494D042500000000001032C4B085E11CA1FA2154120320C140AD3842494D043A000000000093000000100000000100000000000B7072696E744F75747075740000000500000000436C7253656E756D00000000436C7253000000005247424300000000496E7465656E756D00000000496E746500000000436C726D000000004D70426C626F6F6C010000000F7072696E745369787465656E426974626F6F6C000000000B7072696E7465724E616D6554455854000000010000003842494D043B0000000001B200000010000000010000000000127072696E744F75747075744F7074696F6E7300000012000000004370746E626F6F6C0000000000436C6272626F6F6C00000000005267734D626F6F6C000000000043726E43626F6F6C0000000000436E7443626F6F6C00000000004C626C73626F6F6C00000000004E677476626F6F6C0000000000456D6C44626F6F6C0000000000496E7472626F6F6C000000000042636B674F626A630000000100000000000052474243000000030000000052642020646F7562406FE000000000000000000047726E20646F7562406FE0000000000000000000426C2020646F7562406FE000000000000000000042726454556E744623526C74000000000000000000000000426C6420556E744623526C7400000000000000000000000052736C74556E74462350786C40690000000000000000000A766563746F7244617461626F6F6C010000000050675073656E756D00000000506750730000000050675043000000004C656674556E744623526C74000000000000000000000000546F7020556E744623526C7400000000000000000000000053636C20556E74462350726340590000000000003842494D03ED00000000001000C800000001000200C80000000100023842494D042600000000000E000000000000000000003F8000003842494D040D0000000000040000001E3842494D04190000000000040000001E3842494D03F3000000000009000000000000000001003842494D040A00000000000100003842494D271000000000000A000100000000000000023842494D03F5000000000048002F66660001006C66660006000000000001002F6666000100A1999A0006000000000001003200000001005A00000006000000000001003500000001002D000000060000000000013842494D03F80000000000700000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800003842494D0408000000000010000000010000024000000240000000003842494D041E000000000004000000003842494D041A00000000033F000000060000000000000000000000640000006400000005004B006F006D005F00390000000100000000000000000000000000000000000000010000000000000000000000640000006400000000000000000000000000000000010000000000000000000000000000000000000010000000010000000000006E756C6C0000000200000006626F756E64734F626A6300000001000000000000526374310000000400000000546F70206C6F6E6700000000000000004C6566746C6F6E67000000000000000042746F6D6C6F6E670000006400000000526768746C6F6E670000006400000006736C69636573566C4C73000000014F626A6300000001000000000005736C6963650000001200000007736C69636549446C6F6E67000000000000000767726F757049446C6F6E6700000000000000066F726967696E656E756D0000000C45536C6963654F726967696E0000000D6175746F47656E6572617465640000000054797065656E756D0000000A45536C6963655479706500000000496D672000000006626F756E64734F626A6300000001000000000000526374310000000400000000546F70206C6F6E6700000000000000004C6566746C6F6E67000000000000000042746F6D6C6F6E670000006400000000526768746C6F6E67000000640000000375726C54455854000000010000000000006E756C6C54455854000000010000000000004D7367655445585400000001000000000006616C74546167544558540000000100000000000E63656C6C54657874497348544D4C626F6F6C010000000863656C6C546578745445585400000001000000000009686F727A416C69676E656E756D0000000F45536C696365486F727A416C69676E0000000764656661756C740000000976657274416C69676E656E756D0000000F45536C69636556657274416C69676E0000000764656661756C740000000B6267436F6C6F7254797065656E756D0000001145536C6963654247436F6C6F7254797065000000004E6F6E6500000009746F704F75747365746C6F6E67000000000000000A6C6566744F75747365746C6F6E67000000000000000C626F74746F6D4F75747365746C6F6E67000000000000000B72696768744F75747365746C6F6E6700000000003842494D042800000000000C000000023FF00000000000003842494D0414000000000004000000013842494D040C000000000D900000000100000064000000640000012C0000753000000D7400180001FFD8FFED000C41646F62655F434D0001FFEE000E41646F626500648000000001FFDB0084000C08080809080C09090C110B0A0B11150F0C0C0F1518131315131318110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C010D0B0B0D0E0D100E0E10140E0E0E14140E0E0E0E14110C0C0C0C0C11110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC00011080064006403012200021101031101FFDD00040007FFC4013F0000010501010101010100000000000000030001020405060708090A0B0100010501010101010100000000000000010002030405060708090A0B1000010401030204020507060805030C33010002110304211231054151611322718132061491A1B14223241552C16233347282D14307259253F0E1F163733516A2B283264493546445C2A3743617D255E265F2B384C3D375E3F3462794A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F637475767778797A7B7C7D7E7F711000202010204040304050607070605350100021103213112044151617122130532819114A1B14223C152D1F0332462E1728292435315637334F1250616A2B283072635C2D2449354A317644555367465E2F2B384C3D375E3F34694A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F62737475767778797A7B7C7FFDA000C03010002110311003F005D2856EE9ED9682E976A403DFF00F522C6CD8FB5DF0368F51D03C352B5BA3F50C2CA2FC6C263D82B2092F8D7739A3C4FEEACACD0E3977388E6C719F892A9F331AC38C6F5A1AF276BE17332E7B9B26E227EB8C67BF0CA7C43FE931C576337331CE5C7D9C3C1B641236FF5423FD60B3A4BEDA7F6586066D3EA6C05BEE9D376EFE4ACFBB808454FC9E20610C9C52D38870DFA0FF7A2D8E707EBC9EC026A7E89F8A9A0D5B89DA0900F8223770796932009D557E6F1119272E21B71F0EB7C3F2B6F96CB78E028EFC17FD6F99924B73EAEF47C2EA62F1956BEAF4B66C153438B8BB77EF7F556766D35D1997D15CB99558E634B84121A76FB959E5FE113CE018E5802631C86244BD2320E28B97CDFFC63C3CB4E709E1C92E09CB17144C3D52C67865FA48B104E5D23C6C6FE50A9E488EB7903BFAD7CFF009CE57B1CC65527C1EDFF00AA0A9E7003EB06481FE9AFFF00AA2ABF31CB4B979E4C32224615AC76F5438D971F3B0E73EE7CC422611C8655197CDE8CBEDFE8FF0075224921D7918F6BDCCAEC6BDCDFA4D0751D954A3F63B06401009009D877F2489274904BFFD026074EC4C1739D8ECDAEB60BC924FD1DEEFCE43EB608C164FEF8FC8E575EE871F6F8F047F2D54EAF0EC30C71D8038193AEBAFEECB937357B53034D0F82B90C84F3B86533291E38EBEA9C9E6AEE022F4DB716BBEC39403AB7517B1B237458EAAC650EFEB36ED9EE4F6D3498DD7B5BF10EFF00C8A87D9F1FFEE4B3FCD7FF00E413B93FE6220FF5B6FEF3BDCE648CB24C7AC5803E4983F2FF00758F4BC470E836DD92D9C9ADFB438BA4C123CFF75C9A9E4AD1A2BA8746C968B5AEF783BC0303E8788DCA9534D727F4CCFB9DFF009043991FA8C83CB7FF000583E1D9447348133908CC81E99CBD3EDC7FAA9AB7BD801638B4F88247E4573A4B70ECCD1F6E737D1DAE2E2F24027B7B9566D4CDA3F4CCFF00A5FF00904BD367FA567FD2FF00C8ADBE5C09F238F1F14A0658630E380971C7D1F3424F25F10C95F12E632509C467C92E19FCA7F59B4A2D9EA5F63AFAA0385B7D069616ED3227DBBB5599D574FACD96383EB5DA7C5D2AC7A6DDEDFD2363C7DDFF009140EA403BEB2E56E76D9BEC9719D353FBAB9FE7E1C39F2C388CF8638E1C73F9E5C387878A7C4F4FF0DC825CAF233E1E1F5E6918C47A63C5CCF1543F7BFC05C72A96174D1897DB70B37FABDA2235DDE2B4FD0A7FD3B3EE7FFE41234D007F3ED3E41AEFFC8AA03880201152DF58BBB29619CA139466658C9303EDE6F4F16FFA281247F471FF00EE437FCD77FE4524384F87F8D164F7A3DA7FF85E5FFBC7FFD1B65AC93034D48FFA70AA66E562DD38B45EC193BF6ED74F2396FD172B8276813C8FCA0FB7FE92A0DE875373C660B9C5DEA1B3610235331B93A510411DFB34E19278E719C044989BF58E28FF008AE2DD957B481ED275E5AD3F95A8432EC1F9B59F8D6DFF00C8A59421F1E04A0A1CA0BC11BD7E6DFF00BCF55CCE2C7EECAA111B6C3FAAEB62DA1FD2F2AE755592C70F686C34FD1E5AD8541B955833F6766BFBA5C3FEFC8F8907A7E50718E23E202AB4D1658E10C73993048048FBC296308CC989028C80D7E56862E1C72E6243887B72E2F4194655ED465E9E12DDAECC7730135113AE8FFEF6B94BF553DAC69F8B4FF06A36474BBF13071B2DE5BE96503E900497003F7F45516E60C7118E318C8FA0087A652E1E287A255C4F23CD4CCB3E599040C929648F18F5F0643C70E2FEB3278A24439C35EED1FF009240EA801FAC9987806E7FE24A23B80975B11F58F33CEE3FC0FF0015CD7C52321CD67241A2615297E9FEADEBBE1462794E404660C819F14018FEAB8B3F6FEB7F5D42B61FF08D1F1DDFF914E71DDD9EC3FDA03FEA8B546BADF63C31825CEE0262D2D7169D083047C16669BF0BD1D4B8B8465B9017C321191E1EF51F6D97A1673023C6447E549460A487A7B1FB7FB1359BF7A1FE24BFF563FFD2BE47BC88D408E79236B5381100FDFF001433635A37B9C19C7B9C606AE9D77152658CB41D8F6D81A4365A41D7E4A469F8BC8E6FF3C7FACEFCAABAECEFAAA753600C6C961321A3F75C7F82CEE9BF5568CEC0A728E43D86D125A1A081A96F8F928C64C7CB6288C92D2C8BAFDEE29BD063E7A3CC994F8782B863BF17E8FF00E82E761541FD2B2DE4EAD3A0F92D8FAB6437A53C3DDB03AC7092606A1AB32860C7C3EA34CC863DCC07898F62BBD2B13EDBD18D1BF645B3313C34259E309E29194B823C702655C540F5E162C59251CD96318F171CCFE186324CEE8373DAD6BB2CB98C10C041200FE4FBD64E4D3F67C8B299DDE998DD112BADA99E9D4CAE67634367E02160753E9F94722FC90D0699DDBA471F09567E15F13C9973CE1CC668F057EAF88431714F8BA7CBEA9399F17F8562C58233E5B0CB8F8BF59C27265E1C7C32DF8B8BD2E627EBBFF8A3CCF3B67F06264DD6C877D61C970EEF1FF52C52FC7FF9BC5E73FCA2C7FF0016FF00DD12F3C7FF004DB1D32B7BB2D8E6B4B9AC92E31A090EE56C66744AABC5B728B06EDA5F21CEE4899FDD59FD15E1A6E9EFB63FE92D2CBCDB5D8D656492DD8E0070385878E04E3891C
)

MsgBox, % StrLen(Hex)

длиной ровно 16,383 символов выдаёт сообщение об ошибке. Просто в эти 16,383 символов входит не только то, что между скобками, но и «Hex =» — ещё 5 символов. Если их убрать, всё в порядке:

Hex = 
(
FFD8FFE10EF64578696600004D4D002A00000008000C01000003000000010313000001010003000000010313000001020003000000030000009E010600030000000100020000011200030000000100010000011500030000000100030000011A000500000001000000A4011B000500000001000000AC012800030000000100020000013100020000001C000000B40132000200000014000000D08769000400000001000000E40000011C000800080008001E848000002710001E84800000271041646F62652050686F746F73686F70204353352057696E646F777300323031343A30353A31312032303A34363A3439000004900000070000000430323231A001000300000001FFFF0000A00200040000000100000064A003000400000001000000640000000000000006010300030000000100060000011A0005000000010000016A011B0005000000010000017201280003000000010002000002010004000000010000017A020200040000000100000D740000000000000048000000010000004800000001FFD8FFED000C41646F62655F434D0001FFEE000E41646F626500648000000001FFDB0084000C08080809080C09090C110B0A0B11150F0C0C0F1518131315131318110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C010D0B0B0D0E0D100E0E10140E0E0E14140E0E0E0E14110C0C0C0C0C11110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC00011080064006403012200021101031101FFDD00040007FFC4013F0000010501010101010100000000000000030001020405060708090A0B0100010501010101010100000000000000010002030405060708090A0B1000010401030204020507060805030C33010002110304211231054151611322718132061491A1B14223241552C16233347282D14307259253F0E1F163733516A2B283264493546445C2A3743617D255E265F2B384C3D375E3F3462794A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F637475767778797A7B7C7D7E7F711000202010204040304050607070605350100021103213112044151617122130532819114A1B14223C152D1F0332462E1728292435315637334F1250616A2B283072635C2D2449354A317644555367465E2F2B384C3D375E3F34694A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F62737475767778797A7B7C7FFDA000C03010002110311003F005D2856EE9ED9682E976A403DFF00F522C6CD8FB5DF0368F51D03C352B5BA3F50C2CA2FC6C263D82B2092F8D7739A3C4FEEACACD0E3977388E6C719F892A9F331AC38C6F5A1AF276BE17332E7B9B26E227EB8C67BF0CA7C43FE931C576337331CE5C7D9C3C1B641236FF5423FD60B3A4BEDA7F6586066D3EA6C05BEE9D376EFE4ACFBB808454FC9E20610C9C52D38870DFA0FF7A2D8E707EBC9EC026A7E89F8A9A0D5B89DA0900F8223770796932009D557E6F1119272E21B71F0EB7C3F2B6F96CB78E028EFC17FD6F99924B73EAEF47C2EA62F1956BEAF4B66C153438B8BB77EF7F556766D35D1997D15CB99558E634B84121A76FB959E5FE113CE018E5802631C86244BD2320E28B97CDFFC63C3CB4E709E1C92E09CB17144C3D52C67865FA48B104E5D23C6C6FE50A9E488EB7903BFAD7CFF009CE57B1CC65527C1EDFF00AA0A9E7003EB06481FE9AFFF00AA2ABF31CB4B979E4C32224615AC76F5438D971F3B0E73EE7CC422611C8655197CDE8CBEDFE8FF0075224921D7918F6BDCCAEC6BDCDFA4D0751D954A3F63B06401009009D877F2489274904BFFD026074EC4C1739D8ECDAEB60BC924FD1DEEFCE43EB608C164FEF8FC8E575EE871F6F8F047F2D54EAF0EC30C71D8038193AEBAFEECB937357B53034D0F82B90C84F3B86533291E38EBEA9C9E6AEE022F4DB716BBEC39403AB7517B1B237458EAAC650EFEB36ED9EE4F6D3498DD7B5BF10EFF00C8A87D9F1FFEE4B3FCD7FF00E413B93FE6220FF5B6FEF3BDCE648CB24C7AC5803E4983F2FF00758F4BC470E836DD92D9C9ADFB438BA4C123CFF75C9A9E4AD1A2BA8746C968B5AEF783BC0303E8788DCA9534D727F4CCFB9DFF009043991FA8C83CB7FF000583E1D9447348133908CC81E99CBD3EDC7FAA9AB7BD801638B4F88247E4573A4B70ECCD1F6E737D1DAE2E2F24027B7B9566D4CDA3F4CCFF00A5FF00904BD367FA567FD2FF00C8ADBE5C09F238F1F14A0658630E380971C7D1F3424F25F10C95F12E632509C467C92E19FCA7F59B4A2D9EA5F63AFAA0385B7D069616ED3227DBBB5599D574FACD96383EB5DA7C5D2AC7A6DDEDFD2363C7DDFF009140EA403BEB2E56E76D9BEC9719D353FBAB9FE7E1C39F2C388CF8638E1C73F9E5C387878A7C4F4FF0DC825CAF233E1E1F5E6918C47A63C5CCF1543F7BFC05C72A96174D1897DB70B37FABDA2235DDE2B4FD0A7FD3B3EE7FFE41234D007F3ED3E41AEFFC8AA03880201152DF58BBB29619CA139466658C9303EDE6F4F16FFA281247F471FF00EE437FCD77FE4524384F87F8D164F7A3DA7FF85E5FFBC7FFD1B65AC93034D48FFA70AA66E562DD38B45EC193BF6ED74F2396FD172B8276813C8FCA0FB7FE92A0DE875373C660B9C5DEA1B3610235331B93A510411DFB34E19278E719C044989BF58E28FF008AE2DD957B481ED275E5AD3F95A8432EC1F9B59F8D6DFF00C8A59421F1E04A0A1CA0BC11BD7E6DFF00BCF55CCE2C7EECAA111B6C3FAAEB62DA1FD2F2AE755592C70F686C34FD1E5AD8541B955833F6766BFBA5C3FEFC8F8907A7E50718E23E202AB4D1658E10C73993048048FBC296308CC989028C80D7E56862E1C72E6243887B72E2F4194655ED465E9E12DDAECC7730135113AE8FFEF6B94BF553DAC69F8B4FF06A36474BBF13071B2DE5BE96503E900497003F7F45516E60C7118E318C8FA0087A652E1E287A255C4F23CD4CCB3E599040C929648F18F5F0643C70E2FEB3278A24439C35EED1FF009240EA801FAC9987806E7FE24A23B80975B11F58F33CEE3FC0FF0015CD7C52321CD67241A2615297E9FEADEBBE1462794E404660C819F14018FEAB8B3F6FEB7F5D42B61FF08D1F1DDFF914E71DDD9EC3FDA03FEA8B546BADF63C31825CEE0262D2D7169D083047C16669BF0BD1D4B8B8465B9017C321191E1EF51F6D97A1673023C6447E549460A487A7B1FB7FB1359BF7A1FE24BFF563FFD2BE47BC88D408E79236B5381100FDFF001433635A37B9C19C7B9C606AE9D77152658CB41D8F6D81A4365A41D7E4A469F8BC8E6FF3C7FACEFCAABAECEFAAA753600C6C961321A3F75C7F82CEE9BF5568CEC0A728E43D86D125A1A081A96F8F928C64C7CB6288C92D2C8BAFDEE29BD063E7A3CC994F8782B863BF17E8FF00E82E761541FD2B2DE4EAD3A0F92D8FAB6437A53C3DDB03AC7092606A1AB32860C7C3EA34CC863DCC07898F62BBD2B13EDBD18D1BF645B3313C34259E309E29194B823C702655C540F5E162C59251CD96318F171CCFE186324CEE8373DAD6BB2CB98C10C041200FE4FBD64E4D3F67C8B299DDE998DD112BADA99E9D4CAE67634367E02160753E9F94722FC90D0699DDBA471F09567E15F13C9973CE1CC668F057EAF88431714F8BA7CBEA9399F17F8562C58233E5B0CB8F8BF59C27265E1C7C32DF8B8BD2E627EBBFF8A3CCF3B67F06264DD6C877D61C970EEF1FF52C52FC7FF9BC5E73FCA2C7FF0016FF00DD12F3C7FF004DB1D32B7BB2D8E6B4B9AC92E31A090EE56C66744AABC5B728B06EDA5F21CEE4899FDD59FD15E1A6E9EFB63FE92D2CBCDB5D8D656492DD8E0070385878E04E3891C3564CB885FF008AED7C479B31F88CA22538188C78E3EDC8C38BFCA7EB3FF0C79AD524B549557A57FFD3AFF595C5BD25F3A12FA87DDEE50FAA7071F21A34FD2FF00ABFD67C7E8D574EADD85926DC8758DDF59BCDA76ED7735EE2DF6B957FAB59B90CEA4315A47A3635D6384027706E8772AF8F30C99233008FD1D592780C3969C2C1D78DEA2D8353FF00E2DDFF0052F567EAE69D1717FAA7FEA9C875D3EB3BD1FA21E08DDCF62AEF4EC3FB0E1558BBFD4F4811BE22649771AF8A8FE25923C11C77EBE213AFEAD4A29F87822133DE42BE8F2991506B3AB348D5973C8F995A1F56BFE4F70FE5FF00DF5AADF57C1A9E1F4D01B55996097BFF0079DFBCF51E9581660639A9EF0F24CCB66388EEA497318E7C9C85D4E7C1C313D7825C326CF2F194B983203D31C8788F6BC01BAB9FC2C0CAC5C3CF764B366FAC6DD4198DC4FD125740ABF50FE8391FF16EFC8AA72C6B3E2FF690FF00A6DFE624472D9E3FBD8E5FF44BC99E10FAAC9EB971EDBFFEFAC443C21F52FF00962DFEB4FF00D1AD745F1EFE6B179CBFE8BCCFFC5BFF0074CBCF1FFD3753A209F5C7937FEFCB42E04E35DA7E63BF21547A2D76816590456E801DD8C6E957F305A71AC15EAEDA4011CC88591847EA47916FFC5643FD273208A12C7FF3630E279A494FD2B3D4F4B69F52636C6B292A147B787D5EBBDC87EF0DB8F7FD0FDFFEE7F59FFFD4E1AF8F51C477D56B7D5DFF00972B1E353FFEA1645A0FB4F8B41FC0233245F5B8123E8EA34EE15481A313D9BD923C509476E214FA5E26B92DF2064FC9682CEC420640F2933E508D87D5BA76758EAF12E16BD837380044098FCE0D55FE2209CA08068405FF008D26B725288C744806523C209D65A476619E01C9A3C44FE54E9B3DD1978EDF10EFC13A8CFC98FF00BA7FE949D0E4B7CDFED3FF0051C14ABF50FE8391FF0016EFC8AC285D536EA9F53A435E0B4C73051C3211CB091DA328C8F9464D8CD132C5388DE5194479CA2F1C543AA47EDBB63B6DFC58C5A3D5B02AC27D6DA8B9C1ED24EE8EC7C80543AB376F5BB879547EF635741F18CD0CDCAE0CB8EF82667C37A7F55E7BE05827839EC98B2571C0E3E2AD779713B9D2C39D815806012E0E3E527856AD8635AD1303C7C954E9449C0680620BBDDF39472D05FBB76E0443815431FF00371FEE847C43FDD9CC7FB59FFD372BFEF676EBF4E67E52925B5BFB6767E6EE88F2DA92ADFF00AB9DDB3FFC6C7FFFD5E1DFF419FD51F914ABE6AFECCFDEB01254874F3740BED589FD206EFDD77E459BF55FF61FDAEEFD9DF68F5BD3F7FAD11B7737E8ECFCEDCBC9D2439DF9A7F37C91DBE5F9A7F339BCBEF8BE5F9E7F37CFF2C3F9B7DCAEFE74A82F1049531B0F27A187CA3C83EDE92F104915CFA97D63FE769FEABBF2AC8EAF3FB77227FE0E3E1B1B0B84496CF31FF6B394FF00AA7FD271B93FFB73CC7F7B0FE517D57A3CFD87CF73A3F0568EE8311BBBF8AF2049458BF9B8F9069FC47FDD9CC7FB49FF00D27D1FF49FB63B4CFF00DF525E7092ADFF00AB9DBFFE65BFFFD9FFED15B850686F746F73686F7020332E30003842494D040400000000000F1C015A00031B25471C02000002A800003842494D042500000000001032C4B085E11CA1FA2154120320C140AD3842494D043A000000000093000000100000000100000000000B7072696E744F75747075740000000500000000436C7253656E756D00000000436C7253000000005247424300000000496E7465656E756D00000000496E746500000000436C726D000000004D70426C626F6F6C010000000F7072696E745369787465656E426974626F6F6C000000000B7072696E7465724E616D6554455854000000010000003842494D043B0000000001B200000010000000010000000000127072696E744F75747075744F7074696F6E7300000012000000004370746E626F6F6C0000000000436C6272626F6F6C00000000005267734D626F6F6C000000000043726E43626F6F6C0000000000436E7443626F6F6C00000000004C626C73626F6F6C00000000004E677476626F6F6C0000000000456D6C44626F6F6C0000000000496E7472626F6F6C000000000042636B674F626A630000000100000000000052474243000000030000000052642020646F7562406FE000000000000000000047726E20646F7562406FE0000000000000000000426C2020646F7562406FE000000000000000000042726454556E744623526C74000000000000000000000000426C6420556E744623526C7400000000000000000000000052736C74556E74462350786C40690000000000000000000A766563746F7244617461626F6F6C010000000050675073656E756D00000000506750730000000050675043000000004C656674556E744623526C74000000000000000000000000546F7020556E744623526C7400000000000000000000000053636C20556E74462350726340590000000000003842494D03ED00000000001000C800000001000200C80000000100023842494D042600000000000E000000000000000000003F8000003842494D040D0000000000040000001E3842494D04190000000000040000001E3842494D03F3000000000009000000000000000001003842494D040A00000000000100003842494D271000000000000A000100000000000000023842494D03F5000000000048002F66660001006C66660006000000000001002F6666000100A1999A0006000000000001003200000001005A00000006000000000001003500000001002D000000060000000000013842494D03F80000000000700000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800003842494D0408000000000010000000010000024000000240000000003842494D041E000000000004000000003842494D041A00000000033F000000060000000000000000000000640000006400000005004B006F006D005F00390000000100000000000000000000000000000000000000010000000000000000000000640000006400000000000000000000000000000000010000000000000000000000000000000000000010000000010000000000006E756C6C0000000200000006626F756E64734F626A6300000001000000000000526374310000000400000000546F70206C6F6E6700000000000000004C6566746C6F6E67000000000000000042746F6D6C6F6E670000006400000000526768746C6F6E670000006400000006736C69636573566C4C73000000014F626A6300000001000000000005736C6963650000001200000007736C69636549446C6F6E67000000000000000767726F757049446C6F6E6700000000000000066F726967696E656E756D0000000C45536C6963654F726967696E0000000D6175746F47656E6572617465640000000054797065656E756D0000000A45536C6963655479706500000000496D672000000006626F756E64734F626A6300000001000000000000526374310000000400000000546F70206C6F6E6700000000000000004C6566746C6F6E67000000000000000042746F6D6C6F6E670000006400000000526768746C6F6E67000000640000000375726C54455854000000010000000000006E756C6C54455854000000010000000000004D7367655445585400000001000000000006616C74546167544558540000000100000000000E63656C6C54657874497348544D4C626F6F6C010000000863656C6C546578745445585400000001000000000009686F727A416C69676E656E756D0000000F45536C696365486F727A416C69676E0000000764656661756C740000000976657274416C69676E656E756D0000000F45536C69636556657274416C69676E0000000764656661756C740000000B6267436F6C6F7254797065656E756D0000001145536C6963654247436F6C6F7254797065000000004E6F6E6500000009746F704F75747365746C6F6E67000000000000000A6C6566744F75747365746C6F6E67000000000000000C626F74746F6D4F75747365746C6F6E67000000000000000B72696768744F75747365746C6F6E6700000000003842494D042800000000000C000000023FF00000000000003842494D0414000000000004000000013842494D040C000000000D900000000100000064000000640000012C0000753000000D7400180001FFD8FFED000C41646F62655F434D0001FFEE000E41646F626500648000000001FFDB0084000C08080809080C09090C110B0A0B11150F0C0C0F1518131315131318110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C010D0B0B0D0E0D100E0E10140E0E0E14140E0E0E0E14110C0C0C0C0C11110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC00011080064006403012200021101031101FFDD00040007FFC4013F0000010501010101010100000000000000030001020405060708090A0B0100010501010101010100000000000000010002030405060708090A0B1000010401030204020507060805030C33010002110304211231054151611322718132061491A1B14223241552C16233347282D14307259253F0E1F163733516A2B283264493546445C2A3743617D255E265F2B384C3D375E3F3462794A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F637475767778797A7B7C7D7E7F711000202010204040304050607070605350100021103213112044151617122130532819114A1B14223C152D1F0332462E1728292435315637334F1250616A2B283072635C2D2449354A317644555367465E2F2B384C3D375E3F34694A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F62737475767778797A7B7C7FFDA000C03010002110311003F005D2856EE9ED9682E976A403DFF00F522C6CD8FB5DF0368F51D03C352B5BA3F50C2CA2FC6C263D82B2092F8D7739A3C4FEEACACD0E3977388E6C719F892A9F331AC38C6F5A1AF276BE17332E7B9B26E227EB8C67BF0CA7C43FE931C576337331CE5C7D9C3C1B641236FF5423FD60B3A4BEDA7F6586066D3EA6C05BEE9D376EFE4ACFBB808454FC9E20610C9C52D38870DFA0FF7A2D8E707EBC9EC026A7E89F8A9A0D5B89DA0900F8223770796932009D557E6F1119272E21B71F0EB7C3F2B6F96CB78E028EFC17FD6F99924B73EAEF47C2EA62F1956BEAF4B66C153438B8BB77EF7F556766D35D1997D15CB99558E634B84121A76FB959E5FE113CE018E5802631C86244BD2320E28B97CDFFC63C3CB4E709E1C92E09CB17144C3D52C67865FA48B104E5D23C6C6FE50A9E488EB7903BFAD7CFF009CE57B1CC65527C1EDFF00AA0A9E7003EB06481FE9AFFF00AA2ABF31CB4B979E4C32224615AC76F5438D971F3B0E73EE7CC422611C8655197CDE8CBEDFE8FF0075224921D7918F6BDCCAEC6BDCDFA4D0751D954A3F63B06401009009D877F2489274904BFFD026074EC4C1739D8ECDAEB60BC924FD1DEEFCE43EB608C164FEF8FC8E575EE871F6F8F047F2D54EAF0EC30C71D8038193AEBAFEECB937357B53034D0F82B90C84F3B86533291E38EBEA9C9E6AEE022F4DB716BBEC39403AB7517B1B237458EAAC650EFEB36ED9EE4F6D3498DD7B5BF10EFF00C8A87D9F1FFEE4B3FCD7FF00E413B93FE6220FF5B6FEF3BDCE648CB24C7AC5803E4983F2FF00758F4BC470E836DD92D9C9ADFB438BA4C123CFF75C9A9E4AD1A2BA8746C968B5AEF783BC0303E8788DCA9534D727F4CCFB9DFF009043991FA8C83CB7FF000583E1D9447348133908CC81E99CBD3EDC7FAA9AB7BD801638B4F88247E4573A4B70ECCD1F6E737D1DAE2E2F24027B7B9566D4CDA3F4CCFF00A5FF00904BD367FA567FD2FF00C8ADBE5C09F238F1F14A0658630E380971C7D1F3424F25F10C95F12E632509C467C92E19FCA7F59B4A2D9EA5F63AFAA0385B7D069616ED3227DBBB5599D574FACD96383EB5DA7C5D2AC7A6DDEDFD2363C7DDFF009140EA403BEB2E56E76D9BEC9719D353FBAB9FE7E1C39F2C388CF8638E1C73F9E5C387878A7C4F4FF0DC825CAF233E1E1F5E6918C47A63C5CCF1543F7BFC05C72A96174D1897DB70B37FABDA2235DDE2B4FD0A7FD3B3EE7FFE41234D007F3ED3E41AEFFC8AA03880201152DF58BBB29619CA139466658C9303EDE6F4F16FFA281247F471FF00EE437FCD77FE4524384F87F8D164F7A3DA7FF85E5FFBC7FFD1B65AC93034D48FFA70AA66E562DD38B45EC193BF6ED74F2396FD172B8276813C8FCA0FB7FE92A0DE875373C660B9C5DEA1B3610235331B93A510411DFB34E19278E719C044989BF58E28FF008AE2DD957B481ED275E5AD3F95A8432EC1F9B59F8D6DFF00C8A59421F1E04A0A1CA0BC11BD7E6DFF00BCF55CCE2C7EECAA111B6C3FAAEB62DA1FD2F2AE755592C70F686C34FD1E5AD8541B955833F6766BFBA5C3FEFC8F8907A7E50718E23E202AB4D1658E10C73993048048FBC296308CC989028C80D7E56862E1C72E6243887B72E2F4194655ED465E9E12DDAECC7730135113AE8FFEF6B94BF553DAC69F8B4FF06A36474BBF13071B2DE5BE96503E900497003F7F45516E60C7118E318C8FA0087A652E1E287A255C4F23CD4CCB3E599040C929648F18F5F0643C70E2FEB3278A24439C35EED1FF009240EA801FAC9987806E7FE24A23B80975B11F58F33CEE3FC0FF0015CD7C52321CD67241A2615297E9FEADEBBE1462794E404660C819F14018FEAB8B3F6FEB7F5D42B61FF08D1F1DDFF914E71DDD9EC3FDA03FEA8B546BADF63C31825CEE0262D2D7169D083047C16669BF0BD1D4B8B8465B9017C321191E1EF51F6D97A1673023C6447E549460A487A7B1FB7FB1359BF7A1FE24BFF563FFD2BE47BC88D408E79236B5381100FDFF001433635A37B9C19C7B9C606AE9D77152658CB41D8F6D81A4365A41D7E4A469F8BC8E6FF3C7FACEFCAABAECEFAAA753600C6C961321A3F75C7F82CEE9BF5568CEC0A728E43D86D125A1A081A96F8F928C64C7CB6288C92D2C8BAFDEE29BD063E7A3CC994F8782B863BF17E8FF00E82E761541FD2B2DE4EAD3A0F92D8FAB6437A53C3DDB03AC7092606A1AB32860C7C3EA34CC863DCC07898F62BBD2B13EDBD18D1BF645B3313C34259E309E29194B823C702655C540F5E162C59251CD96318F171CCFE186324CEE8373DAD6BB2CB98C10C041200FE4FBD64E4D3F67C8B299DDE998DD112BADA99E9D4CAE67634367E02160753E9F94722FC90D0699DDBA471F09567E15F13C9973CE1CC668F057EAF88431714F8BA7CBEA9399F17F8562C58233E5B0CB8F8BF59C27265E1C7C32DF8B8BD2E627EBBFF8A3CCF3B67F06264DD6C877D61C970EEF1FF52C52FC7FF9BC5E73FCA2C7FF0016FF00DD12F3C7FF004DB1D32B7BB2D8E6B4B9AC92E31A090EE56C66744AABC5B728B06EDA5F21CEE4899FDD59FD15E1A6E9EFB63FE92D2CBCDB5D8D656492DD8E0070385878E04E
)

MsgBox, % StrLen(Hex)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder