Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Text schräg auf Canvas ausgeben (https://www.delphipraxis.net/60921-text-schraeg-auf-canvas-ausgeben.html)

minimops 14. Jan 2006 12:18


Text schräg auf Canvas ausgeben
 
Wie kann man einfach einen Text schräg auf eine Canvas ausgeben? Also wie ein Wasserzeichen von unten links nach oben rechts?
Über einen kleinen Tip würde ich mich freuen! Vielen Dank!

Airblader 14. Jan 2006 12:20

Re: Text schräg auf Canvas ausgeben
 
...Text rotieren?

;)

air

minimops 14. Jan 2006 12:25

Re: Text schräg auf Canvas ausgeben
 
Cool, vielen Dank!

Schwedenbitter 16. Mär 2009 11:12

Re: Text schräg auf Canvas ausgeben
 
Entschuldigt bitte, dass ich ein altes Thema wieder aufmache: Ich konnte nicht anders :-D

Ich möchte das Ganze beim Drucken benutzen. Die auszudruckenden Bilder sollen alle der Vermerk "Kopie" erhalten, so dass niemand mehr den Stempel zücken muss. Ich habe deshalb den Quellcode in meine an sich kurze Druck-Routine eingebaut. So weit so gut. Es wird dann auch der schräge Text gedruckt. Zu klein, an der falschen Stelle und nicht transparant, was sich aber vermutlich noch ändern ließe.

Ich habe aber ein Problem mit der Geschwindigkeit! Wenn ich nur eine einzige DIN-A4-Seite drucke, geht der Rechner für ca. 2 Minuten total in die Knie :( Liegt es an mir?

Mein Quelltext sieht nach dem Integrieren wie folgt aus, wobei DruckJob eine TStringList ist und Label4 ausgibt, wieviel Seiten des Auftrags schon gedruckt wurden:
Delphi-Quellcode:
Procedure TForm1.SpeedButton1Click(Sender: TObject);
Var
   I            : Integer;
   PNG         : TPNGObject;
   lf            : TLogFont;
   tf            : TFont;
Begin
   // Drucker zum Drucken auswählen
   Printer.PrinterIndex:=Printer.Printers.IndexOf(ComboBox1.Text);
   Try
      tf:=Font.Create;         // Zeiger auf Schrift
      PNG:=TPNGObject.Create;   // Zeiger auf PNG-Datei
      Printer.BeginDoc;         // Drucker vorbereiten
      Printer.Title:='Ausdruck';
      For I:=0 To Pred(DruckJob.Count) Do
      Begin
         PNG.LoadFromFile(DruckJob.Strings[I]);
         Printer.Canvas.StretchDraw(Rect(0,0,Printer.PageWidth,Printer.PageHeight),PNG);
         Printer.Canvas.Font.Name:='Arial';   // Schriftsart für Wasserzeichen
         Printer.Canvas.Font.Size:=24;         // Schriftgröße für Wasserzeichen
         tf.Assign(Printer.Canvas.Font);
         GetObject(tf.Handle,SizeOf(lf),@lf);
         lf.lfEscapement:=   320;
         lf.lfOrientation:=320;
         SetBkMode(Handle,TRANSPARENT);
         tf.Handle:=CreateFontIndirect(lf);
         Printer.Canvas.Font.Assign(tf);
         Printer.Canvas.TextOut(Width div 2, Height div 2, 'KOPIE');
         If I<Pred(DruckJob.Count) Then
            Printer.NewPage;   // Neue Seite anfangen
         PB1.Position:=I;
         Label4.Caption:=FormatFloat('#,##0',Succ(I));
         Application.ProcessMessages;
      End;
   Finally
      Printer.EndDoc;         // Druckauftrag beenden
      tf.Free;
      PNG.Free;
   End;
   Close;
End;
Schonmal Dank für Eure Ideen

Alex

jfheins 16. Mär 2009 12:00

Re: Text schräg auf Canvas ausgeben
 
Vielleicht geht es schneller, wenn du den Kopie-Vermerk nach dem laden des PBGs auf selbiges malst und danach nur das PNG auf den Drucker-Canvas sendest :stupid:
Zitat:

Zitat von Schwedenbitter
Delphi-Quellcode:
         PNG.LoadFromFile(DruckJob.Strings[I]);
// Hier jetzt auf PNG drauf malen und dann erst zum Drucker geben
         Printer.Canvas.StretchDraw(Rect(0,0,Printer.PageWidth,Printer.PageHeight),PNG);

Ist aber nur so ne Idee :angel2:

Schwedenbitter 16. Mär 2009 12:53

Re: Text schräg auf Canvas ausgeben
 
Zitat:

Zitat von jfheins
Ist aber nur so ne Idee :angel2:

... hat den Nagel aber auf den Kopf getroffen :thumb:. Auf die Idee hätte ich ja auch selber mal kommen können. Ich bekomme jetzt zwar noch eine Exception. Aber ich denke, die liegt an meinem TPNGObject, was leider nicht mehr weiterentwickelt wird. Muss ich halt noch irgendwie abfangen.

Danke sehr!

Das einzige, was mich jetzt noch wirklich stört, ist die fehlende Transparenz. Der Kopie-Stempel deckt alle komplett ab.

worker 16. Mär 2009 13:21

Re: Text schräg auf Canvas ausgeben
 
Meinst Du die Schrift selber, oder den Hintergrund der Schrift?

Für Punkt 2: probiere bsClear (BrushStyle)
Für Punkt 1: was macht ein normaler Stempel? ;)

