Jump to content
Sign in to follow this  
Zohran

multiple icon file dimensions

Recommended Posts

Zohran

hi.

how to retrieve dimensions of all icons which are present in a single ".ico" file.

this might be useful .

http://www.codeproject.com/Articles/6171/Access-multiple-icons-in-a-single-icon-file

but i cant understand its complexity.

Edited by Zohran

Share this post


Link to post
Share on other sites
Yashied

#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

Edited by Yashied
  • Like 1

Share this post


Link to post
Share on other sites
Zohran

#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

great excellent work.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×