musicstashall
Знающий
- Сообщения
- 322
- Репутация
- 7
Доброго.
Необходимо было получить данные об иконке в файле, для чего я написал такой скрипт, согласно документации. В скрипте переменная $sByte — это считанные данные из файла, в которых содержится информация о количестве изображений в иконке (count), размеры изображений (width, height), количество битов на пиксель (bpp), размер изображения в байтах (size) и индекс изображения (index). $tagICONS_HEADER — это заголовок данных, в котором узнаем количество иконок. $tagICONS_INFO — каталог информации об изображении, представляет собой последовательные записи фиксированного размера 14 байт (в документации почему-то указано 16 байт), следующие одна за другой. Количество записей определяется полем count заголовка.
Первая строка ($sByte) содержит информацию о десяти изображениях с индексами от 1 до 10. Вторая короткая строка бинарных данных ($sByte) содержит информацию об одной иконке, ее индекс (index) равен 11.
Вроде бы не сложно, но возникает баг при чтении — каждая нечетная запись содержит ошибку в последних двух числах (size и index), что вы можете наблюдать в итоговом массиве. Прошу помощи.
Необходимо было получить данные об иконке в файле, для чего я написал такой скрипт, согласно документации. В скрипте переменная $sByte — это считанные данные из файла, в которых содержится информация о количестве изображений в иконке (count), размеры изображений (width, height), количество битов на пиксель (bpp), размер изображения в байтах (size) и индекс изображения (index). $tagICONS_HEADER — это заголовок данных, в котором узнаем количество иконок. $tagICONS_INFO — каталог информации об изображении, представляет собой последовательные записи фиксированного размера 14 байт (в документации почему-то указано 16 байт), следующие одна за другой. Количество записей определяется полем count заголовка.
Первая строка ($sByte) содержит информацию о десяти изображениях с индексами от 1 до 10. Вторая короткая строка бинарных данных ($sByte) содержит информацию об одной иконке, ее индекс (index) равен 11.
Вроде бы не сложно, но возникает баг при чтении — каждая нечетная запись содержит ошибку в последних двух числах (size и index), что вы можете наблюдать в итоговом массиве. Прошу помощи.
Код:
#include <WinAPIGdi.au3>
#include <APIResConstants.au3>
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <StaticConstants.au3>
#include <WinAPIIcons.au3>
#include <WinAPIRes.au3>
#include <Array.au3>
Local $tagICONS_HEADER = 'word;word type;word count'
Local $tagICONS_INFO = 'byte width;byte height;byte colors;byte;word planes;word bpp;dword size;word index'
Local $sByte = '0x0000'&'0100'&'0A00'& _
'00'&'00'&'00'&'00'&'0100'&'2000'&'28200400'&'0100'& _
'80'&'80'&'00'&'00'&'0100'&'2000'&'28080100'&'0200'& _
'60'&'60'&'00'&'00'&'0100'&'2000'&'A8940000'&'0300'& _
'50'&'50'&'00'&'00'&'0100'&'2000'&'E8670000'&'0400'& _
'48'&'48'&'00'&'00'&'0100'&'2000'&'88540000'&'0500'& _
'40'&'40'&'00'&'00'&'0100'&'2000'&'28420000'&'0600'& _
'30'&'30'&'00'&'00'&'0100'&'2000'&'A8250000'&'0700'& _
'20'&'20'&'00'&'00'&'0100'&'2000'&'A8100000'&'0800'& _
'18'&'18'&'00'&'00'&'0100'&'2000'&'88090000'&'0900'& _
'10'&'10'&'00'&'00'&'0100'&'2000'&'68040000'&'0A00'
Local $sByte = '0x0000'&'0100'&'0100'& _
'10'&'10'&'00'&'00'&'0100'&'2000'&'68040000'&'0B00'
Local $tModify = DllStructCreate("byte[" & BinaryLen($sByte) & "]")
DllStructSetData($tModify, 1, $sByte)
Local $pData = DllStructGetPtr($tModify, 1)
_ArrayDisplay(_Icon_GetCountSize($pData))
Func _Icon_GetCountSize($pData)
Local $tIcon, $tData = DllStructCreate($tagICONS_HEADER, $pData)
Local $aData[1][5] = [[$tData.count]]
For $i = 0 To $tData.count -1
$tIcon = DllStructCreate('byte[' & 6 + 14 * $i & '];' & $tagICONS_INFO, $pData)
_ArrayAdd($aData, $tIcon.width & '|' & $tIcon.height & '|' & $tIcon.bpp & '|' & $tIcon.size & '|' & $tIcon.index)
Next
Return $aData
EndFunc
Последнее редактирование: