Что нового

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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
Простой пример конвертации иконки (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
Сообщения
876
Репутация
239
Можете показать пример с 16 битам, у меня не как не получается. :'(
И желательно проверку, если 16 битный, значит так конвертировать... Если 32х то так...

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

Если это: $GDIP_PXF32ARGB


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

Arei

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

Yashied

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

Ganibal95

GreenBytes
Сообщения
876
Репутация
239
Вот так заработало:
Код:
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
 
Верх