Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi TrueTypeFont Rastern (https://www.delphipraxis.net/86744-truetypefont-rastern.html)

bidi 19. Feb 2007 00:44


TrueTypeFont Rastern
 
Hallo!

Ich arbeite zur Zeit an einem Programm, das PCL6 (bzw. PCL XL) Code für einen Drucker erzeugt. Dazu muss ich Schriftarten; besser: Zeichen als Bitmap übertragen. d.h. 1 = schwarz, 0 = weiss ...soweit ganz einfach.
Ich habe versucht in ein TCanvas mittels TextOut einfach einen Buchstaben zu zeichnen und anschließend das Bild mittels Schleife und der Pixels-Eigentschaft in das gewünscht Fortmat zu bringen. Hat soweiter auch funktioniert.

Aber: Das Programm soll später ein Konstolen-Anwendung werden. Und da funktioniert das mit dem Canvas nicht, da ja nix gezeichnet wird... Außerdem muss es wahrscheinlich nach FreePascal unter Linux portiert werden. Also das bitte im Hinterkopf behalten.
Hier mein aktueller Code, der nat. nur funktioniert, wenn die Bitmap z.B. in einem TImage auf einem Form gezeichnet wird:

Delphi-Quellcode:
function TPCLGen.RasterChar(c: Char; Height: Cardinal): TByteArray;
var
  PLeftOffset, PRightOffset, Pwidth, Pheight: ^Word;
  bm: TBitmap;
  x,y: Cardinal;
  data: Byte;
  shift: Integer;
begin
  SetLength(result, 10);
  result[0] := $00; // Format = 0;
  result[1] := $00; // Class = 0;

  PLeftOffset := @result[2];
  PLeftOffset^ := 0;

  PRightOffset := @result[4];
  PRightOffset^ := 0;

  Pwidth := @result[6];
  Pheight := @result[8];

  bm := TBitmap.Create;
  try
    bm.Canvas.Font.Name := 'Arial';
    bm.Canvas.Font.Height := Height;

    Pheight^ := bm.Canvas.TextHeight(c);
    Pwidth^ := bm.Canvas.TextWidth(c);

    bm.Height := Pheight^;
    bm.Width := Pwidth^;

    bm.Canvas.Pen.Color := clBlack;
    bm.Canvas.TextOut(0,0,c);

    shift := 7;
    data := 0;
    for x:=0 to Pwidth^-1 do
      for y:=0 to Pheight^-1 do
      begin
        if shift = -1 then
        begin
          SetLength(result,Length(result)+1);
          result[High(result)] := data;
          shift := 7;
          data := 0;
        end;
        if bm.Canvas.Pixels[x,y] <> clWhite then
          data := data and (1 shr shift);
        dec(shift);
      end;
    SetLength(result,Length(result)+1);
    result[High(result)] := data;
    bm.Canvas.Free;
  except
    bm.Canvas.Free;
    SetLength(result,0);
  end;
end;
Wer hat nun eine Idee wie ich es dennoch gebacken Bekomme? Ich habe noch an Bitmap.SaveToStream gedacht... aber beim Windows-Bitmap-Format ist dann soviel Bit-Zauberei notwendig... das nervt. Und wie ich damit dann unter Linux da stehe ist auch noch unklar.
Vorschläge sind also gefragt!

Soweit schonmal vielen Dank,
sascha

Robert Marquardt 19. Feb 2007 07:10

Re: TrueTypeFont Rastern
 
Ich sehe da kein Problem. Du kannst problemlos auf den Canvas einer TBitmap zeichnen. Die Bitmap muss ja nicht sichtbar sein. Das funktioniert auch fuer eine Konsolenanwendung.
Es empfiehlt sich uebrigens ScanLine statt Pixels zu verwenden. Das ist deutlich schneller.

bidi 19. Feb 2007 11:25

Re: TrueTypeFont Rastern
 
Hallo!

Wo liegt dann das Problem? Führe mal o.g. Code aus und setze einen Breakpoint auf "data := data and (1 shr shift)". Da müßte er ja bei jedem schwarzen Pixel anhalten. Tut er aber nicht. Meiner Meinung nach, weil es nur geht, wenn die Canvas-Fläche auch gezeichnet wird. Sonst gibt Pixels[x,y] immer 0... bzw. clWhite zurück :-/... Oder liegt das Problem doch wo anders und ich sehe es nicht?

MfG
sascha

Namenloser 19. Feb 2007 11:36

Re: TrueTypeFont Rastern
 
Es muss an etwas anderem liegen. Im übrigen würde ich statt canvas.pixels bitmap.scanline benutzen, weil diese schneller ist.
Dann musst du aber aufs Pixelformat achten!

edit: ich hab den code gerade mal getestet:
Bei mir scheint es zu funktionieren. außer einer Sache: SetLength(result,...) wird bei mir nicht akzeptiert (weil tbytearray eine festgelegte Größe hat). Aber er hält bei jedem schwarzen pixel an. Allerdings hat sich in result nix geändert... der fehler muss also woanders liegen...
achja:
Delphi-Quellcode:
    bm.Canvas.Free;
    except
    bm.Canvas.Free;
ist ein bisschen komisch, und zwar in zweierlei hinsicht:
1. Gibst du das Canvas des Bitmaps frei und nicht das Bitmap
2. Hätte auch ein finally gereicht.

Delphi-Quellcode:
finally
  bm.free;

Robert Marquardt 19. Feb 2007 11:53

Re: TrueTypeFont Rastern
 
Bevor man auf die Bitmap malen kann muss man die Groesse setzen. TBitmap.Create erzeugt naemlich eine leere Bitmap.
Delphi-Quellcode:
  bm := TBitmap.Create;
  bm.Width := 200;
  bm.Height := 200;
Die richtige Groesse ist natuerlich erst mal dein Problem.

Namenloser 19. Feb 2007 12:38

Re: TrueTypeFont Rastern
 
Delphi-Quellcode:
    bm.Height := Pheight^;
    bm.Width := Pwidth^;
Die Größe wird gesetzt...

Robert Marquardt 19. Feb 2007 13:13

Re: TrueTypeFont Rastern
 
Delphi-Quellcode:
data := data and (1 shr shift)
Hier liegt der Fehler. shl natuerlich.

Reinhard Kern 19. Feb 2007 13:21

Re: TrueTypeFont Rastern
 
Zitat:

Zitat von bidi
Hallo!

... Außerdem muss es wahrscheinlich nach FreePascal unter Linux portiert werden. Also das bitte im Hinterkopf behalten.
...

Ob nun richtig oder falsch, du benutzt derzeit den TrueType-Renderer von Windows. Wenn du wirklich auf Linux portieren willst/must, dann brauchst du über deine derzeitige Software ja nicht weiter nachzudenken.

Natürlich hat auch Linux einen Schriften-Renderer, aber sicher keinen, den man über TCanvas benutzen kann.

Gruss Reinhard

bidi 19. Feb 2007 13:31

Re: TrueTypeFont Rastern
 
Hallo!

Es muss natürlich

bm.Free und shl

heißen. Aber das erklärt den Fehler nicht. Pixels gibt mir immer -1 zurück.

Delphi-Hilfe zu TCanvas:

Beachten Sie, dass die Eigenschaft Pixels nicht von jedem Gerätekontext unterstützt wird. Wenn der vorliegende Gerätekontext die Eigenschaft Pixels nicht unterstützt, gibt ein Lesezugriff den Wert -1 zurück.

Ich Arbeite unter Vista, kann es daran liegen? ...gibt es noch eine andere Möglichkeit den Text zu rendern?


achso..

type
TByteArray = Array of Byte;

hatte ich vergessen ^^

Robert Marquardt 19. Feb 2007 13:43

Re: TrueTypeFont Rastern
 
Der Geraetekontext duerfte es nicht sein. Da ist bestimmt fuer eine TBitmap der Geraetekontext der Grafikkarte eingetragen und der kann ja hoffentlich Pixels. Das bezieht sich ja eher auf exotischere Geraetekontexte wie Drucker.

Es kann natuerlich an Vista liegen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:33 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-2025 by Thomas Breitkreuz