Re: Linie zeichnen
Verfasst: 06.07.2011 17:38
gdi+ ist geil
, aber leider nur unter windows .. 


PureLust hat geschrieben:@Danilo: Sehr geil !!!
Hättest Du das nicht mal 3 Wochen früher posten können?
Dann hätte ich mir meine eigene Drawing-Lib und das Einarbeiten in die GDI-Funktionen sparen können.. . .
![]()
Kleine Anmerkung hätte ich aber noch:Deine GDI+ Funktionen sind zwar in der Syntax kompatibel zu den PB-Derivaten - bei der erzeugten Grafik besteht zu der durch PB-Befehle erstellten Gafik jedoch ein Unterschied.Code von Danilo hat geschrieben:;-[ antialiased PB compatible drawing functions using GDI+ ]-
So wird z.B. bei dem Line-Befehl von GDI und auch GDI+ keine Linie (Punkt) gezeichnet, wenn der Start- und der Endpunkt identisch sind.
gLineXY(10,10,10,10,Color) zeichnet also kein Punkt, das "Original" von PB jedoch schon (musste ich bei meiner Lib auch erst abfangen - hatte das gleiche Problem).
Auch zeichnen die PB-Befehle bei Line() keine Linie, wenn Breite oder Höhe = 0 sind - die GDI und GDI+ Befehle jedoch schon.
Weiterhin entstehen durch den bei gStartDrawing() voreingestellten PixelOffsetMode (#PixelOffsetModeHighQuality) fast immer Pixelabweichungen von 1 Pixel zu den PB-Befehlen.
Hier würde eine Voreinstellung von '#PixelOffsetModeNone' dem "Original" eher entsprechen.
Um den PixelOffsetMode nach Bedarf anpassen zu können wäre ja vielleicht noch eine entsprechende Funktion sinnvoll:Aber ansonsten eine seeeeehr geile Lib !!!Code: Alles auswählen
Procedure gPixelOffsetMode( newMode.l) If __graphics GdipSetPixelOffsetMode_(__graphics,newMode) EndIf EndProcedure
Und da (wie ich jetzt sehe) GDI+ scheinbar einiges mehr an Möglichkeiten bietet als GDI (auch wenn GDI um einiges schneller ist als GDI+), werde ich jetzt wohl auch auf Deine Routinen (oder zumindest auf GDI+) umschwenken.
BIG Thanks for sharing and inspiration !!!
Danke für das Lob und diese Hinweise!STARGÅTE hat geschrieben:Ich frage mich aber, wieso alle Positionen/Größen in LONG sind ?
ich meine wenn Antialiasing enthalten ist, sollte es noch möglich sein, auch Linien "dazwischen" zu zeichen, die dann geglättet werden.
Und vorallem bei Linienstärken wäre FLOATs sehr von nöten, denn zwischen 1 und 2 liegen "welten"
Code: Alles auswählen
GdipDrawLine (GpGraphics *graphics, GpPen *pen, REAL x1, REAL y1, REAL x2, REAL y2);
GdipDrawLineI(GpGraphics *graphics, GpPen *pen, INT x1, INT y1, INT x2, INT y2);
Es gibt auf anderen Platformen doch auch bessere Grafikbibliotheken mit AA etc.bobobo hat geschrieben:gdi+ ist geil, aber leider nur unter windows ..
Ah danke, hatte es mit GdipDrawLineF probiert ^^Auch kann man es leicht
komplett auf Float umstellen, da es alle verwendeten GDI+ Funktionen immer
als Integer- und Real-Version gibt, zum Beispiel:
Interesse besteht sehr wohl.Da scheinbar weiteres Interesse besteht, könnt ich mir vorstellen da noch bissl
was dran zu machen. Da ich aber ursprünglich keine Zeit mehr in PB investieren
wollte, wäre es zumindest nett wenn jemand mit helfen kann oder das vielleicht
übernimmt und ausbaut.
Geändert.PureLust hat geschrieben:Weiterhin entstehen durch den bei gStartDrawing() voreingestellten PixelOffsetMode (#PixelOffsetModeHighQuality) fast immer Pixelabweichungen von 1 Pixel zu den PB-Befehlen.
Hier würde eine Voreinstellung von '#PixelOffsetModeNone' dem "Original" eher entsprechen.
Um den PixelOffsetMode nach Bedarf anpassen zu können wäre ja vielleicht noch eine entsprechende Funktion sinnvoll:
Geändert.STARGÅTE hat geschrieben:Ich frage mich aber, wieso alle Positionen/Größen in LONG sind ?
Geändert. Es gibt nun gSetPen(color,size), gSetPenColor(color), gSetPenSize(size).STARGÅTE hat geschrieben:Also statt des Parameters PenWidth lieber n Funktion: DrawingThickness() usw.
Hier gehts weiter: http://forums.purebasic.com/german/view ... =8&t=24539STARGÅTE hat geschrieben:Auch noch n Frage: kann ich davon ausgehen, das diese DLL überall vorhabden ist (Windows) oder müsste man sie ggf mitliefern?
Keine Ahnung.STARGÅTE hat geschrieben:Ich habe nun #PixelOffsetModeHalf eingestellt, damit ich für Vektorgrafiken, bei 0,0 wirklich oben in der Ecke bin und nicht in der mitte des Pixels.
Nun habe ich jedoch immer noch das Problem, dass ich nur ganzzahlige Stiftdicken einstellen kann, welchen Parameter muss ich noch ändern ?
Hab ich schon auf dem Plan. Hab auch gDrawText() und gDrawRotatedText() schon inSTARGÅTE hat geschrieben:Desweiteren habe ich gelesen, dass es bei GDI+ auch Transformationsbefehle gibt, sodass ich Ellipsen auch drehen kann oder schären kann.
Wäre nett wenn du diese Befehle noch "übersetzt".
Code: Alles auswählen
CreateImage(#Image, 500, 300, 32)
gStartDrawing(ImageOutput(#Image))
gClear($FFFFFFFF)
For n = 0 To 20
gSetPen($FF000000, n/10)
gLineXY(n*20+20, 110, n*20+20, 190)
Next
gStopDrawing()