#Include <WinAPIEx.au3>
Global Const $sFile = @ScriptDir & 'MyIcon.ico'
Global Const $tagICOHEADER = 'ushort Reserved;ushort Type;ushort Count'
Global Const $tagICOENTRY = 'byte Width;byte Height;byte ColorCount;byte Reserved;ushort Planes;ushort BitCount;long Size;long Offset'
Global Const $tagIHDR = 'dword Width;dword Height;byte BitDepth;byte ColorType;byte CompressionMethod;byte FilterMethod;byte InterlaceMethod'
$iSize = FileGetSize($sFile)
$tData = DllStructCreate('byte[' & $iSize & ']')
$pData = DllStructGetPtr($tData)
$hFile = _WinAPI_CreateFile($sFile, 2, 2, 6)
_WinAPI_ReadFile($hFile, $pData, $iSize, $iSize)
_WinAPI_CloseHandle($hFile)
$tHdr = DllStructCreate($tagICOHEADER, $pData)
$Count = DllStructGetData($tHdr, 'Count')
For $i = 1 To $Count
$tEntry = DllStructCreate($tagICOENTRY, $pData + 6 + 16 * ($i - 1))
$pIcon = $pData + DllStructGetData($tEntry, 'Offset')
$Offset = DllStructGetData($tEntry, 'Offset')
If DllStructGetData(DllStructCreate('byte[8]', $pIcon), 1) = Binary('0x89504E470D0A1A0A') Then
; PNG => Retrieve IHDR chunk data (always first chunk, offset = 8)
$tHdr = DllStructCreate($tagIHDR, $pIcon + 16)
$Width = _WinAPI_SwapDWord(DllStructGetData($tHdr, 'Width'))
$Height = _WinAPI_SwapDWord(DllStructGetData($tHdr, 'Height'))
$Png = ' (PNG)'
Else
; ICO => Retrieve BITMAPINFOHEADER structure
$tHdr = DllStructCreate($tagBITMAPINFOHEADER, $pIcon)
$Width = DllStructGetData($tHdr, 'biWidth')
$Height = DllStructGetData($tHdr, 'biHeight') / 2
$Png = ''
EndIf
ConsoleWrite($Width & ' x ' & $Height & ', ' & DllStructGetData($tEntry, 'BitCount') & 'bpp' & $Png & @CR)
Next