Satty67 16. Mär 2009 14:18

Re: Text schräg auf Canvas ausgeben
 
Bei einem normalen Stempel sieht man auch noch was drunter ist.

Schreibe den Stempeltext in ein eigenes TImage. Das kannst Du dann mit entsprechenden Optionen über Deine Bilder legen. Um noch mehr Mühe zu sparen kannst Du den Stempel auch gleich komplett als fertiges Image laden. Solange es sowieso immer der gleich Text ist, scheint mir das auch der bessere Weg.

worker 16. Mär 2009 15:44

Re: Text schräg auf Canvas ausgeben
 
Zitat:

Zitat von Satty67
Bei einem normalen Stempel sieht man auch noch was drunter ist.

Ja, ganz bestimmt :lol: :dance: :party: :nerd: Dann kram mal Dein Taschengeld zusammen und geh' Dir einen Stempel kaufen...

Auch bei einem normalen Stempel wirst Du kaum sehen, was unter der Tinte steht, oder?
Es sei denn, Du benutzt nur mässig deckende Stempelfarbe, was aber wohl nicht Sinn der Sache ist.

Deswegen meine Frage, was er meint: ob er meint, dass die Schrift den Hintergrund verdeckt (das ist das, was sich wohl nicht vermeiden lässt), oder ob um die Schrift noch ein Rahmen (Hintergrund) gezeichnet wird, und dieser das, was darunter liegt, verdeckt. Und das lässt sich mit bsClear vermeiden.

Nochmal dazu wenn es auf die Schrift bezogen ist
Zitat:

Zitat von Satty67
Bei einem normalen Stempel sieht man auch noch was drunter ist.

Dein Gehirn vervollständigt die durch die Tinte überdeckten Teile.

Schwedenbitter 1. Aug 2009 19:06

Re: Text schräg auf Canvas ausgeben
 
Zitat:

Zitat von worker
Für Punkt 2: probiere bsClear (BrushStyle)

Das habe ich gemacht. Aber der folgende Code bringt mir trotzdem nur die Schrift auf das Bild und verdeckt trotz bsClear den Text:

Delphi-Quellcode:
Procedure TForm1.FormCreate(Sender: TObject);
Var
   T         : String;
   BMP      : TBitmap;
