Что нового

Конвертируем .ico в .png

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Простой пример конвертации иконки (HICON) заданного размера в .png файл. Работает только с 32-битными иконками (RGB+Alpha). Для запуска этого примера вам потребуется библиотека WinAPIEx.au3.

Код:
#Include <GDIPlus.au3>
#Include <WinAPIEx.au3>

; Only for 32 bit (RGB + Alpha) icons!

$sPng = @ScriptDir & '\Test.png'
$sIco = @SystemDir & '\shell32.dll'
$Index = 130
$W = 48
$H = 48

_GDIPlus_Startup()
$hIcon = _WinAPI_ShellExtractIcon($sIco, $Index, $W, $H)
$aInfo = _WinAPI_GetIconInfo($hIcon)
$tBits = DllStructCreate('byte[' & (4 * $W * $H) & ']')
$pBits = DllStructGetPtr($tBits)
_WinAPI_GetBitmapBits($aInfo[5], DllStructGetSize($tBits), $pBits)
$hBitmap = _GDIPlus_BitmapCreateFromScan0($W, $H, 4 * $W, $GDIP_PXF32ARGB, $pBits)
_WinAPI_DestroyIcon($hIcon)
For $i = 4 To 5
	_WinAPI_DeleteObject($aInfo[$i])
Next
_GDIPlus_ImageSaveToFile($hBitmap, $sPng)
_GDIPlus_ImageDispose($hBitmap)
_GDIPlus_Shutdown()

Func _GDIPlus_BitmapCreateFromScan0($iWidth, $iHeight, $iStride = 0, $iPixelFormat = 0x0026200A, $pScan0 = 0)

	Local $aResult = DllCall($ghGDIPDll, 'uint', 'GdipCreateBitmapFromScan0', 'int', $iWidth, 'int', $iHeight, 'int', $iStride, 'int', $iPixelFormat, 'ptr', $pScan0, 'ptr*', 0)

	If @error Then
		Return SetError(1, 0, 0)
	Else
		If $aResult[0] Then
			Return SetError($aResult[0], 0, 0)
		EndIf
	EndIf
	Return $aResult[6]
EndFunc   ;==>_GDIPlus_BitmapCreateFromScan0
 

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Можете показать пример с 16 битам, у меня не как не получается. :'(
И желательно проверку, если 16 битный, значит так конвертировать... Если 32х то так...

Смотрите, если поставить это: $GDIP_PXF32RGB
982.309576914064.png

Если это: $GDIP_PXF32ARGB
3140.90662652442.png


Можно ли сделать нормальную функцию!?
 

Arei

Скриптер
Сообщения
938
Репутация
115
Yashied
Подскажите как решить данную проблему.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Просто сконвертируйте 32-битную иконку с помощью функции _WinAPI_Create32BitHICON().
 

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Вот так заработало:
Код:
Func _GAPIPlus_ImageCreateFromIcoFile($sIco, $Index = -1, $W = 32, $H = 32)
	Local $hIcon, $aInfo, $tBits, $pBits, $hBitmap
	_GDIPlus_Startup()
	if $Index == -1 Then
		if $W >= 32 And $H >= 32 Then
			$hIcon = _WinAPI_ShellExtractAssociatedIcon($sIco,0)
		Else
			$hIcon = _WinAPI_ShellExtractAssociatedIcon($sIco,1)
		EndIf
	Else
		$hIcon = _WinAPI_ShellExtractIcon($sIco, $Index, $W, $H)
	EndIf
	$hIcon = _WinAPI_Create32BitHICON($hIcon,1)
	$aInfo = _WinAPI_GetIconInfo($hIcon)
	$tBits = DllStructCreate('byte[' & (4 * $W * $H) & ']')
	$pBits = DllStructGetPtr($tBits)
	_WinAPI_GetBitmapBits($aInfo[5], DllStructGetSize($tBits), $pBits)
	$hBitmap = _GDIPlus_BitmapCreateFromScan0($W, $H, 4 * $W, $GDIP_PXF32ARGB, $pBits) ; $GDIP_PXF32ARGB
	_WinAPI_DestroyIcon($hIcon)
    _WinAPI_DeleteObject($aInfo[4])
	_WinAPI_DeleteObject($aInfo[5])
	_GDIPlus_Shutdown()
	Return $hBitmap
EndFunc
 
Верх