Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Как из формата PNG сделать формат ICO

Ответить
Настройки темы
[решено] Как из формата PNG сделать формат ICO

Пользователь


Сообщения: 62
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: assch
Дата: 25-07-2010
Можно ли средствами Autoit из формата - PNG - сделать формат - ICO

Отправлено: 23:35, 24-07-2010

 

Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Можно.

Заголовок темы сперва нужно указать более расширено, чтобы отражал суть темы.

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 00:14, 25-07-2010 | #2



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

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


Пользователь


Сообщения: 62
Благодарности: 0

Профиль | Отправить PM | Цитировать


Это набор функций или есть специальная функция для конвертации подобного рода.
На сайте Русское сообщество в одной из тем вроде нашёл какую то зацепку (хотя могу и ошибатся).

$hIcon = DllCall($ghGDIPDll, 'int', 'GdipCreateHICONFromBitmap', 'ptr', $hImage, 'int*', 0)

Пытаюсь обыграть её, но увы пока не получается. Хотя как я уже говорил это может быть тупиковый вариант.
Конечно найти самому это не сравнимо интересней. Но время, время. Вот воистину не восполнимый ресурс.
Если можно пример как это делается.

Последний раз редактировалось assch, 25-07-2010 в 10:09.


Отправлено: 00:35, 25-07-2010 | #3


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Продублирую на всякий случай решение и тут:

Код: Выделить весь код
#include <GDIPlus.au3>

$sImageFile = FileOpenDialog('Select PNG File', '', 'Images (*.png;*.bmp;*.jpg;*.jepg;*.gif)')
If @error Then Exit

$sIcoFile = @DesktopDir & "\" & StringRegExpReplace($sImageFile, '^.*\\|\.[^\.]*$', '') & '.ico'

_ImageConvertToIco($sImageFile, $sIcoFile, 32, 32)

Func _ImageConvertToIco($sImageFile, $sOutIconFile, $iWidth = -1, $iHeight = -1)
	Local $hImage, $HICON, $sTmp
	
	If $iWidth <> -1 And $iHeight <> -1 Then
		$sTmp = @TempDir & '\~_ImageConvertToIco.' & StringRegExpReplace($sImageFile, '^.*\.', '')
		__ImageResize($sImageFile, $sTmp, $iWidth, $iHeight)
		$sImageFile = $sTmp
	EndIf
	
	; Start GDIPlus
	_GDIPlus_Startup()
    ; Load image
	$hImage = _GDIPlus_ImageLoadFromFile($sImageFile)
	; create a HICON from the image
	$HICON = __GDIPlus_BitmapCreateHICONFromBitmap($hImage)
	;Clean up and shutdown GDIPlus
	_GDIPlus_ImageDispose($hImage)
	_GDIPlus_Shutdown()
	; create an ico file from the image
	__CreateIconFileFromHICON($HICON, $sOutIconFile)
	; Destroy the HICON now I've finished with it.
	_WinAPI_DestroyIcon($HICON)
	; Remove temporary file
	If $sTmp <> '' And FileExists($sTmp) Then
		FileDelete($sTmp)
	EndIf
EndFunc ;==>_ImageConvertToIco

Func __ImageResize($sFile, $sOutput, $iWidth, $iHeight)
    Local $hBMP, $hImage1, $hImage2, $hGraphic
    _GDIPlus_Startup()
    $hBMP = _WinAPI_CreateBitmap($iWidth, $iHeight, 1, 32) ; Create a bitmap (handle)
    $hImage1 = _GDIPlus_BitmapCreateFromHBITMAP($hBMP)  ; Create a bitmap object from a bitmap handle.
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage1) ; Get the graphic context of the blank bitmap.
    $hImage2 = _GDIPlus_ImageLoadFromFile($sFile)   ; Load the image you want to resize.
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hImage2, 0, 0, $iWidth, $iHeight) ;Draw the loaded image to the graphics of the blank bitmap at the size you want.
    _GDIPlus_ImageSaveToFile($hImage1, $sOutput)
    _GDIPlus_ImageDispose($hImage1)
    _GDIPlus_ImageDispose($hImage2)
    _GDIPlus_GraphicsDispose($hGraphic)
    _WinAPI_DeleteObject($hBMP)
    _GDIPlus_Shutdown()