Begin
   BMP:=TBitmap.Create;
   Try
      BMP.LoadFromFile('C:\Test.bmp');
      BMP.Canvas.Font.Name:='Arial';   // Schriftart für Stempel
      BMP.Canvas.Font.Size:=170;         // Schriftgröße für Stempel
      BMP.Canvas.Font.Orientation:=550;// Drehung der Schrift 55°
      BMP.Canvas.Font.Color:=$C0C0C0;   // Helles Grau
      BMP.Canvas.Brush.Style:=bsClear;   // Durchsichtig
      T:='Kopie';                        // Text
      BMP.Canvas.TextOut((BMP.Width-BMP.Canvas.TextWidth(T)) div 2,
                         (BMP.Height-BMP.Canvas.TextHeight(T)) div 2,
                           T);
      BMP.SaveToFile('C:\Test_W.bmp');
   Finally
      BMP.Free
   End;
   Application.Terminate;
End;
Zitat:

Zitat von Satty67
Schreibe den Stempeltext in ein eigenes TImage. Das kannst Du dann mit entsprechenden Optionen über Deine Bilder legen.

@Satty67 oder wer das sonst noch kann:
Das Schreiben in ein TImage ist kein Problem. Muss es unbedingt ein TImage sein oder geht auch was anderes (z.B. TBitmap)? Aber viel wichtigter: Wie lautet die "entsprechende(n) Option(en)" zum Stempeln?

Gruß und Dank, Alex

Reinhard Kern 1. Aug 2009 20:31

Re: Text schräg auf Canvas ausgeben
 
Zitat:

Zitat von Schwedenbitter
Zitat:

Zitat von worker
Für Punkt 2: probiere bsClear (BrushStyle)

Das habe ich gemacht. Aber der folgende Code bringt mir trotzdem nur die Schrift auf das Bild und verdeckt trotz bsClear den Text

Hallo,

das soll er ja auch. Für sowas wie Kopie oder ein Wasserzeichen nimmt man daher "hohlen" Text, bei dem nur die Konturlinien gedruckt werden. Oder man nimmt fette Schrift und druckt sie hellgrau.

Gruss Reinhard

PS es ist auch noch die Frage, was Vordergrund ist - ich würde mal das Wasserzeichen zuerst drucken.

Schwedenbitter 2. Aug 2009 01:12

Re: Text schräg auf Canvas ausgeben
 
Zitat:

Zitat von Reinhard Kern
Für sowas wie Kopie oder ein Wasserzeichen nimmt man daher "hohlen" Text, bei dem nur die Konturlinien gedruckt werden.

Wie geht das mit dem "hohlen" Text?
Zitat:

Zitat von Reinhard Kern
Oder man nimmt fette Schrift und druckt sie hellgrau.

Genau das macht mein obiger Code. Aber mich stört eben, dass das grau den darunter liegenden Text verdeckt.
Zitat:

Zitat von Reinhard Kern
PS es ist auch noch die Frage, was Vordergrund ist - ich würde mal das Wasserzeichen zuerst drucken.

Genau das ist mein weiteres Problem. Ich verschmelze ja bereits 2 Bilder miteinander. Einen Text und einen Kopfbogen. Das funktioniert und ich mache das so:
Delphi-Quellcode:
...
QBMP:=TBitmap.Create;                   // Quellbitmap
ZBMP:=TBitmap.Create;                   // Zielbitmap
Try
   QBMP.LoadFromFile('Kopfbogen.bmp');  // Kopfbogen laden
   ZBMP.Canvas.Brush.Style:=bsClear;    // Durchsichtig malen
   ZBMP.LoadFromFile('Seite 0001.bmp'); // Text laden
   ZBMP.Canvas.BrushCopy(Rect(0, 0, ZBMP.Width, ZBMP.Height),
                         QBMP,
                         Rect(0, 0, QBMP.Width, QBMP.Height),
                         QBMP.Canvas.Pixels[0, 0]);
   ZBMP.PixelFormat:=pf8bit;            // 256 Farben
   ZBMP.SaveToFile('Fertiges Bild.bmp'); // Bild speichern
