PNG teilweise darstellen - nicht ganze Bilder

  • Guten Abend allerseits,

    ich bin in einer Sackgasse gelandet. Ich suche einen Ausweg mit dessen Hilfe ich per AutoIt PNG's teilweise darstellen kann.
    Ich habe momentan 2 Bildcontatiner:
    1. Bild: PNG als ganzes Hintergrundbild
    2. Bild: kleines Bild auf dem 1. Bild, dass ein PNG-Bild teilweise darstellt (einen Ausschnitt aus der ganzen Bild-Datei)

    Leider hab ich keine Idee, wie man das angehen könnte.
    Könnt ihr mir weiterhelfen?

    Zur Info:
    Mein derzeitiger Ansatz zum darstellen der ganzen PNG-Bilder ist ein angepasstes Beispiel und sieht ungefähr folgendermaßen aus:

    Spoiler anzeigen
    [autoit]


    ; Dies ist (wahrscheinlich) noch kein lauffähiger Quellcode, er soll nur zur Veranschaulichung dienen
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Constants.au3>
    #include <StaticConstants.au3>
    #include <GDIPlus.au3>
    #include <WinAPI.au3>

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

    $Pfad_Bild1 = "C:\hintergrund.png" ;füllendes Hintergrundbild hier 800x600px
    $Pfad_Bild2 = "C:\ausschnitt.png" ;dieses Bild ist z.B. 100x100pixel groß, dargestellt werden aber immer nur 40x40 pixel

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

    $Handle_Bild1 = GUICtrlCreatePic("", 0, 0,800,600, BitOR($SS_NOTIFY, $WS_CLIPCHILDREN, $WS_CLIPSIBLINGS), $WS_EX_LAYERED)
    $Handle_Bild2 = GUICtrlCreatePic("",20 , 20, 40, 40)

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

    _GUICtrlStatic_SetPicture($Pfad_Bild1, $Handle_Bild1)
    _GUICtrlStatic_SetPicture($Pfad_Bild2, $Handle_Bild2) ; <-- GENAU hier fehlt mir die Inspiration, wie bekomme ich nur einen Ausschnitt dagestellt?

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

    ;diese beiden Funktionen habe ich größtenteils einem Beispiel entnommen, dass ich mal gefunden habe.

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

    FUnc _GUICtrlStatic_SetPicture($File, $CtrlId)
    local $h_Image = _GDIPlus_ImageLoadFromFile($File)
    local $hScrDC = _WinAPI_GetDC(0)
    local $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
    local $h_Bitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($h_Image)
    _GDIPlus_ImageDispose ($h_Image)
    GUICtrlSetImage($CtrlId, "")
    _SetBitmapToCtrl($CtrlId, $h_Bitmap)
    _WinAPI_DeleteObject ($h_Bitmap)
    EndFUnc

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

    Func _SetBitmapToCtrl($CtrlId, $hBitmap)
    Local Const $STM_SETIMAGE = 0x0172
    Local Const $IMAGE_BITMAP = 0
    Local Const $SS_BITMAP = 0xE
    Local Const $GWL_STYLE = -16

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

    Local $hWnd = GUICtrlGetHandle($CtrlId)
    If $hWnd = 0 Then Return SetError(1, 0, 0)

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

    ; set SS_BITMAP style to control
    Local $oldStyle = DllCall("user32.dll", "long", "GetWindowLong", "hwnd", $hWnd, "int", $GWL_STYLE)
    If @error Then Return SetError(2, 0, 0)
    DllCall("user32.dll", "long", "SetWindowLong", "hwnd", $hWnd, "int", $GWL_STYLE, "long", BitOR($oldStyle[0], $SS_BITMAP))
    If @error Then Return SetError(3, 0, 0)

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

    Local $oldBmp = DllCall("user32.dll", "hwnd", "SendMessage", "hwnd", $hWnd, "int", $STM_SETIMAGE, "int", $IMAGE_BITMAP, "int", $hBitmap)
    If @error Then Return SetError(4, 0, 0)
    If $oldBmp[0] <> 0 Then _WinAPI_DeleteObject($oldBmp[0])
    Return 1
    EndFunc

    [/autoit]

    Für Anregungen und Hilfestellungen wäre ich dankbar.
    Es grüßt

    JStaxton

    Einmal editiert, zuletzt von JStaxton (5. Oktober 2009 um 12:42)

  • Ganz habe ich dich nicht verstanden !
    Also, du möchtest aus einem ganzen Bild einen Ausschnitt kopieren oder?
    Könntest du mal Auflisten, was in dem Programm geschehenn soll?

  • Ein einfacher blick in die Hilfedateien hätte geholfen :D hier ist mal ein Script aus einer dieser Hilfedateien.

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <ScreenCapture.au3>
    #include <WinAPI.au3>
    #include <GuiConstantsEx.au3>

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

    Opt("MustDeclareVars", 1)

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

    ; ===============================================================================================================================
    ; Description ...: Shows how to slice up an image and then put it back together
    ; Author ........: Paul Campbell (PaulIA)
    ; Notes .........:
    ; ===============================================================================================================================

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

    ; ===============================================================================================================================
    ; Global variables
    ; ===============================================================================================================================
    Global $iI, $hBitmap, $hGraphic, $hGUI, $hImage, $aSlice[4]

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

    ; ===============================================================================================================================
    ; Main
    ; ===============================================================================================================================

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

    ; Capture screen region
    $hBitmap = _ScreenCapture_Capture("", 0, 0, 400, 400)

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

    ; Create GUI
    $hGUI = GUICreate("Slicer", 400, 400)
    GUISetState()

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

    ; Initialize GDI+ library
    _GDIPlus_Startup()

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

    ; Slice up screen capture into 4 equal parts
    $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
    $aSlice[0] = _GDIPlus_BitmapCloneArea($hImage, 0, 0, 200, 200)
    $aSlice[1] = _GDIPlus_BitmapCloneArea($hImage, 200, 0, 200, 200)
    $aSlice[2] = _GDIPlus_BitmapCloneArea($hImage, 0, 200, 200, 200)
    $aSlice[3] = _GDIPlus_BitmapCloneArea($hImage, 200, 200, 200, 200)

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

    ; Show each slice
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    for $iI = 0 to 3
    _GDIPlus_GraphicsDrawImage($hGraphic, $aSlice[$iI], 100, 100)
    Sleep(2000)
    next

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

    ; Stitch slices back together again and display
    _GDIPlus_GraphicsDrawImage($hGraphic, $aSlice[0], 0, 0)
    _GDIPlus_GraphicsDrawImage($hGraphic, $aSlice[1], 200, 0)
    _GDIPlus_GraphicsDrawImage($hGraphic, $aSlice[2], 0, 200)
    _GDIPlus_GraphicsDrawImage($hGraphic, $aSlice[3], 200, 200)

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

    ; Loop until user exits
    do
    until GUIGetMsg() = $GUI_EVENT_CLOSE

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

    ; Clean up resources
    _GDIPlus_GraphicsDispose($hGraphic )
    _GDIPlus_ImageDispose ($aSlice[0])
    _GDIPlus_ImageDispose ($aSlice[1])
    _GDIPlus_ImageDispose ($aSlice[2])
    _GDIPlus_ImageDispose ($aSlice[3])
    _GDIPlus_GraphicsDispose($hImage )
    _WinAPI_DeleteObject ($hBitmap )

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

    ; Shut down GDI+ library
    _GDIPlus_ShutDown()

    [/autoit]


    Die Funktion die dir weiterhilft ist _GDIPlus_BitmapCloneArea
    Hoffe das hat erstmal geholfen.

    Meine Projekte:
    ClipBoard Manager (beendet)
    Gutes ClipBoard Verwaltungs Programm mit nützlichen Funktionen.

    HTML Creator (beendet)
    Nützliches Tool um schnell ein eigenes HTML Dokument zu erstellen.

  • Hallo zusammen!

    Danke für den Hinweis. Wieder einmal hab ich den Wald vor lauter Bäumen nicht gesehen!
    Der Befehl

    [autoit]

    _GDIPlus_BitmapCloneArea($hBmp, $iLeft, $iTop, $iWidth, $iHeight[, $iFormat = 0x00021808])

    [/autoit]

    macht genau das was ich brauche. Diesen habe ich in meine Funtion eingebaut und schon ging es (nach ein wenig Rumprobieren)

    Ich bedanke mich für die schnelle und kompetente Hilfe
    JStaxton