EndFunc ;==>__ImageResize

Func __CreateIconFileFromHICON($HICON, $sOutIcon)
    Local $aInfo, $sIco, $sBmp, $hCDC, $tBI, $tBits, $iSz, $sBD, $FO
    ; Start of single icon Header 3 x 2 bytes = 6 bytes: 0000 Reserved / 0100 icon / 0100 Numer of icons, total length will be 22 bytes for a single icon when finished
    $sIco = "0x000001000100"
    ; Start of the Bitmap data header 1 x 4bytes: length of the header will be 40 bytes when finished. Will be appended to the end of the icon header when finished
    $sBmp = "28000000"
    ; Get info about the HICON, this is mainly to get the pointers to the Color/Mask bitmaps data
    $aInfo = _WinAPI_GetIconInfo($HICON)
    ; create a memory Compatable DC
    $hCDC = _WinAPI_CreateCompatibleDC(0)
    ; create a BITMAPINFO Struct to store the Bitmap Info, it needs to be inilialized by setting the struct size.
    $tBI = DllStructCreate($tagBITMAPINFO)
    DllStructSetData($tBI, "Size", DllStructGetSize($tBI))
    ; Pass a bitmap data pointer to the BITMAPINFO struct so we can recieve the details of the color bitmap data, we use it to write the headers
    _WinAPI_GetDIBits($hCDC, $aInfo[5], 0, 0, 0, DllStructGetPtr($tBI), 0)
    ; Now we have some the basic info to add to the icon & Bitmap header so we'll add that to the headers.
    $sIco &= Hex(DllStructGetData($tBI, "Width"), 2) & Hex(DllStructGetData($tBI, "Height"), 2) & "00000100" & _
		__StringReverseBytes(Hex(DllStructGetData($tBI, "BitCount"), 4))
    $sBmp &= __StringReverseBytes(Hex(DllStructGetData($tBI, "Width"))) & __StringReverseBytes(Hex(DllStructGetData($tBI, "Height") * 2)) & "0100" & _
		__StringReverseBytes(Hex(DllStructGetData($tBI, "BitCount"), 4)) & "00000000"
    ; Get the size of the Bitmap data from the BITMAPINFO Struct, we'll use this in the headers further on.
    $iSz = DllStructGetData($tBI, "SizeImage")
    ; create a struct to store the Bitmap data Bits of the first bitmap, reset the BITMAPINFO struct
    $tBits = DllStructCreate("byte[" & DllStructGetData($tBI, "SizeImage") & "]")
    ; Get the color bitmap dib bits into the $tBits struct.
    DllCall('gdi32.dll', 'int', 'GetBitmapBits', 'ptr', $aInfo[5], 'int', $iSz, 'ptr', DllStructGetPtr($tBits))
    ; Get GetBitmapBits returns Bottom to Top dib, so I turn it to Top to Bottom dib ;)
    ; ATM I'm only assuming that GetBitmapBits returns a Bottom to Top dib, maybe the bitmap bits you use could be Top Down already?.
    For $i = DllStructGetData($tBI, "SizeImage") + 1 To 0 Step -(DllStructGetData($tBI, "SizeImage") / DllStructGetData($tBI, "Height"))
        $sBD &= StringTrimLeft(BinaryMid(DllStructGetData($tBits, 1), $i, (DllStructGetData($tBI, "SizeImage") / DllStructGetData($tBI, "Height"))), 2)
    Next
    ;Clear the BITMAPINFO & $tBits Struct as we'll use the same variables again for the mask bitmap data
    $tBits = 0
    $tBI = 0
    ; create a BITMAPINFO Struct to store the Bitmap Info again, it needs to be inilialized by setting the struct size.
    $tBI = DllStructCreate($tagBITMAPINFO)
    DllStructSetData($tBI, "Size", DllStructGetSize($tBI))
    ; Pass a bitmap data pointer to the BITMAPINFO struct so we can recieve the details of the bitmask bitmap data
    _WinAPI_GetDIBits($hCDC, $aInfo[4], 0, 0, 0, DllStructGetPtr($tBI), 0)
    ; We've finished with the Compatable DC, delete it.
    _WinAPI_DeleteDC($hCDC)
    ; Add the size of the of the color + bitmask bitmap data as we need this for both the icon & Bitmap header
    $iSz += DllStructGetData($tBI, "SizeImage")
    ; combine the bitmap data size with the bitmap header, I'm padding the rest of the 40 byte bitmap header with 0's., that's the Bitmap header done
    $sBmp &= __StringReverseBytes(Hex($iSz)) & "00000000000000000000000000000000"
    ; Now add the size of the Bitmap data + bitmap header size and combine the icon header together with the bitmap header and color bitmap data
    $sIco &= __StringReverseBytes(Hex($iSz + 40)) & __StringReverseBytes(Hex("22")) & $sBmp & $sBD
    ; create a struct to store the Bitmap dib Bits of the mask bitmap
    $tBits = DllStructCreate("byte[" & DllStructGetData($tBI, "SizeImage") & "]")
    ; Get the mask bitmap dib bits into the $tBits struct.
    DllCall('gdi32.dll', 'int', 'GetBitmapBits', 'ptr', $aInfo[4], 'int', DllStructGetData($tBI, "SizeImage"), 'ptr', DllStructGetPtr($tBits))
    ; Get GetBitmapBits returns Bottom to Top dib, so I turn it to a Top to Bottom dib and append the mask bitmap data to the icon
    For $i = DllStructGetData($tBI, "SizeImage") + 1 To 0 Step -(DllStructGetData($tBI, "SizeImage") / DllStructGetData($tBI, "Height"))
        $sIco &= StringTrimLeft(BinaryMid(DllStructGetData($tBits, 1), $i, (DllStructGetData($tBI, "SizeImage") / DllStructGetData($tBI, "Height"))), 2)
    Next
    ; Write the icon to a file.
    $FO = FileOpen($sOutIcon, 18)
    FileWrite($sOutIcon, Binary($sIco))
    FileClose($FO)
    ; Clear the structs
    $tBits = 0
    $tBI = 0
