GDIPlus Transparentes Bild erstellen

  • Ich würde gerne ein Transparentes Bild erstellen auf das ich einen Schriftzug schreibe.
    Mein erster versuch war es, auf ein transparentes .gif Bild mit GDIPlus den Text zu schreiben, doch nachher sieht man keinen text:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>

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

    _GDIPlus_Startup()
    $hImage1 = _GDIPlus_BitmapCreateFromFile(@scriptdir & "\data\transparent.gif")
    $hGraphic = _GDIPlus_ImageGetGraphicsContext ($hImage1)

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

    _GDIPlus_GraphicsDrawString($hGraphic, "Dies ist ein Test!", 5,5,"Arial",12)

    _GDIPlus_ImageSaveToFile($hImage1, @scriptdir & "\data\texttest.gif")

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

    _GDIPlus_ImageDispose ($hImage1)
    _GDIPlus_Shutdown()

    [/autoit]

    Mit anderen dateiformaten funktioniert es, nur nich mit .gif.
    Ich vermute mal das es eine recht einfache möglichkeit gibt, das problem zu lösen, nur habe ich sie nicht gefunden -.-

    MfG

    Einmal editiert, zuletzt von Oger-Lord (16. März 2009 um 19:44)

  • ok, ich habe das problem gerade selbst gelöst:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>

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

    Main()

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

    Func Main()
    Local Const $ULW_ALPHA = 2
    Local $hBitmap1, $hBitmap, $hImage2, $hGraphic, $sCLSID
    Local $GuiSizeX = 124, $GuiSizeY = 32

    _GDIPlus_Startup()
    $hBitmap1 = _WinAPI_CreateBitmap($GuiSizeX, $GuiSizeY, 1, 32)
    $hImage2 = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap1)
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage2)
    _GDIPlus_GraphicsClear($hGraphic, 0xFFFFFFA0)

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

    _GDIPlus_GraphicsDrawString($hGraphic, "Dies ist ein Test!", 5,5,"Arial",12)

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


    $hBitmap = ImageMakeTransparentBkGnd($hImage2, $GuiSizeX, $GuiSizeY)

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

    ; Save to file
    $sCLSID = _GDIPlus_EncodersGetCLSID("PNG");"GIF") ;
    _GDIPlus_ImageSaveToFileEx($hBitmap, @DesktopDir & "\TestWrite.png", $sCLSID) ; gif

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

    _WinAPI_DeleteObject($hImage2)
    _GDIPlus_GraphicsDispose($hGraphic)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteObject($hBitmap1)
    _GDIPlus_Shutdown()

    Return 1
    EndFunc ;==>Main

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

    ;================Macht den Hintergrund Transparent, überall wo die farbe des pixels 1,1 ist===============
    Func ImageMakeTransparentBkGnd($hImage2, $GuiSizeX, $GuiSizeY)
    Local $hBitmap1, $Reslt, $width, $height, $stride, $format, $Scan0, $v_Buffer, $v_Value, $iColor

    $hBitmap1 = _GDIPlus_BitmapCloneArea($hImage2, 0, 0, $GuiSizeX, $GuiSizeY, $GDIP_PXF32ARGB)

    $iColor = GDIPlus_BitmapGetPixel($hBitmap1, 1, 1) ; Transparent color

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

    $Reslt = _GDIPlus_BitmapLockBits($hBitmap1, 0, 0, $GuiSizeX, $GuiSizeY, BitOR($GDIP_ILMREAD, $GDIP_ILMWRITE), $GDIP_PXF32ARGB)

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

    ;Get the returned values of _GDIPlus_BitmapLockBits ()
    $width = DllStructGetData ($Reslt, "width")
    $height = DllStructGetData($Reslt, "height")
    $stride = DllStructGetData($Reslt, "stride")
    $format = DllStructGetData($Reslt, "format")
    $Scan0 = DllStructGetData ($Reslt, "Scan0")

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

    For $i = 0 To $GuiSizeX - 1
    For $j = 0 To $GuiSizeY - 1
    $v_Buffer = DllStructCreate("dword", $Scan0 + ($j * $stride) + ($i * 4))
    $v_Value = DllStructGetData($v_Buffer, 1)
    If Hex($v_Value, 6) = Hex($iColor, 6) Then
    DllStructSetData($v_Buffer, 1, Hex($iColor, 6))
    EndIf
    Next
    Next

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

    _GDIPlus_BitmapUnlockBits($hBitmap1, $Reslt)

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

    Return $hBitmap1
    EndFunc ;==>ImageMakeTransparentBkGnd

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

    ;The GetPixel method gets the color of a specified pixel in this bitmap.
    Func GDIPlus_BitmapGetPixel($hBitmap, $iX, $iY)
    Local $tArgb, $pArgb, $aRet
    $tArgb = DllStructCreate("dword Argb")
    $pArgb = DllStructGetPtr($tArgb)
    $aRet = DllCall($ghGDIPDll, "int", "GdipBitmapGetPixel", "hwnd", $hBitmap, "int", $iX, "int", $iY, "ptr", $pArgb)
    Return "0x" & Hex(DllStructGetData($tArgb, "Argb"))
    EndFunc ;==>GDIPlus_BitmapGetPixel

    [/autoit]

    macht genau das was ich möchte!