![]() |
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 |
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. |
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:
Danach noch ein "OutputStream.Position := 0" und du kannst die Daten aus dem Stream benutzen.
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; 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. |
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 |
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