EndFunc   ;==>_CreateIconFileFromHICON

; Reverse Byte String
Func __StringReverseBytes($sByte)
    Local $aX = StringRegExp($sByte, "(.{2})", 3), $sX = ''
    For $i = UBound($aX) - 1 To 0 Step -1
        $sX &= $aX[$i]
    Next
    Return $sX
EndFunc   ;==>__StringReverseBytes

Func __GDIPlus_BitmapCreateHICONFromBitmap($hBitmap)
    Local $HICON

    $HICON = DllCall($ghGDIPDll, "int", "GdipCreateHICONFromBitmap", "hwnd", $hBitmap, "int*", 0)
    If @error Then Return SetError(@error, 0, -1)
    Return SetError($HICON[0], 0, $HICON[2])
EndFunc   ;==>_GDIPlus_BitmapCreateHICONFromBitmap

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 02:10, 26-07-2010 | #4


Аватара для FlatX007

Ветеран


Сообщения: 553
Благодарности: 87

Профиль | Отправить PM | Цитировать


Иконки получаются не многостраничные! я знаю что это уже наглость но всё же

Отправлено: 08:34, 26-07-2010 | #5


Пользователь


Сообщения: 62
Благодарности: 0

Профиль | Отправить PM | Цитировать


Creat0R Большое спасибо за код.
Жалко что иконки получаются не полноценными . (Я имею ввиду формат PNG прозрачные пиксили сделать не удалось)
А может быть всё таки можно раскатать эту тему? Как вы думаете.
Присоединяюсь к FlatX007 это уже наглость, но всё же вопрос к знатокам.

