2 Screenshots übereinander (GDI+)

  • Hey zusammen
    Ich möchte einen Skript der 2Bilder (screenshorts) nebeneinander platziert:
    So in etwa (skizze :D)
    _____
    | 1 ....|
    --------
    |....... |
    | 2..... |
    --------

    [autoit]


    $hBmp = _ScreenCapture_Capture("", 0, 0, -1, -1)
    ;... tu was mit $hBmp
    _WinAPI_DeleteObject($hBmp)

    [/autoit]

    Ich möchte aber jetzt wie gesagt 2 übereinander haben.

    Thx für antworten. :thumbup:

    Nur keine Hektik - das Leben ist stressig genug

    4 Mal editiert, zuletzt von Antispeed (5. Mai 2010 um 20:11)

  • Beispiel aus der Hilfe (die scheinbar niemand ließt der es gebrauchen könnte)

    Spoiler anzeigen
    [autoit]

    #AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
    #include <GDIPlus.au3>
    #include <ScreenCapture.au3>
    #include <WinAPI.au3>

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

    Opt('MustDeclareVars', 1)

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

    _Main()

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

    Func _Main()
    Local $hBitmap1, $hBitmap2, $hImage1, $hImage2, $hGraphic, $width, $height

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

    ; Initialisiert (startet) Microsoft Windows GDI+
    _GDIPlus_Startup()

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

    ; Erstellt vom kompletten Bildschirm einen Screenshot
    $hBitmap1 = _ScreenCapture_Capture("")
    $hImage1 = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap1)

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

    ; Erstellt von einem Bereich einen Screenshot
    $hBitmap2 = _ScreenCapture_Capture("", 0, 0, 400, 300)
    $hImage2 = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap2)

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

    $width = _GDIPlus_ImageGetWidth($hImage2)
    $height = _GDIPlus_ImageGetHeight($hImage2)

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

    ; Zeichnet ein Bild in ein anderes
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage1)

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

    ; DrawInsert($hGraphic, $hImage2, $iX, $iY, $nAngle, $iWidth, $iHeight, $iARGB = 0xFF000000, $nWidth = 1)
    DrawInsert($hGraphic, $hImage2, 350, 100, 0, $width + 2, $height + 2, 0xFFFF8000, 2)
    DrawInsert($hGraphic, $hImage2, 340, 50, 15, 200, 150, 0xFFFF8000, 4)
    DrawInsert($hGraphic, $hImage2, 310, 30, 35, $width + 4, $height + 4, 0xFFFF00FF, 4)
    DrawInsert($hGraphic, $hImage2, 320, 790, -35, $width, $height)

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

    ; Speichert das neue Bild
    _GDIPlus_ImageSaveToFile($hImage1, @DesktopDir & "\GDIPlus_Image.jpg")

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

    ; Ressourcen freigeben
    _GDIPlus_ImageDispose($hImage1)
    _GDIPlus_ImageDispose($hImage2)
    _WinAPI_DeleteObject($hBitmap1)
    _WinAPI_DeleteObject($hBitmap2)
    ; Gibt die durch Microsoft Windows GDI+ verwendeten Ressourcen wieder frei
    _GDIPlus_Shutdown()

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

    EndFunc ;==>_Main

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

    ; #FUNCTION# ==================================================================================================
    ; Name...........: DrawInsert
    ; Beschreibung...: Zeichnet ein Bild in ein anderes
    ; Syntax.........: DrawInsert($hGraphic, $hImage2, $iX, $iY, $nAngle, $iWidth, $iHeight, $iARGB = 0xFF000000, $nWidth = 1)
    ; Fügt das Bild $hImage2 in $hGraphic ein
    ;
    ; Parameter......: $hGraphics - Handle zum Grafikobjekt
    ; $hImage - Handle zum einzufügenden Bild-Objekt
    ; $iX - X-Koordinate der oberen linken Ecke des eingefügten Bildes
    ; $iY - Y-Koordinate der oberen linken Ecke des eingefügten Bildes
    ; $iWidth - Breite des Rechteckrahmens um das eingefügte Bild
    ; $iHeight - Höhe des Rechteckrahmens um das eingefügte Bild
    ; $iARGB - Alpha, Rot, Grün und Blau: Komponenten der Stiftfarbe des Rahmens
    ; $nWidth - Breite des Zeichenstifts für den Rahmen
    ; (die Einheit wird im $iUnit-Parameter der _GDIPlus_PenCreate-Funktion festgelegt)
    ;
    ; Rückgabewerte..: Erfolg - True
    ; Fehler - False
    ;==================================================================================================
    Func DrawInsert($hGraphic, $hImage2, $iX, $iY, $nAngle, $iWidth, $iHeight, $iARGB = 0xFF000000, $nWidth = 1)
    Local $hMatrix, $hPen2

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

    ; Rotationsmatrix
    $hMatrix = _GDIPlus_MatrixCreate()
    _GDIPlus_MatrixRotate($hMatrix, $nAngle, "False")
    _GDIPlus_GraphicsSetTransform($hGraphic, $hMatrix)

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

    _GDIPlus_GraphicsDrawImage($hGraphic, $hImage2, $iX, $iY)

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

    ; Ermittelt Stift + Farbe
    $hPen2 = _GDIPlus_PenCreate($iARGB, $nWidth)

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

    ; Zeichnet einen Rahmen um das eingefügte Bild
    _GDIPlus_GraphicsDrawRect($hGraphic, $iX, $iY, $iWidth, $iHeight, $hPen2)

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

    ; Ressourcen freigeben
    _GDIPlus_MatrixDispose($hMatrix)
    _GDIPlus_PenDispose($hPen2)
    Return 1
    EndFunc ;==>DrawInsert

    [/autoit]
  • Wieso funktioniert dieser Skript denn nicht?
    Ich möchte wie gesagt die bilder übereinander

    [autoit]

    #include <GDIPlus.au3>
    #include <ScreenCapture.au3>
    #include <WinAPI.au3>
    _GDIPlus_Startup()
    $hBitmap1 = _ScreenCapture_Capture("")
    $hImage1 = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap1)
    $hBitmap2 = _ScreenCapture_Capture("", 0, 0, 10,10)
    $hImage2 = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap2)
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage1)
    _GDIPlus_GraphicsDrawImage($hGraphic,$hImage2,0,0)
    _GDIPlus_ImageSaveToFile($hImage1, @DesktopDir & "\GDIPlus_Image.jpg")
    _GDIPlus_ImageDispose($hImage1)
    _GDIPlus_ImageDispose($hImage2)
    _WinAPI_DeleteObject($hBitmap1)
    _WinAPI_DeleteObject($hBitmap2)
    _GDIPlus_Shutdown()

    [/autoit]

    Thx für antworten

    Nur keine Hektik - das Leben ist stressig genug

  • Das Problem dabei ist: Dein Script funktioniert bereits ;).
    Wenn du ein Bild machst, und einen Ausschnitt des selben Bildes noch einmal darüber zeichnest und zwar exakt an der Position wo es vorher war ist es doch völlig logisch, dass du keinen Unterschied siehst. :D
    Als Beispiel habe ich den Ausschnitt des 2ten Screenshots mal an eine andere Position gezeichnet.

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <ScreenCapture.au3>
    #include <WinAPI.au3>
    _GDIPlus_Startup()
    $hBitmap1 = _ScreenCapture_Capture("")
    $hImage1 = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap1)
    $hBitmap2 = _ScreenCapture_Capture("", 0, 0, 100,100)
    $hImage2 = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap2)
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage1)
    _GDIPlus_GraphicsDrawImage($hGraphic,$hImage2,50,50)
    _GDIPlus_ImageSaveToFile($hImage1, @DesktopDir & "\GDIPlus_Image.jpg")
    _GDIPlus_BitmapDispose($hImage1) ;<-
    _GDIPlus_BitmapDispose($hImage2) ;<-
    _WinAPI_DeleteObject($hBitmap1)
    _WinAPI_DeleteObject($hBitmap2)
    _GDIPlus_Shutdown()

    [/autoit]


    Außerdem sind deine Variablen $hImage1 und 2, Handles zu Bitmaps und müssen deswegen dementsprechend angepasst werden. ;)

    Edit: Was bitte sind Screenshorts? 8| Das klingt nach einer ziemlich eigenartigen Hose. :rofl:

  • thx. ja ich finde och das das coole shorts sind :D:D
    so aber ich habe versucht das dieser eine screen-"short"^^ komplett aufdem bild ist. gelingt mir aber leider nicht:

    [autoit]


    #include <GDIPlus.au3>
    #include <ScreenCapture.au3>
    #include <WinAPI.au3>
    _GDIPlus_Startup()
    $hBitmap1 = _ScreenCapture_Capture("",0,0,@DesktopWidth,@DesktopHeight)
    $hImage1 = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap1)
    $hBitmap2 = _ScreenCapture_Capture("", 0, 0,@DesktopWidth,150)
    $hImage2 = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap2)
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage1)
    ;_GDIPlus_GraphicsClear ($hGraphic)
    _GDIPlus_GraphicsDrawImage($hGraphic,$hImage1,0,150)
    _GDIPlus_GraphicsDrawImage($hGraphic,$hImage2,0,0)
    _GDIPlus_ImageSaveToFile($hImage1, @DesktopDir & "\GDIPlus_Image.jpg")
    _GDIPlus_BitmapDispose($hImage1) ;<-
    _GDIPlus_BitmapDispose($hImage2) ;<-
    _WinAPI_DeleteObject($hBitmap1)
    _WinAPI_DeleteObject($hBitmap2)
    _GDIPlus_Shutdown()

    [/autoit]

    Das obere soll so bleiben, nur das andere soll ganz dort zusehen sein. :thumbup:

    Nur keine Hektik - das Leben ist stressig genug

  • Dann brauchst du aber eine neue Grafik oder du musst beide Bilder in das eine zeichnen sozusagen.... :D

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <Screencapture.au3>
    #include <WinApi.au3>

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

    _GDIPlus_Startup()

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND(WinGetHandle(AutoItWinGetTitle()))
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics(@DesktopWidth, @DesktopHeight, $hGraphic)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

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

    $HBITMAP_Screenshot1 = _ScreenCapture_Capture("", 0, 0, @DesktopWidth, @DesktopHeight)
    $HBITMAP_Screenshot2 = _ScreenCapture_Capture("", 0, 0, @DesktopWidth / 2, @DesktopHeight / 2)

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

    $hBitmap1 = _GDIPlus_BitmapCreateFromHBITMAP($HBITMAP_Screenshot1)
    $hBitmap2 = _GDIPlus_BitmapCreateFromHBITMAP($HBITMAP_Screenshot2)

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

    _WinAPI_DeleteObject($HBITMAP_Screenshot1)
    _WinAPI_DeleteObject($HBITMAP_Screenshot2)

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

    _GDIPlus_GraphicsDrawImageRect($hBuffer, $hBitmap1, 0, 0, @DesktopWidth, @DesktopHeight / 2)
    _GDIPlus_GraphicsDrawImageRect($hBuffer, $hBitmap2, 0, @DesktopHeight / 2, @DesktopWidth, @DesktopHeight / 2)

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

    _GDIPlus_ImageSaveToFile($hBitmap, @ScriptDir & "\Test.png")

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

    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_BitmapDispose($hBitmap1)
    _GDIPlus_BitmapDispose($hBitmap2)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_Shutdown()

    [/autoit]