wie kann man ein GIF incl. Transparenz speichern (z.B. _ScreenCapture_Capture)

  • Hallo,

    ich möchte gern einen Screenshot machen und diesen dann als GIF abspeichern. Das geht eigentlich wunderbar mit _ScreenCapture_Capture() . Allerdings kann ich hier nicht weiter spezifizieren, welchen Farbwert ich gern als "transparent" definieren möchte.

    Weiß jemand, wie ich sowas in Kombination mit Screenshots und GIFs erreichen könnte?

    Danke.

  • Warum willst du im GIF Format speichern? Wäre PNG nicht die bessere Wahl?

    Du kannst zwar mit GDI+ im GIF Format speichern, aber, soweit ich mich erinnere, wird das Bild "gedithered", was nicht umbedingt schön aussieht.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Hy,
    soweit ich mich erinnere unterstützt .gif keine Transparenz.... Ich kenne soetwas lediglich aus alten RGP-Makern, das war z.B. Pink als Transparenz angegeben. Normalerweise würde ich wie UEZ meinte .png oder .bmp verwenden, da gibt es auch Transprenz.

    Grüsse!

  • Hallo UEZ,

    danke für die schnelle Antwort.

    Es muss nicht unbedingt GIF sein. Verwende GIF aber gern, da es bei filigranen Darstellungen "besser" aussieht als JPG und dabei noch sehr klein bleibt. Ist die Vorgabe von Transparenz denn bei PNG einfacher möglich?

    EDIT:
    @ Techmix: doch, GIF unterstützt Transparenz. Kann man z.B. per IrfanView einstellen.

    Gruß.

  • Ich meinte eine "echte" Transparenz in Form von RRGGBBAA. Natürlich könntest du einer .gif einen Farbwert für Transparenz zuweisen, der ist aber dann Statisch. Bei .png kannst du bei AA den Transparenzwert definieren. Auch tun sich .gif und .png in der Größe nicht viel, .png sieht nur besser aus...

    Grüsse!

  • Du kannst so was hier benutzen:

    Spoiler anzeigen
    [autoit]


    ;benötigt 3.3.12.0
    #include <ScreenCapture.au3>

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

    _GDIPlus_Startup()
    Global $iWidth = 400, $iHeight = 400
    Global $hBitmap_GDI = _ScreenCapture_Capture("", 0, 0, $iWidth - 1, $iHeight - 1, 0)
    Global $hBitmap_GDIPlus = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap_GDI)
    Global $hBitmap_Result = _GDIPlus_BitmapCreateFromScan0($iWidth, $iHeight)
    Global $hBitmap_Result_Ctxt = _GDIPlus_ImageGetGraphicsContext($hBitmap_Result)

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

    Global $aRemapTable[2][2]
    $aRemapTable[0][0] = 1
    $aRemapTable[1][0] = 0xFFFFFFFF ;Farbe, die Transparent gemacht werden soll
    $aRemapTable[1][1] = 0x08000000 ;Semi Transparenz - Format 0xAARRGGBB

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

    Global $hIA = _GDIPlus_ImageAttributesCreate()
    _GDIPlus_ImageAttributesSetRemapTable($hIA, 1, True, $aRemapTable)
    _GDIPlus_GraphicsDrawImageRectRect($hBitmap_Result_Ctxt, $hBitmap_GDIPlus, 0, 0, $iWidth, $iHeight, 0, 0, $iWidth, $iHeight, $hIA)
    _GDIPlus_ImageSaveToFile($hBitmap_Result, @ScriptDir & "\Result.png")

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

    _GDIPlus_GraphicsDispose($hBitmap_Result_Ctxt)
    _GDIPlus_BitmapDispose($hBitmap_GDIPlus)
    _GDIPlus_BitmapDispose($hBitmap_Result)
    _WinAPI_DeleteObject($hBitmap_GDI)
    _GDIPlus_ImageAttributesDispose($hIA)
    _GDIPlus_Shutdown()

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

    ShellExecute(@ScriptDir & "\Result.png")

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

    Func _GDIPlus_ImageAttributesSetRemapTable($hImageAttributes, $iColorAdjustType = 0, $fEnable = False, $aColorMap = 0)
    Local $iI, $iCount, $tColorMap, $aResult
    If IsArray($aColorMap) And UBound($aColorMap) > 1 Then
    $iCount = $aColorMap[0][0]
    $tColorMap = DllStructCreate("uint ColorMap[" & $iCount * 2 & "]")
    For $iI = 1 To $iCount
    $tColorMap.ColorMap((2 * $iI - 1)) = $aColorMap[$iI][0]
    $tColorMap.ColorMap((2 * $iI)) = $aColorMap[$iI][1]
    Next
    $aResult = DllCall($__g_hGDIPDll, "int", "GdipSetImageAttributesRemapTable", "handle", $hImageAttributes, "int", $iColorAdjustType, "int", $fEnable, "int", $iCount, "struct*", $tColorMap)
    If @error Then Return SetError(@error, @extended, False)
    If $aResult[0] Then Return SetError(10, $aResult[0], False)
    Return True
    EndIf
    Return SetError(11, 0, False)
    EndFunc ;==>_GDIPlus_ImageAttributesSetRemapTable

    [/autoit]

    Die weiße Fläche sollte komplett Transparent sein.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    Einmal editiert, zuletzt von UEZ (25. November 2014 um 12:10)