Как говорили древнии "Хочешь быть ещё богаче - Поделись."

Отправлено: 13:46, 26-07-2010 | #6


Пользователь


Сообщения: 62
Благодарности: 0

Профиль | Отправить PM | Цитировать


Иконки не прозрачные были от того наверное, что перед конвертацией стояла функция которая обрезала файл под классические размеры иконки,
в данном случае 32 на 32.Она и гасила прозрачные пиксилы. Я попробЫвал убрать этот участок кода подставив файл PNG уже обрезанный правда под размер 48 на 48
Эта иконка просто так лучше смотрится и вроде получилось. Можно файл и не обрезать оставить его как есть например 256 на 256
(У меня был именно такой размер файла PNG ) Система его всё равно сделает стандартно маленьким(Правда есть одно но если эту иконку стандартно поставить
например в кнопку она будет отображаться на все свои размеры )Короче я отвлёкся.
Нужен другой код в начале этой основной функции (Большое спасибо за неё Креатору ) Чтобы он обрезал под предложенные размеры и чтобы он не гасил прозрачные пиксилы.
Попробую покапать дальше но, и не откажусь от советов.


Код: Выделить весь код
#include <GDIPlus.au3>

$sIcoFile = @DesktopDir & '\Test.ico'


    _GDIPlus_Startup()
    ; Load image
    $hImage = _GDIPlus_ImageLoadFromFile("48.png")
    ; create a HICON from the image
    $HICON = __GDIPlus_BitmapCreateHICONFromBitmap($hImage)
    ;Clean up and shutdown GDIPlus
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()
    ; create an ico file from the image
    __CreateIconFileFromHICON($HICON, $sIcoFile)
    ; Destroy the HICON now I've finished with it.
    _WinAPI_DestroyIcon($HICON)
    
