1 2016-05-16 20:14:23 (изменено: DD, 2016-05-16 22:12:55)
Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)
Так пафосно не обязательно было. Гораздо лучше суть вопроса отражало бы что-нибудь вроде: «конвертация файлов иконок в строку base64». Завтра.
Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)
Оно самое :-) —
URLDownloadToFile, http://forum.script-coding.com/favicon.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
}
Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)
Есть более продвинутый вариант с интерфейсом, если нужно, могу выложить и его.
Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)
Конечно, спасибо.
Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)
Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)
При выборе пунктов меню в CreateIconFromBASE64 ничего не происходит.
Ну и главное в "Получить строку BASE64" при указании нуля в "Перенос строки через" писало бы в одну строку и без скобок, также желательно вводить имя переменной ведь их может быть много в скрипте. Также добавить вывод переменной в виде выражения, например для использования с глобал или статик может быть удобным.
Win10x64 AhkSpy, Hotkey, ClockGui
Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)
При выборе пунктов меню в CreateIconFromBASE64 ничего не происходит.
Проводником обычным пользуешься?
Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)
Да.
Win10x64 AhkSpy, Hotkey, ClockGui
Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)
Должна создаваться папка «Examples» в директории скрипта, в ней файлы с примерами, после этого нужный файл показывается в проводнике.
Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)
Он то запускается, я имел ввиду пункты его меню"Press Me".
Win10x64 AhkSpy, Hotkey, ClockGui
Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)
А, понял. Ничего и не должно происходить, это меню только для примера вставки иконок.
Также добавить вывод переменной в виде выражения, например для использования с глобал или статик может быть удобным.
Это не понял.
14 2016-05-18 00:09:53 (изменено: serzh82saratov, 2016-05-18 00:10:46)
Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)
Так
var = %var%
(
qwer
asdf
)
или
var .= "qwer"
. "asdf"
Ну про однострочный режим и начало этих конструкций, понятно...
Win10x64 AhkSpy, Hotkey, ClockGui
Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)
А в чём разница-то?
Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)
Global var =
(
qwer
asdf
)
MsgBox % var
Global var .= "qwer"
. "asdf"
MsgBox % var
Win10x64 AhkSpy, Hotkey, ClockGui
Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)
Там переменная будет в десятки/сотни строк. Есть ли смысл ради экономии одной
Global var
лепить все эти кавычки и точки? И нагружать интерфейс?
18 2016-05-18 00:23:07 (изменено: serzh82saratov, 2016-05-18 00:23:26)
Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)
Смысл в контексте использования переменной.
Win10x64 AhkSpy, Hotkey, ClockGui
Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)
Так без разницы, как и где она используется. Если нужно объявить её глобальной или статической:
MyFunc()
{
static var
var =
(
...
)
}
Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)
Ну так это как минимум надо дублировать её название.
Почему бы не добавить как вариант?
Win10x64 AhkSpy, Hotkey, ClockGui
Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)
Ну так это как минимум надо дублировать её название.
Это ж сколько трудов-то! Так сэкономишь 10 знаков, добавить несколько десятков/сотен придётся. Смысл-то какой?
22 2016-05-18 00:59:13 (изменено: serzh82saratov, 2016-05-18 01:00:03)
Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)
Смысл-то какой?
Других доводов у меня нет.
Но так как периодически сам использую запись
Global var := "qw"
вместо
Global var
var = qw
теперь буду думать зачем я так поступал.
Win10x64 AhkSpy, Hotkey, ClockGui
Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)
Если дело в трудах а не в смысле, то допиши например чекбокс, а я как нибудь дорисую кавычки. Просто оно давно уже у меня есть, но без интерфейса.
Win10x64 AhkSpy, Hotkey, ClockGui
Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)
Но так как периодически сам использую запись
Так я тоже использую. Разница в том, что здесь для определения переменной используется примерно 10 знаков, а в случае строки с файлом — тысячи, так что от лишнего повторения названия переменной ничего не изменится.
то допиши например чекбокс
Для себя, думаю, сумеешь добавить, описание окна на 19 строке начинается.
Ну и главное в "Получить строку BASE64" при указании нуля в "Перенос строки через" писало бы в одну строку и без скобок, также желательно вводить имя переменной ведь их может быть много в скрипте.
Об этом можно подумать, сам потом вручную названия меняю.
25 2016-05-18 03:18:36 (изменено: serzh82saratov, 2016-05-18 03:19:31)
Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)
Для себя, думаю, сумеешь добавить
Да для себя то уже "вчера", я же про
продвинутый вариант с интерфейсом
Win10x64 AhkSpy, Hotkey, ClockGui
Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)
Так «продвинутый» же не означает, что будут реализованы все возможные фишки. Тут нужно придерживаться какого-то баланса между затратностью, полезностью и нагруженностью интерфейса. А в полезности предложенной тобой фишки я так и не был убеждён.
Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)
Вот по моему наглядный пример:
Надо сохранить в функции переменные, и по необходимости вернуть их содержимое.
MsgBox % Func("Var1")
В данном случае при каждом вызове функции, всем переменным заново присваиваются значения, и Static тут бесполезен:
Func(Name) {
Var1 = 111
Var2 = 222
Return "" %Name%
}
А так сразу возвращаем результат, переменным присваиваются значения только однократно:
Func(Name) {
Static Var1 := 111
, Var2 := 222
Return "" %Name%
}
Win10x64 AhkSpy, Hotkey, ClockGui
Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)
В данном случае при каждом вызове функции, всем переменным заново присваиваются значения
А что в этом плохого? Меньше места в памяти будет занято. У меня, кстати, так и сделано.
Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)
Хотя да, ты прав. Но как бы многократное назначение нескольких больших переменных это тоже не гуд. В таком случае можно перед каждой переменной прописать оператор IF.
Win10x64 AhkSpy, Hotkey, ClockGui
Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)
Так многократное вряд ли потребуется, это ж только для инициализации нужно. В случае иконок достаточно один раз хэндл получить.
Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)
В функции 100 переменных, её 100 раз запускаешь, при каждом запуске пока дойдёт до Return назначатся сначала 100 переменных. То есть для инициализации 100 переменных, нужно будет назначить 10000 переменных.
Func(Name) {
Var1 = 1
***
Var100 = 100
Return "" %Name%
}
Win10x64 AhkSpy, Hotkey, ClockGui
Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)
Ну, сто вряд ли наберётся. А если какая-то из них действительно большого объёма (такого, что может сказаться на производительности), тогда её можно отдельно разместить.
Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)
Добавлена возможность ввода названия переменной. Если «перенос строк через» указать 0, результат будет выведен в виде
str := "..."
str .= "..."
...
без переноса строк. Дополнительная возможность — каждый из форматов иконки можно сохранить в отдельный файл, кликнув по нужному изображению правой кнопкой.