1

Тема: AHK: Загрузить Picture в код программы

Привет.
Встал интересный вопрос, можно ли загрузить Picture в код.
Есть допустим такой код. И есть картинка calc.gif


Gui, Add, Picture, gCalc, C:\1\calc.gif


Calc:
	Run calc.exe
Return

Если на другом ПК запускать, то понятно что картинку он не найдет. Можно ли загрузить картинку в код ?
Чтобы любой кто запустил скрипт на другом пк, мог видеть данную картинку ? Картинки 40 на 40. весят по 1-2кб

2

Re: AHK: Загрузить Picture в код программы

Можно и уже есть полно рабочих решений, которые гуглятся по слову 'base64'.

3

Re: AHK: Загрузить Picture в код программы

Можно залить картинку на хост с низменной ссылкой и подгружать её.

URLDownloadToFile, https://host.com/ySGexZCfCKV9ATka5Wl.gif , calc.gif

4

Re: AHK: Загрузить Picture в код программы

Можно, для этого нужно двоичные данные файла перекодировать в текст и поместить в скрипт.
Вот скрипт-кодировщик, примеры работы с кодом встроены в скрипт.

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

5

Re: AHK: Загрузить Picture в код программы

Sgy-x2 Ваш метод хорош, но есть минус, если нет инета на компе.

teadrinker Ваш метод верный, но что то очень сложный.
Запустил пример там коду на 200 строк. Это весь этот код нужно переделывать под себя ? или там только минимальную часть переносить в свой код ?

6

Re: AHK: Загрузить Picture в код программы

GetBase64StringFromFile.ahk

7

Re: AHK: Загрузить Picture в код программы

Sgy-x2 Воспользовался вашим методом. Но тут возникает вопрос. При запуске скрипта, он скачивает файлы и помещает их рядом с запускаемым файлом.
При запуске 2 раз, он так же будет скачивать картинки ? Если да, то наверняка есть проверка, что если картинка с таким названием есть то не качать её ?

8

Re: AHK: Загрузить Picture в код программы

red2881 Это да, я нашел, но слишкооооом дофига кода, для 1 картинки просто )) а если их будет 10, то код будет огромным.

9

Re: AHK: Загрузить Picture в код программы

Используй #Include код отдельно, картинки отдельно.

10

Re: AHK: Загрузить Picture в код программы

Код как бы мой. В скрипт его не нужно писать, это кодировщик с интерфейсом. В скрипте нужно только раскодировать строку.

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

11

Re: AHK: Загрузить Picture в код программы

Autosql пишет:

Запустил пример там коду на 200 строк. Это весь этот код нужно переделывать под себя ? или там только минимальную часть переносить в свой код ?

Вам нужен пример CreateImageFromBASE64.ahk. Собственно кода там 70 строк включая создание окна для демонстрации. Всё остальное — это строка с картинкой. Если у вас картинка 40х40, то места займёт существенно меньше.

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

12

Re: AHK: Загрузить Picture в код программы

http://forum.script-coding.com/viewtopi … 445#p76445

13

Re: AHK: Загрузить Picture в код программы

red2881, там код с промежуточным сохранение в файл, у меня картинка прямо из строки.

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

14 (изменено: Sgy-x2, 2016-11-29 20:19:58)

Re: AHK: Загрузить Picture в код программы

Autosql
Так не будет качать постоянно, если фаил уже есть.

IfNotExist calc.gif
URLDownloadToFile, https://host.com/ySGexZCfCKV9ATka5Wl.gif , calc.gif

15 (изменено: stealzy, 2016-11-29 23:32:00)

Re: AHK: Загрузить Picture в код программы

https://gist.github.com/AHK-just-me/555 … nclude-ahk
Запускаете, указываете картинку → получаете файл с кодом → копируете в свой скрипт.
Как вставить такую картинку показано в Sample.ahk.

Пример из моего скрипта VirusTotal Hash Checker:
(картинка 1,5 Кб записана в переменной (1 строка ;-) в третьей ф-ии,
ф-ии CreateBitMap(B64) и Bitmap_SetImage(hCtrl, hBitmap) (25 строк - плата за использование метода) я вынес для сокращения кода, т.к. у меня несколько картинок)

Gui, installGui: Add, Text, w280 h44 HwndVTlogo_png ; высоту и ширину картинки придется указать вручную
HBITMAP := Create_VTlogo_png()
Bitmap_SetImage(VTlogo_png, HBITMAP)
Gui, installGui: Show
Return