Finally
   QBMP.Free;
   ZBMP.Free;
End;
...
Wenn ich das so auch mit dem Wasserzeichen versuche, dann bekomme ich entweder das Wasserzeichen drüber (mit den unerwünschten Effekten) oder ich vertausche einfach QBMP und ZBMP und dann bekomme ich nur den Text; ganz ohne Wasserzeichen. Was ich aber in Anbetracht von bsClear nicht verstehe.

Was mache ich denn nun verkehrt?

Reinhard Kern 2. Aug 2009 03:33

Re: Text schräg auf Canvas ausgeben
 
Zitat:

Zitat von Schwedenbitter
Wie geht das mit dem "hohlen" Text?

Hi,

am einfachsten sucht man sich einen Font ohne Füllung (gibt nicht so viele, aber z.B. Swiss 721 Bold Outline), man kann aber auch "Kopie" in Coreldraw schreiben und schwarzen Rand/keine Füllung wählen und dann als Vektor- oder Pixel-Bild abspeichern.

Von der Logik her müsste man das Wasserzeichen als erstes, somit ganz im Hintergrund drucken usw.

Gruss Reinhard

PS: bsclear ist falsch - es geht nicht um den Brush Style, sondern um den Windows Background Mode, der muss transparent sein.

Hawkeye219 2. Aug 2009 10:28

Re: Text schräg auf Canvas ausgeben
 
Hallo,

vielleicht kann auch auf den Einsatz von CorelDraw verzichtet werden: DrawOutlinedText

Gruß Hawkeye

Schwedenbitter 2. Aug 2009 11:29

Re: Text schräg auf Canvas ausgeben
 
Zitat:

Zitat von Reinhard Kern
Von der Logik her müsste man das Wasserzeichen als erstes, somit ganz im Hintergrund drucken usw.

Ja! Problem erkannt! Aber wie mache ich das?

Zitat:

Zitat von Reinhard Kern
PS: bsclear ist falsch - es geht nicht um den Brush Style, sondern um den Windows Background Mode, der muss transparent sein.

Wie mache ich das ? Wie setze ich den Windows Background Mode?

Ich weiß die Antworten sehr zu schätzen. Aber dass ich nicht weiß, wie man ganz in den Hintergrund druckt bzw. den Windows Background Mode setzt, zeigt schon, dass ich es nicht schaffe. Ich würde mich daher freuen, wenn Ihr - die Wissenden - mir neben dem Nennen von Stichwörtern auch zumindest kurze Hinweise (Quellcode-Schnipsel) gebt, wie es funktioniert.
Das erleichtert übrigens auch mitlesenden Hilfesuchenden mit möglicherweise denselben und zumindest ähnlichen Problemen, eine Lösung zu finden.

Danke, Alex

Reinhard Kern 2. Aug 2009 15:15

Re: Text schräg auf Canvas ausgeben
 
Zitat:

Zitat von Schwedenbitter
... Ich würde mich daher freuen, wenn Ihr - die Wissenden - mir neben dem Nennen von Stichwörtern auch zumindest kurze Hinweise (Quellcode-Schnipsel) gebt, wie es funktioniert.

Hallo Alex,

damit habe ich leider ein Problem: da ich schon sehr lange unter Windows programmiere, schon bevor es Delphi gab, habe ich viele Probleme, darunter die Druckerei, direkt mit dem Win32-API gelöst und nicht als VCL-Komponenten. Meine Lösungen sind daher hier nicht veröffentlichbar, aber es findet sich hoffentlich jemand, der Entsprechendes auf VCL-Basis geschrieben hat, das Problem ist ja nicht selten.

Gruss Reinhard


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz