Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Grafiken in Binär-oder Hexadezimalcode umwandeln (https://www.delphipraxis.net/55421-grafiken-binaer-oder-hexadezimalcode-umwandeln.html)

Pascal 20. Okt 2005 16:18


Grafiken in Binär-oder Hexadezimalcode umwandeln
 
Hallo,

ich habe folgendes Problem:
Ich möchte eine rtf-Datei schreiben, um diese später von Word anzeigen zu lassen.
Ich öffne die rtf-Datei als normale Datei und lese sie in einen Buffer ein. Diesen erweitere ich dann mit rtf-Tags und schreibe den Buffer wieder zurück.
Nun muss ich auch Bilder einfügen können. Bilder werden im rtf-Format im Binär-oder Hexadezimalcode gelesen.
Gibt es eine Möglichkeit, beliebige Grafiken zu laden, in Binärcode umzuwandeln und diesen dann in eine Datei zu schreiben?
Oder hat sonst jemand eine Idee?

Grüße Pascal

Niko 20. Okt 2005 16:44

Re: Grafiken in Binär-oder Hexadezimalcode umwandeln
 
Hi,

deine Grafik liegt ja als Binärdatei vor. Somit sollte es reichen, die Grafikdatei als Stream zu öffnen und in deine rtf-Datei zu kopieren. Falls du die Grafik in deinem Programm brauchst, müsste sich auch die Methode SaveToStream von TGraphic verwenden lassen.

Flocke 20. Okt 2005 18:07

Re: Grafiken in Binär-oder Hexadezimalcode umwandeln
 
Wenn du es probierst: bedenke, dass in RTF-Dateien alle Grafiken als Metafiles abgespeichert werden (WMF ohne Header).

Ich poste mal etwas Beispielcode (ungetestet):

Delphi-Quellcode:
function MetafileToRtf(Metafile: TMetafile: OutputStream: TStream);
type
  TMetafileHeader = packed record
    Key: Cardinal;
    Handle: SmallInt;
    Box: TSmallRect;
    Inch: Word;
    Reserved: Cardinal;
    CheckSum: Word;
  end;
var
  MemoryStream: TMemoryStream;
  DataSize: int64;
  Pre, Suf: string;
begin
  MemoryStream := TMemoryStream.Create;
  try
    Metafile.Enhanced := false;
    Metafile.SaveToStream(MemoryStream);
    MemoryStream.Position := SizeOf(TMetafileHeader);
    DataSize := MemoryStream.Size - MemoryStream.Position;

    { \picw und \pich - Darstellungsgröße in 1/100 mm
      \picwgoal und \pichgoal - Originalgröße in Twips
      \picscalex und picscaley - Verhältnis Darstellungsgröße:Originalgröße in Prozent
    }
    Pre := Format('{\pict\wmetafile8\picw%d\pich%d' +
      '\picscalex%d\picscaley%d\picwgoal%d\pichgoal%d\bin%d'#13#10,
      [MulDiv(Metafile.Width, 2560, Metafile.Inch),
       MulDiv(Metafile.Height, 2560, Metafile.Inch),
       100, 100,
       MulDiv(Metafile.Width, 1440, Metafile.Inch),
       MulDiv(Metafile.Height, 1440, Metafile.Inch),
       DataSize]);
    Suf := '}';

    OutputStream.WriteBuffer(Pre[1], Length(Pre));
    OutputStream.CopyFrom(MemoryStream, DataSize);
    OutputStream.WriteBuffer(Suf[1], Length(Suf));
  finally
    MemoryStream.Free;
  end;
end;
Danach noch ein "OutputStream.Position := 0" und du kannst die Daten aus dem Stream benutzen.

Achso: Wenn deine Grafik nicht als Metafile vorliegt, dann kannst du sie ja einfach erst als Bitmap laden und dann in den Canvas eines Metafiles malen.

marabu 20. Okt 2005 19:05

Re: Grafiken in Binär-oder Hexadezimalcode umwandeln
 
Hi Flocke,

die RTF Spezifikation vom April 2004 nennt 10 mögliche Bildformate, darunter JPEG, PNG, BMP und auch WMF. Da RTF den Anspruch der Plattformunabhängigkeit erhebt, wäre WMF alleine auch etwas zu wenig.

Freundliche Grüße vom marabu

Flocke 20. Okt 2005 19:26

Re: Grafiken in Binär-oder Hexadezimalcode umwandeln
 
Ist schon richtig (man kann im Grunde über OLE eh alles reinpacken) - aber welche Programme können diese Grafiken denn dann darstellen?

[Nachtrag] OK - hab's gerade nachgelesen - steht in der RTF Spezi 2002 Final auch schon drin. Hab's allerdings in wirklichem RTF noch nie gesehen :shock:

[Noch'n Nachtrag] Der obige Code würde aber auch mit den anderen \picttype funktionieren - man muss dann nur den Binärstream ersetzen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:49 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