GDI+ DrawImageRectRect Zu viele Pixel

  • Hallo Leute^^,
    nachdem ich jetzt schon stunden lang nach dem dämlichen Fehler gesucht habe wende ich mich mal an euch.
    Im Anhang findet ihr ein Zip Archiv in dem sich ein Beispiel befindet das mein Problem zeigt.
    Nachdem man das Script gestartet hat befinden sich im Script Ordner zwei Bitmaps, eine 16x16 und eine 20x20.
    Allerdings enthalten sie beide nicht das selbe, bei der 20x20 Bitmap wird aus mir nicht erklärbaren Gründen noch eine Reihe und eine Spalte mehr des Tilesets gezeichnet (Sieht man in der untersten Pixel Reihe). Beim 16x16 funktioniert alles wie es sollte.

    Hoffe das jemand die Lösung findet^^,

    sumsum

  • Hi,
    scheint so zu sein, dass RectRect den rechten und unteren Rand interpoliert

    Spoiler anzeigen
    [autoit]

    #include <GdiPlus.au3>

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

    $hDummy = GUICreate("",101,200)

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

    _GDIPlus_Startup()

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

    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hDummy)

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

    $hBitmap_20 = _GDIPlus_BitmapCreateFromGraphics(200,200,$hGraphics)
    $hBitmap_16 = _GDIPlus_BitmapCreateFromGraphics(16,16,$hGraphics)

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

    ;~ $hRedBrush = _GDIPlus_BrushCreateSolid(0xFFFF0000)

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

    $hTileSet = _GDIPlus_ImageLoadFromFile("FFIOriginsMap9.png")

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

    $hclone=_GDIPlus_BitmapCloneArea($hTileset, 0, 0, 16,16,$GDIP_PXF32ARGB)

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

    ;_GDIPlus_GraphicsDrawImageRect(_GDIPlus_ImageGetGraphicsContext($hBitmap_20),$hTileSet,0,0,20,20)
    _GDIPlus_GraphicsDrawImageRectRect(_GDIPlus_ImageGetGraphicsContext($hBitmap_20),$hclone,0,0,16,16,0,0,200,200)
    _GDIPlus_GraphicsDrawImageRectRect(_GDIPlus_ImageGetGraphicsContext($hBitmap_16),$hTileSet,0,0,16,16,0,0,16,16)

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

    _GDIPlus_ImageSaveToFile($hBitmap_16,"16.bmp")
    _GDIPlus_ImageSaveToFile($hBitmap_20,"20.bmp")
    _GDIPlus_ImageSaveToFile($hclone,"clone.bmp")
    ;shellexecute("16.bmp")

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

    shellexecute("20.bmp")

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

    _GDIPlus_BitmapDispose($hBitmap_20)
    _GDIPlus_BitmapDispose($hBitmap_16)

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

    ;_GDIPlus_ImageDispose($hTileSet)

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

    _GDIPlus_Shutdown()

    [/autoit]


    $hclone ist definitiv einfarbig....

  • Ohne interpolation mit Zentrierten Pixeln gehts.
    mit interpolation schaff ichs aber auch nicht.

    Was noch ginge wäre ein Klon des zu vergrößernden Ausschnitts.
    Der könnte dann ohne Probleme auf die gewünschte Größe gebracht werden.

    ABER: Dafür haben die Titles 16x16
    Man sollte sie auch als 16x16 nutzen, oder um den Faktor 2 Vergrößern.
    Und das Vergrößern sollte man unter allen Umständen erst mit dem fertigen Bild machen.
    Jeden Title einzeln vergrößern braucht 20x so viel Zeit im vergleich zu einem anschließenden vergrößern.
    Auch wenn man die vergrößerten Bilder Puffert braucht man noch ca. 3x so lange. (alles schon getestet^^)

    Spoiler anzeigen
    [autoit]

    #include <GdiPlus.au3>

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

    $hDummy = GUICreate("",101,200)

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

    _GDIPlus_Startup()

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

    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hDummy)

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

    $hBitmap_20 = _GDIPlus_BitmapCreateFromGraphics(20,20,$hGraphics)
    $hBitmap_16 = _GDIPlus_BitmapCreateFromGraphics(16,16,$hGraphics)

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

    $hRedBrush = _GDIPlus_BrushCreateSolid(0xFFFF0000)

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

    $hTileSet = _GDIPlus_ImageLoadFromFile("FFIOriginsMap9.png")

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

    $hGFX_20 = _GDIPlus_ImageGetGraphicsContext($hBitmap_20)
    $hGFX_16 = _GDIPlus_ImageGetGraphicsContext($hBitmap_16)

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

    DllCall($ghGDIPDll, "uint", "GdipSetPixelOffsetMode", "hwnd", $hGFX_20, "int", 2)
    DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "hwnd", $hGFX_20, "int", 5)

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

    _GDIPlus_GraphicsDrawImageRectRect($hGFX_20, $hTileSet,0,0,16,16,0,0,20,20)
    _GDIPlus_GraphicsDrawImageRectRect($hGFX_16, $hTileSet,0,0,16,16,0,0,16,16)

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

    _GDIPlus_ImageSaveToFile($hBitmap_16,"16.bmp")
    _GDIPlus_ImageSaveToFile($hBitmap_20,"20.bmp")

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

    _GDIPlus_GraphicsDispose($hGFX_20)
    _GDIPlus_GraphicsDispose($hGFX_16)

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

    _GDIPlus_BitmapDispose($hBitmap_20)
    _GDIPlus_BitmapDispose($hBitmap_16)

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

    _GDIPlus_ImageDispose($hTileSet)

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

    _GDIPlus_Shutdown()

    [/autoit]

    Gewöhne es dir bitte an auch in Beispielskripten ordentlich zu sein.
    Deine GFX Handles werden nicht wieder freigegeben.

  • Probiere mal dies aus:

    [autoit]


    #include <GDIPlus.au3>

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

    _GDIPlus_Startup()

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

    $hBitmap_Map = _GDIPlus_BitmapCreateFromFile(@ScriptDir & "\FFIOriginsMap9.png")
    $iW = 20
    $iH = 20
    $hBitmap_area = _GDIPlus_BitmapCloneArea($hBitmap_Map, 0, 0, 16, 16)
    $hBitmap_20x20 = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iW, "int", $iH, "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0)
    $hBitmap_20x20 = $hBitmap_20x20[6]
    $hCtxt = _GDIPlus_ImageGetGraphicsContext($hBitmap_20x20)
    _GDIPlus_GraphicsDrawImageRect($hCtxt, $hBitmap_area, 0, 0, $iW, $iH)
    _GDIPlus_ImageSaveToFile($hBitmap_20x20, @ScriptDir & "\New_20x20.bmp")
    _GDIPlus_GraphicsDispose($hCtxt)
    _GDIPlus_BitmapDispose($hBitmap_20x20)
    _GDIPlus_BitmapDispose($hBitmap_Map)
    _GDIPlus_BitmapDispose($hBitmap_area)

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

    _GDIPlus_Shutdown()
    ShellExecute(@ScriptDir & "\New_20x20.bmp")
    Exit

    [/autoit]

    Habe die Beispiele oben noch nicht angesehen!

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    3 Mal editiert, zuletzt von UEZ (10. Dezember 2012 um 23:23)