Zohran Posted March 23, 2012 Posted March 23, 2012 (edited) 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 March 23, 2012 by Zohran
Yashied Posted March 23, 2012 Posted March 23, 2012 (edited) expandcollapse popup#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 March 23, 2012 by Yashied Zohran 1 My UDFs: iKey | FTP Uploader | Battery Checker | Boot Manager | Font Viewer | UDF Keyword Manager | Run Dialog Replacement | USBProtect | 3D Axis | Calculator | Sleep | iSwitcher | TM | NetHelper | File Types Manager | Control Viewer | SynFolders | DLL Helper Animated Tray Icons UDF Library | Hotkeys UDF Library | Hotkeys Input Control UDF Library | Caret Shape UDF Library | Context Help UDF Library | Most Recently Used List UDF Library | Icons UDF Library | FTP UDF Library | Script Communications UDF Library | Color Chooser UDF Library | Color Picker Control UDF Library | IPHelper (Vista/7) UDF Library | WinAPI Extended UDF Library | WinAPIVhd UDF Library | Icon Chooser UDF Library | Copy UDF Library | Restart UDF Library | Event Log UDF Library | NotifyBox UDF Library | Pop-up Windows UDF Library | TVExplorer UDF Library | GuiHotKey UDF Library | GuiSysLink UDF Library | Package UDF Library | Skin UDF Library | AITray UDF Library | RDC UDF Library Appropriate path | Button text color | Gaussian random numbers | Header's styles (Vista/7) | ICON resource enumeration | Menu & INI | Tabbed string size | Tab's skin | Pop-up circular menu | Progress Bar without animation (Vista/7) | Registry export | Registry path jumping | Unique hardware ID | Windows alignment More...
Zohran Posted March 23, 2012 Author Posted March 23, 2012 expandcollapse popup#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.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now