Func __CreateIconFileFromHICON($HICON, $sOutIcon)
    Local $aInfo, $sIco, $sBmp, $hCDC, $tBI, $tBits, $iSz, $sBD, $FO
    ; Start of single icon Header 3 x 2 bytes = 6 bytes: 0000 Reserved / 0100 icon / 0100 Numer of icons, total length will be 22 bytes for a single icon when finished
    $sIco = "0x000001000100"
    ; Start of the Bitmap data header 1 x 4bytes: length of the header will be 40 bytes when finished. Will be appended to the end of the icon header when finished
    $sBmp = "28000000"
    ; Get info about the HICON, this is mainly to get the pointers to the Color/Mask bitmaps data
    $aInfo = _WinAPI_GetIconInfo($HICON)
    ; create a memory Compatable DC
    $hCDC = _WinAPI_CreateCompatibleDC(0)
    ; create a BITMAPINFO Struct to store the Bitmap Info, it needs to be inilialized by setting the struct size.
    $tBI = DllStructCreate($tagBITMAPINFO)
    DllStructSetData($tBI, "Size", DllStructGetSize($tBI))
    ; Pass a bitmap data pointer to the BITMAPINFO struct so we can recieve the details of the color bitmap data, we use it to write the headers
    _WinAPI_GetDIBits($hCDC, $aInfo[5], 0, 0, 0, DllStructGetPtr($tBI), 0)
    ; Now we have some the basic info to add to the icon & Bitmap header so we'll add that to the headers.
    $sIco &= Hex(DllStructGetData($tBI, "Width"), 2) & Hex(DllStructGetData($tBI, "Height"), 2) & "00000100" & _
        __StringReverseBytes(Hex(DllStructGetData($tBI, "BitCount"), 4))
    $sBmp &= __StringReverseBytes(Hex(DllStructGetData($tBI, "Width"))) & __StringReverseBytes(Hex(DllStructGetData($tBI, "Height") * 2)) & "0100" & _
        __StringReverseBytes(Hex(DllStructGetData($tBI, "BitCount"), 4)) & "00000000"
    ; Get the size of the Bitmap data from the BITMAPINFO Struct, we'll use this in the headers further on.
    $iSz = DllStructGetData($tBI, "SizeImage")
    ; create a struct to store the Bitmap data Bits of the first bitmap, reset the BITMAPINFO struct
    $tBits = DllStructCreate("byte[" & DllStructGetData($tBI, "SizeImage") & "]")
    ; Get the color bitmap dib bits into the $tBits struct.
    DllCall('gdi32.dll', 'int', 'GetBitmapBits', 'ptr', $aInfo[5], 'int', $iSz, 'ptr', DllStructGetPtr($tBits))
    ; Get GetBitmapBits returns Bottom to Top dib, so I turn it to Top to Bottom dib ;)
    ; ATM I'm only assuming that GetBitmapBits returns a Bottom to Top dib, maybe the bitmap bits you use could be Top Down already?.
    For $i = DllStructGetData($tBI, "SizeImage") + 1 To 0 Step -(DllStructGetData($tBI, "SizeImage") / DllStructGetData($tBI, "Height"))
        $sBD &= StringTrimLeft(BinaryMid(DllStructGetData($tBits, 1), $i, (DllStructGetData($tBI, "SizeImage") / DllStructGetData($tBI, "Height"))), 2)
    Next
    ;Clear the BITMAPINFO & $tBits Struct as we'll use the same variables again for the mask bitmap data
    $tBits = 0
    $tBI = 0
    ; create a BITMAPINFO Struct to store the Bitmap Info again, it needs to be inilialized by setting the struct size.
    $tBI = DllStructCreate($tagBITMAPINFO)
    DllStructSetData($tBI, "Size", DllStructGetSize($tBI))
    ; Pass a bitmap data pointer to the BITMAPINFO struct so we can recieve the details of the bitmask bitmap data
    _WinAPI_GetDIBits($hCDC, $aInfo[4], 0, 0, 0, DllStructGetPtr($tBI), 0)
    ; We've finished with the Compatable DC, delete it.
    _WinAPI_DeleteDC($hCDC)
    ; Add the size of the of the color + bitmask bitmap data as we need this for both the icon & Bitmap header
    $iSz += DllStructGetData($tBI, "SizeImage")
    ; combine the bitmap data size with the bitmap header, I'm padding the rest of the 40 byte bitmap header with 0's., that's the Bitmap header done
    $sBmp &= __StringReverseBytes(Hex($iSz)) & "00000000000000000000000000000000"
    ; Now add the size of the Bitmap data + bitmap header size and combine the icon header together with the bitmap header and color bitmap data
    $sIco &= __StringReverseBytes(Hex($iSz + 40)) & __StringReverseBytes(Hex("22")) & $sBmp & $sBD
    ; create a struct to store the Bitmap dib Bits of the mask bitmap
    $tBits = DllStructCreate("byte[" & DllStructGetData($tBI, "SizeImage") & "]")
    ; Get the mask bitmap dib bits into the $tBits struct.
    DllCall('gdi32.dll', 'int', 'GetBitmapBits', 'ptr', $aInfo[4], 'int', DllStructGetData($tBI, "SizeImage"), 'ptr', DllStructGetPtr($tBits))
    ; Get GetBitmapBits returns Bottom to Top dib, so I turn it to a Top to Bottom dib and append the mask bitmap data to the icon
    For $i = DllStructGetData($tBI, "SizeImage") + 1 To 0 Step -(DllStructGetData($tBI, "SizeImage") / DllStructGetData($tBI, "Height"))
        $sIco &= StringTrimLeft(BinaryMid(DllStructGetData($tBits, 1), $i, (DllStructGetData($tBI, "SizeImage") / DllStructGetData($tBI, "Height"))), 2)
    Next
    ; Write the icon to a file.
    $FO = FileOpen($sOutIcon, 18)
    FileWrite($sOutIcon, Binary($sIco))
    FileClose($FO)
    ; Clear the structs
    $tBits = 0
    $tBI = 0