Bitmap_SetImage(hCtrl, hBitmap) {
	WinSet, Style, +0x0E, ahk_id %hCtrl%
	SendMessage, 0x172, 0x00, %hBitmap%, , ahk_id %hCtrl%
	Return ErrorLevel
}
CreateBitMap(B64) {
	If !DllCall("Crypt32.dll\CryptStringToBinary", "Ptr", &B64, "UInt", 0, "UInt", 0x01, "Ptr", 0, "UIntP", DecLen, "Ptr", 0, "Ptr", 0)
			Return False
	VarSetCapacity(Dec, DecLen, 0)
	If !DllCall("Crypt32.dll\CryptStringToBinary", "Ptr", &B64, "UInt", 0, "UInt", 0x01, "Ptr", &Dec, "UIntP", DecLen, "Ptr", 0, "Ptr", 0)
			Return False
	hData := DllCall("Kernel32.dll\GlobalAlloc", "UInt", 2, "UPtr", DecLen, "UPtr")
	pData := DllCall("Kernel32.dll\GlobalLock", "Ptr", hData, "UPtr")
	DllCall("Kernel32.dll\RtlMoveMemory", "Ptr", pData, "Ptr", &Dec, "UPtr", DecLen)
	DllCall("Kernel32.dll\GlobalUnlock", "Ptr", hData)
	DllCall("Ole32.dll\CreateStreamOnHGlobal", "Ptr", hData, "Int", True, "PtrP", pStream)
	hGdip := DllCall("Kernel32.dll\LoadLibrary", "Str", "Gdiplus.dll", "UPtr")
	VarSetCapacity(SI, 16, 0), NumPut(1, SI, 0, "UChar")
	DllCall("Gdiplus.dll\GdiplusStartup", "PtrP", pToken, "Ptr", &SI, "Ptr", 0)
	DllCall("Gdiplus.dll\GdipCreateBitmapFromStream",  "Ptr", pStream, "PtrP", pBitmap)
	DllCall("Gdiplus.dll\GdipCreateHBITMAPFromBitmap", "Ptr", pBitmap, "PtrP", hBitmap, "UInt", 0)
	DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pBitmap)
	DllCall("Gdiplus.dll\GdiplusShutdown", "Ptr", pToken)
	DllCall("Kernel32.dll\FreeLibrary", "Ptr", hGdip)
	DllCall(NumGet(NumGet(pStream + 0, 0, "UPtr") + (A_PtrSize * 2), 0, "UPtr"), "Ptr", pStream)
	Return hBitmap
}

Create_VTlogo_png() {
	Static hBitmap := 0
	If hBitmap
		Return hBitmap
	VarSetCapacity(B64, 2020 << !!A_IsUnicode)
	B64 := "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"
	hBitmap := CreateBitMap(B64)
	Return hBitmap
}

Каждой картинка записывается в отдельной функции.

+ Казалось бы, зачем записывать Base64 внутри функций?

Дело в том, что файлы могут весить сотни килобайт, и если разместить переменные такого размера в глобальной видимости скрипта, AutoHotkey просто "не переварит" их.
Функции же обладают тем достоинством, что при выходе из них память локальных переменных освобождается.

Обсуждение Image2Include на autohotkey.com

Offtop:
Autosql, там же можете глянуть, как сделать, чтобы при наведении на картинку курсор менялся на руку и появлялась всплывающая подсказка (tooltip).

16

Re: AHK: Загрузить Picture в код программы

Спасибо, посмотрел код, попробовал вставить у себя, но что то не отработало.

Я верно понимаю что я могу вставить код ваш, вставить код своей картинки, и потом вызвать ей вот так.


Bitmap_SetImage(hCtrl, hBitmap) {
	WinSet, Style, +0x0E, ahk_id %hCtrl%
	SendMessage, 0x172, 0x00, %hBitmap%, , ahk_id %hCtrl%
	Return ErrorLevel
}
CreateBitMap(B64) {
	If !DllCall("Crypt32.dll\CryptStringToBinary", "Ptr", &B64, "UInt", 0, "UInt", 0x01, "Ptr", 0, "UIntP", DecLen, "Ptr", 0, "Ptr", 0)
			Return False
	VarSetCapacity(Dec, DecLen, 0)
	If !DllCall("Crypt32.dll\CryptStringToBinary", "Ptr", &B64, "UInt", 0, "UInt", 0x01, "Ptr", &Dec, "UIntP", DecLen, "Ptr", 0, "Ptr", 0)
			Return False
	hData := DllCall("Kernel32.dll\GlobalAlloc", "UInt", 2, "UPtr", DecLen, "UPtr")
	pData := DllCall("Kernel32.dll\GlobalLock", "Ptr", hData, "UPtr")
	DllCall("Kernel32.dll\RtlMoveMemory", "Ptr", pData, "Ptr", &Dec, "UPtr", DecLen)
	DllCall("Kernel32.dll\GlobalUnlock", "Ptr", hData)
	DllCall("Ole32.dll\CreateStreamOnHGlobal", "Ptr", hData, "Int", True, "PtrP", pStream)
	hGdip := DllCall("Kernel32.dll\LoadLibrary", "Str", "Gdiplus.dll", "UPtr")
	VarSetCapacity(SI, 16, 0), NumPut(1, SI, 0, "UChar")
	DllCall("Gdiplus.dll\GdiplusStartup", "PtrP", pToken, "Ptr", &SI, "Ptr", 0)
	DllCall("Gdiplus.dll\GdipCreateBitmapFromStream",  "Ptr", pStream, "PtrP", pBitmap)
	DllCall("Gdiplus.dll\GdipCreateHBITMAPFromBitmap", "Ptr", pBitmap, "PtrP", hBitmap, "UInt", 0)
	DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pBitmap)
	DllCall("Gdiplus.dll\GdiplusShutdown", "Ptr", pToken)
	DllCall("Kernel32.dll\FreeLibrary", "Ptr", hGdip)
	DllCall(NumGet(NumGet(pStream + 0, 0, "UPtr") + (A_PtrSize * 2), 0, "UPtr"), "Ptr", pStream)
	Return hBitmap
}

Create_VTlogo_png() {
	Static hBitmap := 0
	If hBitmap
		Return hBitmap
	VarSetCapacity(B64, 2020 << !!A_IsUnicode)
	B64 := "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"
	hBitmap := CreateBitMap(B64)
	Return hBitmap
}





Gui, Add, Picture, x115 y60 gGos1, hBitmap

Но так не прокатило.
Цель используя ваш скрипт, получить переменную, ну а дальше её вставить куда нужно.