Discussion:
Linien drucken
(zu alt für eine Antwort)
Jens Köhler
2018-07-13 14:42:42 UTC
Permalink
Hallo Leute

ich will Polygone und Polylines auf einen s/w-Laserdrucker drucken.
Allerdings werden die Linien nur schwarz oder weiß gedruckt und nicht
gerastert. Flächen, Schrift oder auch Bilder werden korrekt gerastert.
Weiß sieht man natürlich nur als Aussparung auf einem grauen Hintergrund.
Pen.Mode ist pmCopy, Pen.Style ist psSolid. Erstaunlicherweise hat
Brush.Style einen Einfluß auf die Linen. Bei bsSolid werden rote oder
grüne Linien als schwarz, gelbe Linien als weiß gedruckt. Bei bsClear
werden alle Farben außen schwarz als weiß gedruckt.
Aus einem Grafikprogramm wie CorelDraw funktioniert auch das Liniendrucken.

Ist das ein generelles Problem mit Linien? Hat jemand nützlich Hinweise
oder Lösungen für mich?

D5

Jens
Hans-Peter Diettrich
2018-07-13 17:08:33 UTC
Permalink
Post by Jens Köhler
Hallo Leute
ich will Polygone und Polylines auf einen s/w-Laserdrucker drucken.
D.h. Du benutzt ein Printer Objekt und zeichnest auf Printer.Canvas?
Post by Jens Köhler
Allerdings werden die Linien nur schwarz oder weiß gedruckt und nicht
gerastert. Flächen, Schrift oder auch Bilder werden korrekt gerastert.
Mit "gerastert" meinst Du Dithering statt Farben? Damit habe ich leider
keine Erfahrung :-(

DoDi
Jens Köhler
2018-07-14 07:04:28 UTC
Permalink
Post by Hans-Peter Diettrich
Post by Jens Köhler
Hallo Leute
ich will Polygone und Polylines auf einen s/w-Laserdrucker drucken.
D.h. Du benutzt ein Printer Objekt und zeichnest auf Printer.Canvas?
genau
Post by Hans-Peter Diettrich
Post by Jens Köhler
Allerdings werden die Linien nur schwarz oder weiß gedruckt und nicht
gerastert. Flächen, Schrift oder auch Bilder werden korrekt gerastert.
Mit "gerastert" meinst Du Dithering statt Farben? Damit habe ich leider
keine Erfahrung :-(
DoDi
"gerastert" ist Dithering oder?

Jens
Peter Below
2018-07-14 08:20:42 UTC
Permalink
Post by Jens Köhler
Hallo Leute
ich will Polygone und Polylines auf einen s/w-Laserdrucker drucken.
Allerdings werden die Linien nur schwarz oder weiß gedruckt und nicht
gerastert. Flächen, Schrift oder auch Bilder werden korrekt
gerastert. Weiß sieht man natürlich nur als Aussparung auf einem
grauen Hintergrund. Pen.Mode ist pmCopy, Pen.Style ist psSolid.
Erstaunlicherweise hat Brush.Style einen Einfluß auf die Linen. Bei
bsSolid werden rote oder grüne Linien als schwarz, gelbe Linien als
weiß gedruckt. Bei bsClear werden alle Farben außen schwarz als weiß
gedruckt. Aus einem Grafikprogramm wie CorelDraw funktioniert auch
das Liniendrucken.
Ist das ein generelles Problem mit Linien? Hat jemand nützlich
Hinweise oder Lösungen für mich?
Wie ein s/w Drucker Farben druckt hängt stark vom Druckertreiber und
den erweiterten Druckeinstellungen ab, soweit ich weis. Für dein
Problem ist die sicherste Lösung vermutlich, die verwendete Linienfarbe
schon in deinem Programm in eine Graustufe umzuwandeln und die dann als
Pen.Color zu verwenden.
--
Peter Below
TeamB
Jens Köhler
2018-07-14 16:06:27 UTC
Permalink
Post by Peter Below
Post by Jens Köhler
Hallo Leute
ich will Polygone und Polylines auf einen s/w-Laserdrucker drucken.
Allerdings werden die Linien nur schwarz oder weiß gedruckt und nicht
gerastert. Flächen, Schrift oder auch Bilder werden korrekt
gerastert.
Wie ein s/w Drucker Farben druckt hängt stark vom Druckertreiber und
den erweiterten Druckeinstellungen ab, soweit ich weis. Für dein
Problem ist die sicherste Lösung vermutlich, die verwendete Linienfarbe
schon in deinem Programm in eine Graustufe umzuwandeln und die dann als
Pen.Color zu verwenden.
Ich habe es auch schon vergeblich mit rgb(200, 200, 200) versucht. Ich
werde es aber Montag noch mal mit anderen Werten testen.
Aber ich glaube auch nicht, das Farben das Problem sind, denn Flächen
gehen ja, nur Linien sind zickig :-(

Jens
Jens Köhler
2018-07-16 11:44:31 UTC
Permalink
Post by Peter Below
Post by Jens Köhler
Hallo Leute
ich will Polygone und Polylines auf einen s/w-Laserdrucker drucken.
Allerdings werden die Linien nur schwarz oder weiß gedruckt und nicht
gerastert. Flächen, Schrift oder auch Bilder werden korrekt
gerastert.
Wie ein s/w Drucker Farben druckt hängt stark vom Druckertreiber und
den erweiterten Druckeinstellungen ab, soweit ich weis. Für dein
Problem ist die sicherste Lösung vermutlich, die verwendete Linienfarbe
schon in deinem Programm in eine Graustufe umzuwandeln und die dann als
Pen.Color zu verwenden.
Ich habe es noch mal mit rgb(200, 200, 200) und anderen Grauwerten
versucht. Hat nix gebracht.

Auch verschiedene Einstellungen am Druckerteiber brachten keinen Erfolg.

Ich habe auch versucht, in ein Metafile zu zeichnen und dieses mit
Printer.Canvas.Draw(...) auszugeben.

Gleiche Ergebnis wie das direkte drucken in Farbe :-((

Hat noch jemand nützliche Tips ??

Jens
Björn Schreiber
2018-07-16 13:20:42 UTC
Permalink
Post by Jens Köhler
Hat noch jemand nützliche Tips ??
Kannst du mal etwas Code zeigen, wie du den Druck aufbereitest? Und
was ist, wenn du anstatt TCanvas.MoveTo / TCanvas.LineTo mal
TCanvas.Polyline ausprobierst?


Gruß
Jens Köhler
2018-07-16 16:05:11 UTC
Permalink
Post by Jens Köhler
Hat noch jemand nützliche Tips ??
  Kannst du mal etwas Code zeigen, wie du den Druck aufbereitest? Und
was ist, wenn du anstatt TCanvas.MoveTo / TCanvas.LineTo mal
TCanvas.Polyline ausprobierst?
Gruß
Viel an Aufbereitung gibt es da nicht.
In einem kleinem TestProg drucke einfach ein festes Polygon
Printer.Canvas.Polygone() oder Printer.Canvas.Polylines()
mit Printer.Canvas.Pen.Width := 20 und der jeweiligen Farbe.
Im Originalprogramm sind Polygon und Liniendicke natürlich berechnet
aber das sollte nichts ausmachen.

Vorher wird
Printer.Canvas.Pen.Mode := pmCopy; und
Printer.Canvas.Pen.Style := psSolid; gesetzt.

Jens
Björn Schreiber
2018-07-17 08:49:07 UTC
Permalink
Post by Jens Köhler
Viel an Aufbereitung gibt es da nicht.
Wichtig ist die Reihenfolge der Aufbereitung. Du nimmst die
Zuweisungen an Brush bzw. Pen aber schon nach dem Aufruf von BeginDoc
bzw. NewPage vor?


Gruß
--
Björn Schreiber
DRIGUS Systeme GmbH
Jens Köhler
2018-07-17 11:20:20 UTC
Permalink
Post by Jens Köhler
Viel an Aufbereitung gibt es da nicht.
  Wichtig ist die Reihenfolge der Aufbereitung. Du nimmst die
Zuweisungen an Brush bzw. Pen aber schon nach dem Aufruf von BeginDoc
bzw. NewPage vor?
Gruß
Hier die komplette Procedure

var
P : array[0..3] of TPoint =
((x:100; y:100), (x:500; y:100), (x:500; y:500), (x:100; y:500));

procedure PrintTest;
begin
Printer.BeginDoc;

// grauer Untergrund
Printer.Canvas.Pen.Mode := pmCopy;
Printer.Canvas.Pen.Style := psClear;
Printer.Canvas.Pen.Width := 0;
Printer.Canvas.Brush.Style := bsSolid;
Printer.Canvas.Brush.Color := clYellow;
Printer.Canvas.Rectangle(10, 10, 4000, 1500);

// Rechtecken
// Printer.Canvas.Brush.Style := bsClear;

Printer.Canvas.Pen.Style := psSolid;
Printer.Canvas.Pen.Width := 20;

Printer.Canvas.Pen.Color := clGreen;
Printer.Canvas.Polyline(P);
Printer.Canvas.TextOut(P[0].x + 50, P[0].y+50, 'grün');

PolyMove(P, 550, 0);
Printer.Canvas.Polygon(P);

// ####
Printer.Canvas.Pen.Color := clRed;

PolyMove(P, 550, 0);
Printer.Canvas.Polyline(P);
Printer.Canvas.TextOut(P[0].x + 50, P[0].y+50, 'rot');

PolyMove(P, 550, 0);
Printer.Canvas.Polygon(P);

// ####
Printer.Canvas.Pen.Color := rgb(230, 230, 230); // clYellow;

PolyMove(P, 550, 0);
Printer.Canvas.Polyline(P);
Printer.Canvas.TextOut(P[0].x + 50, P[0].y+50, '230'); // gelb');

PolyMove(P, 550, 0);
Printer.Canvas.Polygon(P);

Printer.EndDoc;
end;
Björn Schreiber
2018-07-17 13:12:42 UTC
Permalink
Post by Jens Köhler
Hier die komplette Procedure
[...]

Ich hab das gerade mal in Delphi 5 und in Delphi 10.1 Berlin
ausprobiert, auf einem Farblaser von Canon und einem s/w-Laser von HP.
Auf beiden sehen die Ausdrucke aus wie erwartet.
Ich hab leider keine weitere Idee...


Gruß
Jens Köhler
2018-07-17 15:37:54 UTC
Permalink
Post by Jens Köhler
Hier die komplette Procedure
  [...]
  Ich hab das gerade mal in Delphi 5 und in Delphi 10.1 Berlin
ausprobiert, auf einem Farblaser von Canon und einem s/w-Laser von HP.
Auf beiden sehen die Ausdrucke aus wie erwartet.
  Ich hab leider keine weitere Idee...
Gruß
heißt erwartet in Graustufen (Raster) oder schwarz bzw. weiß?

Danke für die Mühe.

Jens
Björn Schreiber
2018-07-18 06:23:20 UTC
Permalink
Post by Jens Köhler
heißt erwartet in Graustufen (Raster) oder schwarz bzw. weiß?
Wie erwartet wurde die Ausgaben mit Hilfe der Zusammensetzung von
schwarzen und "weißen" Druckpunkten in Graustufen ausgegeben.

Ich musste unsere Druckroutinen im Laufe der Jahre immer mal wieder
auf Grund von merkwürdigen Verhalten der Druckertreiber anpassen. Z.B.
kam uns mal ein Epson-Treiber unter, der bei fehlenden Titel für den
Druckjob sang und klanglos abstürzte und die Anwendung mit riss.

Ich würde dir empfehlen zu versuchen, dass ganze mit Hilfe der
Windows API nach zubauen. Wir hatten mal Probleme mit HP Druckern, die
bei der Verwendung eines Musters (Brush.Style <> bsClear oder bsSolid)
den Hintergrund des Musters einfach schwarz einfärbten. Das hat dazu
geführt, dass bei der Verwendung von Füllmustern immer noch zusätzlich
die Windows Funktion SetBkColor aufgerufen wird.


Gruß
--
Björn Schreiber
DRIGUS Systeme GmbH
Jens Köhler
2018-07-18 18:12:58 UTC
Permalink
Post by Jens Köhler
heißt erwartet in Graustufen (Raster) oder schwarz bzw. weiß?
  Wie erwartet wurde die Ausgaben mit Hilfe der Zusammensetzung von
schwarzen und "weißen" Druckpunkten in Graustufen ausgegeben.
Das meinte ich mit Raster.

Ich habe jetzt mal auf einen Farbdrucker ausgegeben, das funktioniert
super. Scheint als ein Druckerproblem zu sein. Wobei es
merkwürdigerweise nur Linien betrift, Flächen funktionieren.
  Ich würde dir empfehlen zu versuchen, dass ganze mit Hilfe der
Windows API nach zubauen.
Was meinst Du damit? Die Windowszeichenfunktionen
wie LineTo(hDC, nXEnd, nYEnd) oder PolylineTo(hDC...) usw.

Werde ich mal testen.

Jens
Jens Köhler
2018-07-19 14:21:20 UTC
Permalink
  Ich würde dir empfehlen zu versuchen, dass ganze mit Hilfe der
Windows API nach zubauen.
Gruß
Das war ein guter Tipp.
Es ist nicht das Zeichen, da gehen auch die Delphifunktionen, man muß
mit ExtCreatePen einen neuen Stift erzeugen.
Ich hatte Heute nur Zeit für einen Kurztest, das sah aber schon gut aus.

Vielen Dank.

Jens

Lesen Sie weiter auf narkive:
Loading...