1 (изменено: DD, 2016-05-16 22:12:55)

Тема: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)

Спасибо.

2

Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)

Так пафосно не обязательно было. Гораздо лучше суть вопроса отражало бы что-нибудь вроде: «конвертация файлов иконок в строку base64». Завтра.

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

3

Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)

Оно?

+ DD

4

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
}

5

Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)

Есть более продвинутый вариант с интерфейсом, если нужно, могу выложить и его.

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

6

Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)

Конечно, спасибо.

7

Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)

GetBase64StringFromFile.ahk

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

8

Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)

При выборе пунктов меню в CreateIconFromBASE64 ничего не происходит.
Ну и главное в "Получить строку BASE64" при указании нуля в "Перенос строки через" писало бы в одну строку и без скобок, также желательно вводить имя переменной ведь их может быть много в скрипте. Также добавить вывод переменной в виде выражения, например для использования с глобал или статик может быть удобным.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9

Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)

serzh82saratov пишет:

При выборе пунктов меню в CreateIconFromBASE64 ничего не происходит.

Проводником обычным пользуешься?

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

10

Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)

Да.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

11

Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)

Должна создаваться папка «Examples» в директории скрипта, в ней файлы с примерами, после этого нужный файл показывается в проводнике.

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

12

Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)

Он то запускается, я имел ввиду пункты его меню"Press Me".

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

13

Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)

А, понял. Ничего и не должно происходить, это меню только для примера вставки иконок.

serzh82saratov пишет:

Также добавить вывод переменной в виде выражения, например для использования с глобал или статик может быть удобным.

Это не понял.

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

14 (изменено: serzh82saratov, 2016-05-18 00:10:46)

Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)

Так

var = %var%
(
qwer
asdf
)

или

var .= "qwer"
	. "asdf"

Ну про однострочный режим и начало этих конструкций, понятно...

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

15

Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)

А в чём разница-то?

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

16

Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)

Global var =
(
qwer
asdf
)
MsgBox % var
Global var .= "qwer"
	. "asdf"
MsgBox % var
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

17

Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)

Там переменная будет в десятки/сотни строк. Есть ли смысл ради экономии одной

Global var

лепить все эти кавычки и точки? И нагружать интерфейс?

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

18 (изменено: serzh82saratov, 2016-05-18 00:23:26)

Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)

Смысл в контексте использования переменной.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

19

Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)

Так без разницы, как и где она используется. Если нужно объявить её глобальной или статической:

MyFunc()
{
	static var
	var =
	(
		...
	)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

20

Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)

Ну так это как минимум надо дублировать её название.

Почему бы не добавить как вариант?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

21

Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)

serzh82saratov пишет:

Ну так это как минимум надо дублировать её название.

Это ж сколько трудов-то! Так сэкономишь 10 знаков, добавить несколько десятков/сотен придётся. Смысл-то какой?

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

22 (изменено: serzh82saratov, 2016-05-18 01:00:03)

Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)

teadrinker пишет:

Смысл-то какой?

Других доводов у меня нет.
Но так как периодически сам использую запись

Global var := "qw"

вместо

Global var
var = qw

теперь буду думать зачем я так поступал.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

23

Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

24

Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)

serzh82saratov пишет:

Но так как периодически сам использую запись

Так я тоже использую. Разница в том, что здесь для определения переменной используется примерно 10 знаков, а в случае строки с файлом — тысячи, так что от лишнего повторения названия переменной ничего не изменится.

serzh82saratov пишет:

то допиши например чекбокс

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

serzh82saratov пишет:

Ну и главное в "Получить строку BASE64" при указании нуля в "Перенос строки через" писало бы в одну строку и без скобок, также желательно вводить имя переменной ведь их может быть много в скрипте.

Об этом можно подумать, сам потом вручную названия меняю.

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

25 (изменено: serzh82saratov, 2016-05-18 03:19:31)

Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)

teadrinker пишет:

Для себя, думаю, сумеешь добавить

Да для себя то уже "вчера", я же про

teadrinker пишет:

продвинутый вариант с интерфейсом

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

26

Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)

Так «продвинутый» же не означает, что будут реализованы все возможные фишки. Тут нужно придерживаться какого-то баланса между затратностью, полезностью и нагруженностью интерфейса. А в полезности предложенной тобой фишки я так и не был убеждён.

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

27

Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)

Вот по моему наглядный пример:
Надо сохранить в функции переменные, и по необходимости вернуть их содержимое.

MsgBox % Func("Var1")

В данном случае при каждом вызове функции, всем переменным заново присваиваются значения, и Static тут бесполезен:

Func(Name) { 
	Var1 = 111
	Var2 = 222
	Return "" %Name%
}

А так сразу возвращаем результат, переменным присваиваются значения только однократно:

Func(Name) {
	Static Var1 := 111
	, Var2 := 222
	Return "" %Name%
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

28

Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)

serzh82saratov пишет:

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

А что в этом плохого? Меньше места в памяти будет занято. У меня, кстати, так и сделано.

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

29

Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)

Хотя да, ты прав. Но как бы многократное назначение нескольких больших переменных это тоже не гуд. В таком случае можно перед каждой переменной прописать оператор IF.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

30

Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)

Так многократное вряд ли потребуется, это ж только для инициализации нужно. В случае иконок достаточно один раз хэндл получить.

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

31

Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)

В функции 100 переменных, её 100 раз запускаешь, при каждом запуске пока дойдёт до Return назначатся сначала 100 переменных. То есть для инициализации 100 переменных, нужно будет назначить 10000 переменных.

Func(Name) { 
	Var1 = 1
	***
	Var100 = 100
	Return "" %Name%
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

32

Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)

Ну, сто вряд ли наберётся. А если какая-то из них действительно большого объёма (такого, что может сказаться на производительности), тогда её можно отдельно разместить.

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

33

Re: AHK: Конвертация файлов иконок в строку base64 (н., для вставки в код)

Добавлена возможность ввода названия переменной. Если «перенос строк через» указать 0, результат будет выведен в виде

str := "..."
str .= "..."
...

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

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