EndFunc   ;==>_CreateIconFileFromHICON

; Reverse Byte String
Func __StringReverseBytes($sByte)
    Local $aX = StringRegExp($sByte, "(.{2})", 3), $sX = ''
    For $i = UBound($aX) - 1 To 0 Step -1
        $sX &= $aX[$i]
    Next
    Return $sX
EndFunc   ;==>__StringReverseBytes

Func __GDIPlus_BitmapCreateHICONFromBitmap($hBitmap)
    Local $HICON

    $HICON = DllCall($ghGDIPDll, "int", "GdipCreateHICONFromBitmap", "hwnd", $hBitmap, "int*", 0)
    If @error Then Return SetError(@error, 0, -1)
    Return SetError($HICON[0], 0, $HICON[2])
EndFunc   ;==>_GDIPlus_BitmapCreateHICONFromBitmap

Последний раз редактировалось assch, 23-04-2012 в 01:40.


Отправлено: 16:38, 26-07-2010 | #7


Пользователь


Сообщения: 62
Благодарности: 0

Профиль | Отправить PM | Цитировать


Вот код который выставил на другом сайте Creat0R за что ему большое спасибо.
Файл 48.png можно взять чуть по выше.





Код: Выделить весь код
#include <GDIPlus.au3>

$sImageFile = FileOpenDialog('Select PNG File', '', 'Images (*.png;*.bmp;*.jpg;*.jpeg;*.gif)')
If @error Then Exit

$sIcoFile = @DesktopDir & "\" & StringRegExpReplace($sImageFile, '^.*\\|\.[^\.]*$', '') & '.ico'

_ImageConvertToIco($sImageFile, $sIcoFile, 48, 48)
ShellExecute($sIcoFile)

Func _ImageConvertToIco($sImageFile, $sOutIconFile, $iWidth = -1, $iHeight = -1)
    Local $sTmp, $hImage, $hGC, $hBmp, $hBmpGC, $HICON
    ; Start GDIPlus
    _GDIPlus_Startup()
    If $iWidth <> -1 And $iHeight <> -1 Then
        $sTmp = @TempDir & '\~_ImageConvertToIco.' & StringRegExpReplace($sImageFile, '^.*\.', '')
        ; Load Image
        $hImage = _GDIPlus_ImageLoadFromFile($sImageFile)
        ;Create New image
        $hGC = _GDIPlus_ImageGetGraphicsContext($hImage)
        $hBmp = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGC)
        $hBmpGC = _GDIPlus_ImageGetGraphicsContext($hBmp)
        ;Draw
        _GDIPlus_GraphicsDrawImageRect($hBmpGC, $hImage, 0, 0, $iWidth, $iHeight)
        _GDIPlus_ImageSaveToFile($hBmp, $sTmp)
        ;Clenaup
        _GDIPlus_GraphicsDispose($hGC)
        _GDIPlus_GraphicsDispose($hBmpGC)
        _GDIPlus_BitmapDispose($hBmp)
        _GDIPlus_ImageDispose($hImage)
        $sImageFile = $sTmp
    EndIf
    ; Load image
    $hImage = _GDIPlus_ImageLoadFromFile($sImageFile)
    ; create a HICON from the image
    $HICON = __GDIPlus_BitmapCreateHICONFromBitmap($hImage)
    ;Clean up and shutdown GDIPlus
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()
    ; create an ico file from the image
    __CreateIconFileFromHICON($HICON, $sOutIconFile)
    ; Destroy the HICON now I've finished with it.
    _WinAPI_DestroyIcon($HICON)
    ; Remove temporary file
    If $sTmp <> '' And FileExists($sTmp) Then
        FileDelete($sTmp)
    EndIf
EndFunc ;==>_ImageConvertToIco

