GDI+ zeichnet Kreise seltsam

  • Moin,

    Habe eben etwas seltsames entdeckt.
    Wenn man Den Stift nach innen ausrichtet wird bei GDI+ sehr unschön gezeichnet.

    Wenn man Smoothing aus hat ist der Unterschied minimal.
    Ist Dmoothing aber aktiviert ist der Kreis irgendwie wellig.

    Kann man dieses Problem irgendwie umgehen ?
    (mal abgesehen von dem Workaround den Kreis etwas kleiner zu zeichnen und die Ausrichtung mittig zu lassen.)

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>

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

    Opt('GUIOnEventMode', 1)

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

    Global $hGUI, $hGFX, $hBMP, $hBUF, $hPEN

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

    $hGUI = GUICreate('Test', 512, 512)

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

    _GDIPlus_Startup()

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

    $hGFX = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hBMP = _GDIPlus_BitmapCreateFromGraphics(512, 512, $hGFX)
    $hBUF = _GDIPlus_ImageGetGraphicsContext($hBMP)

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

    _GDIPlus_GraphicsClear($hBUF, 0xFFFFFFFF)
    _GDIPlus_GraphicsSetSmoothingMode($hBUF, 2)

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

    $hPEN = _GDIPlus_PenCreate(0xFFFF00FF, 5)

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

    _GDIPlus_GraphicsDrawEllipse($hBUF, 100, 100, 200, 200, $hPEN)

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

    _GDIPlus_PenSetAlignment($hPEN, 1)

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

    _GDIPlus_GraphicsDrawEllipse($hBUF, 200, 200, 200, 200, $hPEN)

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

    GUISetOnEvent(-3, '_Exit', $hGUI)
    GUIRegisterMsg(0xF, 'WM_PAINT')
    OnAutoItExitRegister('_Freigeben')

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

    WM_PAINT()

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

    GUISetState(@SW_SHOW, $hGUI)

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

    While Sleep(100)
    WEnd

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

    Func _Freigeben()
    _GDIPlus_GraphicsDispose($hBUF)
    _GDIPlus_BitmapDispose($hBMP)
    _GDIPlus_GraphicsDispose($hGFX)
    _GDIPlus_PenDispose($hPEN)
    _GDIPlus_Shutdown()
    EndFunc

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

    Func _Exit()
    Exit
    EndFunc

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

    Func WM_PAINT()
    _GDIPlus_GraphicsDrawImage($hGFX, $hBMP, 0, 0)
    EndFunc

    [/autoit]
  • Abgesehen davon, warum willst du diese Funktion verwenden?

    Wenn du _GDIPlus_GraphicsDrawRect($hBUF, 300, 100, 200, 200, $hPEN) ausführst, werden sogar waag. / senkr. Linien "gesmootht".

    Liegt vielleicht daran, dass die Pixel doch irgendwie anders angeordnet werden, sodass das smoothing andere Resultate liefert.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Ich brauche diese Funktion, da ich (mal wieder) an einem seltsamen Grafikformat am basteln bin.

    Das neue Format soll wesentlich umfangreicher, kompakter und extrem leicht erweiterbar sein. (das alte war das mit den Prozeduralen Bildern)

    Bevor ich mich an komplexe Funktionen wage möchte ich aber erstmal die Einfachen am Laufen haben. Beim testweisen Einbau der Kreisfunktion ist mir diese seltsame Zeichenweise aufgefallen.

    Im Endeffekt werde ich aber wohl einfach den Kreis etwas kleiner Zeichnen (die Halbe Strichdicke).