Что нового

Уменьшить картинку при выводе в окно

Нубокодер

Новичок
Сообщения
75
Репутация
0
Читаю с инета, сохраняю в файл и вывожу *.png картинку в окно:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
#include <WinAPI.au3>

Global $hGUI, $hImage, $hGraphic, $hImage1
$url_pic = "http://galerey-room.ru/images/000430_1421874270.png"
$s_Dir = @ScriptDir & '/'

; Создаёт GUI
$hGUI = GUICreate("PNG", 750, 550)

InetGet ( $url_pic, $s_Dir & "001" & '.png', 17, 0 ) ; читаю рисунок и записываю в файл 001.png

; Загружю рисунок PNG из файла
_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile ($s_Dir & "001" & '.png')
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)

GUIRegisterMsg($WM_PAINT, "MY_WM_PAINT")
GUISetState()

; Цикл ожидающий выхода
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

; Очищает от ресурсов
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()

; Рисует рисунок PNG
Func MY_WM_PAINT($hWnd, $msg, $wParam, $lParam)
    #forceref $hWnd, $Msg, $wParam, $lParam
    _WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_UPDATENOW)
    _GDIPlus_GraphicsDrawImage($hGraphic, $hImage, 25, 25)
    _WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_VALIDATE)
    Return $GUI_RUNDEFMSG
EndFunc


Состряпал из примера, поэтому мало что понимаю. Помогите пожалуйста - нужно уменьшить изображение на выходе в 4 раза
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Код:
_GDIPlus_GraphicsDrawImageRectRect


Код:
#include <GUIConstantsEx.au3>
#include <ScreenCapture.au3>

Example()

Func Example()
    _GDIPlus_Startup() ;initialize GDI+
    Local Const _
		$iWidth = 800, $iHeight = 600

    Local $hGUI = GUICreate("GDI+ example", $iWidth, $iHeight) ;create a test GUI
    GUISetState(@SW_SHOW)

    Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI) ;create a graphics object from a window handle
    Local $hIA = _GDIPlus_ImageAttributesCreate() ;create an ImageAttribute object

    Local $hHBmp = _ScreenCapture_Capture("", 0, 0, @DesktopWidth, @DesktopHeight) ;create a GDI bitmap by capturing an area on desktop
    Local $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hHBmp) ;convert GDI to GDI+ bitmap
    _WinAPI_DeleteObject($hHBmp) ;release GDI bitmap resource because not needed anymore
    _GDIPlus_GraphicsDrawImageRectRect($hGraphics, $hBitmap, 0, 0, @DesktopWidth, @DesktopHeight, 0, 0, $iWidth, $iHeight) ;draw the bitmap while applying the color adjustment

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()
    GUIDelete($hGUI)
EndFunc   ;==>Example


Можно еще воспользоваться следующей функцией:
Код:
Func _GDIPlus_ImageGetThumbnail($hImg, $iW, $iH)
	Local $aRet
	; ---
	$aRet = DllCall($__g_hGDIPDll, "int", "GdipGetImageThumbnail", "handle", $hImg, "int", $iW, "int", $iH, "int*", 0, "ptr", 0, "ptr", 0)
	If @Error Then _
		Return 0
	; ---
	Return $aRet[4]
EndFunc
 
Автор
Нубокодер

Нубокодер

Новичок
Сообщения
75
Репутация
0
Проблема в том, что это *.png картинка и с ней не все способы работают.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Нубокодер [?]
нужно уменьшить изображение на выходе в 4 раза
Мой вариант (без проверок на ошибки!).
Код:
#include <GDIPlus.au3>
#include <Memory.au3>
#include <WinAPIEx.au3>

Global Const $STM_SETIMAGE = 0x0172, $STM_GETIMAGE = 0x0173

Global $iPic, $hBitmap, $hImage, $hStream, $bData, $hData, $pData, $tData, $aSize, $iLen

HttpSetProxy(1)
$bData = InetRead('http://galerey-room.ru/images/000430_1421874270.png', 17)
If @error Then Exit 13
$iLen = BinaryLen($bData)
$hData = _MemGlobalAlloc($iLen, $GMEM_MOVEABLE)
$pData = _MemGlobalLock($hData)
$tData = DllStructCreate('byte[' & $iLen & ']', $pData)
DllStructSetData($tData, 1, $bData)
_MemGlobalUnlock($hData)
$hStream = _WinAPI_CreateStreamOnHGlobal($hData)
_GDIPlus_Startup()
$hImage = _GDIPlus_BitmapCreateFromStream__($hStream)
$aSize = _GDIPlus_ImageGetDimension__($hImage)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()
_WinAPI_ReleaseStream($hStream)

For $i = 0 To 1
	$aSize[$i] = Int($aSize[$i] / 4)
Next
$hResize = _WinAPI_AdjustBitmap($hBitmap, $aSize[0], $aSize[1])
_WinAPI_DeleteObject($hBitmap)

GUICreate($aSize[0] & 'x' & $aSize[1], $aSize[0], $aSize[1])
$iPic = GUICtrlCreatePic('', 0, 0, $aSize[0], $aSize[1])
GUICtrlSendMsg($iPic, $STM_SETIMAGE, 0, $hResize)
_WinAPI_DeleteObject($hResize)
GUISetState()

Do
Until GUIGetMsg() = -3
_WinAPI_DeleteObject(GUICtrlSendMsg($iPic, $STM_GETIMAGE, 0, 0))

Func _GDIPlus_BitmapCreateFromStream__($hStream)
	Local $aResult = DllCall('GDIPlus.dll', 'uint', 'GdipCreateBitmapFromStream', 'ptr', $hStream, 'int*', 0)
	If (@error) Or ($aResult[0]) Then Return SetError(1, 0, 0)
	Return $aResult[2]
EndFunc   ;==>_GDIPlus_BitmapCreateFromStream__

Func _GDIPlus_ImageGetDimension__($hImage)
	Local $aSize[2], $aResult

	$aResult = DllCall('GDIPlus.dll', 'uint', 'GdipGetImageDimension', 'hwnd', $hImage, 'float*', 0, 'float*', 0)
	If (@error) Or ($aResult[0]) Then Return SetError(1, 0, 0)
	$aSize[0] = $aResult[2]
	$aSize[1] = $aResult[3]
	Return $aSize
EndFunc   ;==>_GDIPlus_ImageGetDimension__
 
Верх