GDI + Png in bestimmter Größe laden, GDI + Bilder setzen

  • Hallo,

    ich habe mich noch so gut wie noch gar nicht mit GDI + beschäftigt, daher komme ich auch nicht ganz voran.

    Ich habe einmal 2 Fragen :

    1. Wie kann ich ein Bild in GDI + in einer bestimmten Größe laden, also z.B. soll sie in 222x133 angezeigt werden. Wie ein Bild geladen wird, habe ich hier schon einmal ( soll auch bei png´s funktionieren ) :

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup()
    $Form1 = GUICreate("Test", 271, 240, 192, 124)
    $Label1 = GUICtrlCreateLabel("Pfad", 8, 8, 44, 17)
    $Input1 = GUICtrlCreateInput("", 56, 8, 121, 21)
    $Button1 = GUICtrlCreateButton("...", 184, 8, 75, 25)
    $Pic1 = GUICtrlCreatePic("", 8, 48, 252, 180)
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    _GDIPlus_Shutdown()
    Exit
    Case $Button1
    $Pfad = FileOpenDialog("Bild auswählen","C:\","Alles (*.*)")
    If Not @error Then DisplayImage($Pic1, $Pfad)
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func DisplayImage($id, $file)
    Local Const $IMAGE_BITMAP = 0
    Local Const $STM_SETIMAGE = 0x0172
    Local $hImage = _GDIPlus_ImageLoadFromFile($file)
    If @error Then Return SetError(1, 0, 0)
    Local $hHBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    _GDIPlus_ImageDispose($hImage)
    _WinAPI_DeleteObject(GUICtrlSendMsg($id, $STM_SETIMAGE, $IMAGE_BITMAP, $hHBitmap))
    _WinAPI_DeleteObject($hHBitmap)
    EndFunc

    [/autoit]


    Aber wie mache ich es nun, dass es in 222x133 geladen wird?

    2. Gibt es eine Funktion wie ohne GDI + GuiCtrlSetImage ? Das Ganze soll auch bei png´s funktionieren.

    Danke im voraus.

    MfG , Julien

    Einmal editiert, zuletzt von Julien (12. Februar 2012 um 00:46)

  • Das geht viel einfacher, du hast also ein Bild ( 222x133 ) und willst das auch so groß anzeigen?

    [autoit]

    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($DeineGui) ; $DeineGui bekommste wenn du GuiCreate() machst.
    $Image = _GDIPlus_ImageLoadFromFile("Pfad") ; Für $Image kannste halt was anderes nehmen
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $Image, 0, 0, 222, 133) ; $hGraphics ist das Handle zur GUI

    [/autoit]

    mfg
    Hauke

  • Hast deine Hausaufgaben nicht gemacht!

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup()
    $Form1 = GUICreate("Test", 271, 240, 192, 124)
    $Label1 = GUICtrlCreateLabel("Pfad", 8, 8, 44, 17)
    $Input1 = GUICtrlCreateInput("", 56, 8, 121, 21)
    $Button1 = GUICtrlCreateButton("...", 184, 8, 75, 25)
    $Pic1 = GUICtrlCreatePic("", 8, 48, 252, 180)
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    _GDIPlus_Shutdown()
    Exit
    Case $Button1
    $Pfad = FileOpenDialog("Bild auswählen","C:\","Alles (*.*)")
    If Not @error Then DisplayImage($Pic1, $Pfad)
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func DisplayImage($id, $file)
    Local Const $IMAGE_BITMAP = 0
    Local Const $STM_SETIMAGE = 0x0172
    Local $hImage = _GDIPlus_ImageLoadFromFile($file)
    If @error Then Return SetError(1, 0, 0)
    $aPos = ControlGetPos("", "", $id)
    If @error Then Return SetError(2, 0, 0)
    Local Const $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $aPos[2], "int", $aPos[3], "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0)
    Local Const $hBitmap = $aResult[6]
    Local Const $hCtxt = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "handle", $hCtxt, "int", 7)
    _GDIPlus_GraphicsDrawImageRect($hCtxt, $hImage, 0, 0, $aPos[2], $aPos[3])
    Local $hHBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_GraphicsDispose($hCtxt)
    _WinAPI_DeleteObject(GUICtrlSendMsg($id, $STM_SETIMAGE, $IMAGE_BITMAP, $hHBitmap))
    _WinAPI_DeleteObject($hHBitmap)
    EndFunc

    [/autoit]

    Neue Hausaufgabe: erweitere den Code, so dass das Bild im richtigen Verhältnis angezeigt wird (keine Verzerrung).


    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • UEZ : Ja, die neue Hausaufgabe mache ich morgen fertig ;P
    Welches soll ich nun von euch beiden nehmen? Welches ist denn besser?
    Ehm, wenn ich nun ein Bild mit einer eurer beiden Skripte setze und dies Bild nachher verändern möchte, wie mache ich dies?
    Wie bei GuiCtrlSetImage ...

    Mit freundlichen Grüßen,

    Julien

  • Ehm, wenn ich nun ein Bild mit einer eurer beiden Skripte setze und dies Bild nachher verändern möchte, wie mache ich dies?


    Also für das untere Beispiel sollte es reichen, die Funktion
    "DisplayImage($id, $file)"
    einfach nochmal aufzurufen mit dem geänderten "$file"
    bzw. einfach den ...Button benutzen

    Einmal editiert, zuletzt von darius83 (12. Februar 2012 um 00:50)