Printer.canvas.pen.width Problem

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
siro
Beiträge: 594
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 10
CPU-Target: 64Bit
Wohnort: Berlin

Printer.canvas.pen.width Problem

Beitrag von siro »

Hallo zusammen,

ich habe ein Problemchen beim Drucken bzw. Zeichnen auf den Printer.Canvas.

Bei Linien funktioniert es korrekt,
aber bei Ellipse und Rectangle ist der Pen irgendwie dicker.

Ich zeichne zunächst ein Karoblatt Raster 5*5mm mit Pen.width = 1 oder auch 0, beides probiert.
Das sieht auch völlig okay aus.

Dann einen Kreis und ein Rechteck ebenfalls mit Pen.width = 1 oder auch 0, beides probiert.
Der Kreis und das Rechteck erscheinen jedoch dicker auf dem Ausdruck.
DruckTest_01.jpg
DruckTest_01.jpg (45.54 KiB) 404 mal betrachtet
Hat evtl. jemand eine Erklärung dafür ?

Ich habe mal ein Beispielprojekt angehangen.
Drucktest.zip
(146.32 KiB) 19-mal heruntergeladen
.
Wenn ich auf dem canvas des Formulars zeichne erkenne ich kein Problem,
dann ist Pen.Width auch wirklich 1 Pixel bei Linien sowie bei Rechtecken und Ellipsen

Siro

Mein System: Lazarus 2.2.0 (rev lazarus_2_2_0) FPC 3.2.2 x86_64-win64-win32/win64
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

siro
Beiträge: 594
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 10
CPU-Target: 64Bit
Wohnort: Berlin

Re: Printer.canvas.pen.width Problem

Beitrag von siro »

Getestet wurde zunächst mit 1200 DPI Druckerauflösung,
eben nochmal getestet mit 600und mit 300 DPI Auflösung des Druckers,
bei 600 DPI ändert es nichts,
wobei es bei 300 DPI schon wesentlich gleichmässiger aussieht,
aber immer noch nicht identische Strichstärken sind.
DruckTest_02.jpg
DruckTest_02.jpg (72.01 KiB) 397 mal betrachtet
mein Drucker ist ein: Brother DCP-L2530DW

ich probier das gleich nochmal auf einem anderen Drucker

Ich fasse es nicht ...
auf dem Samsung Drucker M2020 (auch ein 1200 DPI) funktioniert es..... :shock:
DruckTest_03.jpg
DruckTest_03.jpg (33.61 KiB) 393 mal betrachtet
sehr merkwürdig.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

wp_xyz
Beiträge: 4347
Registriert: Fr 8. Apr 2011, 09:01

Re: Printer.canvas.pen.width Problem

Beitrag von wp_xyz »

Ich habe auf PDF ausgedruckt, und da sind alle Linien ununterscheidbar dick. Auf dem Epson Office BX535 kommen die rechte und untere Linie des Quadrats einen Hauch dicker raus. Möglicherweise ist das eine Folge von Rundungsfehlern, denn das xStep_mm*Count im Gitter hat an dieser Stelle möglicherweise einen geringfügig anderen Wert als die direkte Koordinate 100 beim Quadrat. Und was weiß ich, was der Druckertreiber daraus macht...

Eine Idee in diesem Zusammenhang: Ändere das Programm so ab, dass nur jede zweite Gitterlinie gedruckt wird, so dass die Umrandung des Quadrats nicht mehr auf eine Gitterlinie fällt. Nun müssten die (geraden) Linien gleich dick sein (der Kreis ist eine andere Geschichte, denn wir wissen nicht wie der gezeichnet wird).

Benutzeravatar
Winni
Beiträge: 1330
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Printer.canvas.pen.width Problem

Beitrag von Winni »

Hi!

Also erstmal ein Mecker gegen Brother;

Die Druckertreiber sind alle schludrig programmiert.
Z.B, muss ich bei der Kiste in der Firma die Uhr auf UTC stellen, damit er die richtige Uhrzeit auf den Ausdrucken ausgibt.

Zweitens: Das kann mit schlecht programmiertem AntiAliasing zu tun haben:

Damit z.B. ein Kreis nicht aussieht wie 80er Treppengrafik, werden die Schwarz -Anteile auf mehrere Pixel verteilt. Das kann dazu führen, dass 4 nebeneinanderliegende Pixel z.B. alle nur 25% grau sind, was aber optisch wie ein schwarzer Pixel aussieht, Wenn hier im Treiber gepfuscht wird, dann kommt es zu Deinen Resultaten.