Func __CreateIconFileFromHICON($HICON, $sOutIcon)
    Local $aInfo, $sIco, $sBmp, $hCDC, $tBI, $tBits, $iSz, $sBD, $FO
    ; Start of single icon Header 3 x 2 bytes = 6 bytes: 0000 Reserved / 0100 icon / 0100 Numer of icons, total length will be 22 bytes for a single icon when finished
    $sIco = "0x000001000100"
    ; Start of the Bitmap data header 1 x 4bytes: length of the header will be 40 bytes when finished. Will be appended to the end of the icon header when finished
    $sBmp = "28000000"
    ; Get info about the HICON, this is mainly to get the pointers to the Color/Mask bitmaps data
    $aInfo = _WinAPI_GetIconInfo($HICON)
    ; create a memory Compatable DC
    $hCDC = _WinAPI_CreateCompatibleDC(0)
    ; create a BITMAPINFO Struct to store the Bitmap Info, it needs to be inilialized by setting the struct size.
    $tBI = DllStructCreate($tagBITMAPINFO)
    DllStructSetData($tBI, "Size", DllStructGetSize($tBI))
    ; Pass a bitmap data pointer to the BITMAPINFO struct so we can recieve the details of the color bitmap data, we use it to write the headers
    _WinAPI_GetDIBits($hCDC, $aInfo[5], 0, 0, 0, DllStructGetPtr($tBI), 0)
    ; Now we have some the basic info to add to the icon & Bitmap header so we'll add that to the headers.
    $sIco &= Hex(DllStructGetData($tBI, "Width"), 2) & Hex(DllStructGetData($tBI, "Height"), 2) & "00000100" & _
        __StringReverseBytes(Hex(DllStructGetData($tBI, "BitCount"), 4))
    $sBmp &= __StringReverseBytes(Hex(DllStructGetData($tBI, "Width"))) & __StringReverseBytes(Hex(DllStructGetData($tBI, "Height") * 2)) & "0100" & _
        __StringReverseBytes(Hex(DllStructGetData($tBI, "BitCount"), 4)) & "00000000"
    ; Get the size of the Bitmap data from the BITMAPINFO Struct, we'll use this in the headers further on.
    $iSz = DllStructGetData($tBI, "SizeImage")
    ; create a struct to store the Bitmap data Bits of the first bitmap, reset the BITMAPINFO struct
    $tBits = DllStructCreate("byte[" & DllStructGetData($tBI, "SizeImage") & "]")
    ; Get the color bitmap dib bits into the $tBits struct.
    DllCall('gdi32.dll', 'int', 'GetBitmapBits', 'ptr', $aInfo[5], 'int', $iSz, 'ptr', DllStructGetPtr($tBits))
    ; Get GetBitmapBits returns Bottom to Top dib, so I turn it to Top to Bottom dib ;)
    ; ATM I'm only assuming that GetBitmapBits returns a Bottom to Top dib, maybe the bitmap bits you use could be Top Down already?.
    For $i = DllStructGetData($tBI, "SizeImage") + 1 To 0 Step -(DllStructGetData($tBI, "SizeImage") / DllStructGetData($tBI, "Height"))
        $sBD &= StringTrimLeft(BinaryMid(DllStructGetData($tBits, 1), $i, (DllStructGetData($tBI, "SizeImage") / DllStructGetData($tBI, "Height"))), 2)
    Next
    ;Clear the BITMAPINFO & $tBits Struct as we'll use the same variables again for the mask bitmap data
    $tBits = 0
    $tBI = 0
    ; create a BITMAPINFO Struct to store the Bitmap Info again, it needs to be inilialized by setting the struct size.
    $tBI = DllStructCreate($tagBITMAPINFO)
    DllStructSetData($tBI, "Size", DllStructGetSize($tBI))
    ; Pass a bitmap data pointer to the BITMAPINFO struct so we can recieve the details of the bitmask bitmap data
    _WinAPI_GetDIBits($hCDC, $aInfo[4], 0, 0, 0, DllStructGetPtr($tBI), 0)
    ; We've finished with the Compatable DC, delete it.
    _WinAPI_DeleteDC($hCDC)
    ; Add the size of the of the color + bitmask bitmap data as we need this for both the icon & Bitmap header
    $iSz += DllStructGetData($tBI, "SizeImage")
    ; combine the bitmap data size with the bitmap header, I'm padding the rest of the 40 byte bitmap header with 0's., that's the Bitmap header done
    $sBmp &= __StringReverseBytes(Hex($iSz)) & "00000000000000000000000000000000"
    ; Now add the size of the Bitmap data + bitmap header size and combine the icon header together with the bitmap header and color bitmap data
    $sIco &= __StringReverseBytes(Hex($iSz + 40)) & __StringReverseBytes(Hex("22")) & $sBmp & $sBD
    ; create a struct to store the Bitmap dib Bits of the mask bitmap
    $tBits = DllStructCreate("byte[" & DllStructGetData($tBI, "SizeImage") & "]")
    ; Get the mask bitmap dib bits into the $tBits struct.
    DllCall('gdi32.dll', 'int', 'GetBitmapBits', 'ptr', $aInfo[4], 'int', DllStructGetData($tBI, "SizeImage"), 'ptr', DllStructGetPtr($tBits))
    ; Get GetBitmapBits returns Bottom to Top dib, so I turn it to a Top to Bottom dib and append the mask bitmap data to the icon
    For $i = DllStructGetData($tBI, "SizeImage") + 1 To 0 Step -(DllStructGetData($tBI, "SizeImage") / DllStructGetData($tBI, "Height"))
        $sIco &= StringTrimLeft(BinaryMid(DllStructGetData($tBits, 1), $i, (DllStructGetData($tBI, "SizeImage") / DllStructGetData($tBI, "Height"))), 2)
    Next
    ; Write the icon to a file.
    $FO = FileOpen($sOutIcon, 18)
    FileWrite($sOutIcon, Binary($sIco))
    FileClose($FO)
    ; Clear the structs
    $tBits = 0
    $tBI = 0