Es gibt viele gute Drucker - aber bitte nicht Brother nehmen!

Winni

siro
Beiträge: 594
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 10
CPU-Target: 64Bit
Wohnort: Berlin

Re: Printer.canvas.pen.width Problem

Beitrag von siro »

Ersteinmal Danke für eure Ausführungen / Anteilnahme.

@wp_xyz:
Ich habe auch schon überlegt, ob es Rundungsfehler geben könnte.
Normalerweise dürfte mein Rechteck auf dem Raster garnicht sichtbar sein.
Ich dachte durch meine Berechnung sollte dies eigentlich auch nicht passieren,
darum habe ich bewusst keine inkrementelle Erhhöhung der Werte vorgenommen sondern
stets neu berechnet.
Wenn ich mir aber das Bild vom Samsung Drucker ansehe, kann ich trotzdem erahnen,
dass noch etwas zusätzlich existiert (von dem Rechteck) ....zumindest links und oben.
Dürfte eigentlich nicht sein.

@winni:
ich hab auch erst gedacht, dass der Drucker irgendwie Antialias benutzt.
Eigentlich sollte das aber eine 1:1 Pixelgrafik sein....

Warum hab ich das überhaupt probiert:

Ich benötigte eine Lochscheibe für eine Drehzahlregelung mittels Gabellichtschranke für einen Motor
und so habe ich dann mal mit Inkscape eine Zeichnung gemacht und ausgedruckt.
Der Ausdruck dieser Zeichnung war derart "grausam" dass ich nach den Ursachen forschte.

Nach einem kleinem Test mit Lazarus konnte ich feststellen, das mein Drucker nicht schuld war,
also macht Inkscape irgendwie Mist.
Irgendwo hab ich auch gelesen: aus Inkscape drucken ist eine Katastrophe.

Für so ein paar Linen und Kreise mach ich das dann lieber selber mit Lazarus.
Das ging ja auch, bis ich dann über die Strichstärken gestolpert bin. Da stimmt etwas nicht...
Anscheinend Drucker abhängig...

ich denke dann können wir diesen Thread auch schliessen.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

siro
Beiträge: 594
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 10
CPU-Target: 64Bit
Wohnort: Berlin

Re: Printer.canvas.pen.width Problem

Beitrag von siro »

Guten Morgen zusammen,
so langsam zweifele ich an meinem Verstand.... :roll:

Ich habe noch VIEL (sehr viel) rumprobiert.
Für den Kreis habe ich mal wieder den Bresenham ausgegraben.
Ich zeichne ihn also Pixel für Pixel selbst und das funktioniert.

Code: Alles auswählen

procedure DrawCircle(canvas:TCanvas; xc,yc,r:Integer);
var d,x,y:Integer;
begin
  with canvas do begin
    d:=-r;
    x:=r;
    y:=0;
    while y < x do begin
      Pixels[xc+x, yc+y]:=clBlack;
      Pixels[xc-x, yc+y]:=clBlack;
      Pixels[xc+x, yc-y]:=clBlack;
      Pixels[xc-x, yc-y]:=clBlack;
      Pixels[xc+y, yc+x]:=clBlack;
      Pixels[xc-y, yc+x]:=clBlack;
      Pixels[xc+y, yc-x]:=clBlack;
      Pixels[xc-y, yc-x]:=clBlack;
      d:= d + 2*y +1;
      inc(y);
      if d > 0 then begin
        dec(x);
        d:=d - 2*x;
      end;
    end;
  end;
end;
Aber nun habe ich eine absolute Merkwürdigkeit entdeckt:

Ich zeichne momentan nur noch das senkrechte Raster und zusätzlich ein senkrechte Linie.

MoveTo(100,0); // Startpunkt für die senkrechte Linie
// LineTo(100,Printer.PageHeight); // funktioniert einwandfrei, Strichstärke stimmt
LineTo(100,2000); // funktioniert nicht, Linie zu dick ????????? :shock:

LineTo(100,Printer.PageHeight);
DruckTest_05.jpg
DruckTest_05.jpg (4.13 KiB) 297 mal betrachtet
LineTo(100,2000);
DruckTest_06.jpg
DruckTest_06.jpg (5.27 KiB) 297 mal betrachtet
Das kann ja jetzt nichts mehr mit Rundungsfehler oder anderer Position zu tun haben.
Völlig rätselhaft....Ich muss an die Luft.

Never Brother, use another... :mrgreen:

Ein schönes Wochenende wünsche ich euch.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Antworten