EndFunc   ;==>_CreateIconFileFromHICON

; Reverse Byte String
Func __StringReverseBytes($sByte)
    Local $aX = StringRegExp($sByte, "(.{2})", 3), $sX = ''
    For $i = UBound($aX) - 1 To 0 Step -1
        $sX &= $aX[$i]
    Next
    Return $sX
EndFunc   ;==>__StringReverseBytes

Func __GDIPlus_BitmapCreateHICONFromBitmap($hBitmap)
    Local $HICON

    $HICON = DllCall($ghGDIPDll, "int", "GdipCreateHICONFromBitmap", "hwnd", $hBitmap, "int*", 0)
    If @error Then Return SetError(@error, 0, -1)
    Return SetError($HICON[0], 0, $HICON[2])
EndFunc   ;==>_GDIPlus_BitmapCreateHICONFromBitmap

Отправлено: 19:44, 26-07-2010 | #8


Аватара для FlatX007

Ветеран


Сообщения: 553
Благодарности: 87

Профиль | Отправить PM | Цитировать


Изображения
Тип файла: png Image00010.png
(115.0 Kb, 19 просмотров)

Всё же непонятно зачем нужна иконка с "одной страницей"

Иконки делаются так :

Отправлено: 23:51, 26-07-2010 | #9


Пользователь


Сообщения: 62
Благодарности: 0

Профиль | Отправить PM | Цитировать


FlatX007, Что за программа?

Отправлено: 18:10, 28-07-2010 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Как из формата PNG сделать формат ICO

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Обои и Значки - Иконки в форматах PNG и ICO и другие ресурсы из Windows 7 (Обновлено) prokazzza Оформление Windows XP 100 29-07-2018 21:42
[решено] Помогите с ICO при ассоциациях. tupica Автоматическая установка приложений 5 11-04-2010 21:59
[решено] Ico значки и темы karman56 Microsoft Windows 95/98/Me (архив) 1 28-11-2009 17:31
Иконки PNG и ICO sergeikom Microsoft Windows Vista 0 13-05-2007 12:52
В png формат Guest Программирование и базы данных 1 08-02-2004 17:16




 
Переход