![]() |
AW: Datei an Datei anhängen
Für den Text mag das vielleicht gelten, aber es gibt meines Wissens keine Möglichkeit, die Größe eines JPEGs, welches sich im Speicher befindet, zu ermitteln, die es anschließend auf der Festplatte haben wird. Hinzu kommt vor allem bei JPEG noch die Kompression, wodurch man nicht sagen kann, die groß das JPEG jetzt wirklich wird.
Bernhard |
AW: Datei an Datei anhängen
Zum Schreiben musst du es auch gar nicht wissen, wenn es nur ein Text mit einem JPEG ist. Dann schreibst du eben so lange, bis das ganze JPEG geschrieben ist. Und wenn du die Größe zum Auslesen brauchst, kannst du sie dir ausrechnen: Dateigröße - Header - Text(länge).
|
AW: Datei an Datei anhängen
Wenn es bei den 2 Dateien bleibt
|
AW: Datei an Datei anhängen
So habe es erstmal mit dem Zusammenfügen getestet:
Delphi-Quellcode:
Es kommt ein Fehler bei der Zeile
procedure TForm1.Zusammenfügen;
var lStream: TStream; lStartPos: Int64; lDataSize: Cardinal; //bildchen:jpeg; begin lStream := TFileStream.Create('meinStream.ampstr', fmCreate); try // Memo speichern lStartPos := 0; lStream.Position := lStream.Position + sizeof(lDataSize); memo1.Lines.SaveToStream(lStream); lDataSize := lStream.Position - lStartPos - sizeof(lDataSize); lStream.Position := lStartPos; lStream.Write(lDataSize, sizeof(lDataSize)); // JPG speichern lStartPos := lStream.Size; lStream.Position := lStream.Position + sizeof(lDataSize); image1.savetostream(lStream); lDataSize := lStream.Position - lStartPos - sizeof(lDataSize); lStream.Position := lStartPos; lStream.Write(lDataSize, sizeof(lDataSize)); finally lStream.Free; end; end;
Delphi-Quellcode:
image1.savetostream(lStream);
Code:
Was is falsch?
[DCC Fehler] Unit1.pas(110): E2003 Undeklarierter Bezeichner: 'savetostream'
|
AW: Datei an Datei anhängen
Image1 ist kein JPG. Der bisher gezeigte Code war für das Speichern eines JPG's
Ein ganzes TImage speichern macht auch keinen Sinn, oder willst du Transparenzfarbe, größe auf der Form, Stretchmodus, Anchors etc. davon speichern? Also einfach überlegen was du wirklich speichern willst und schauen ob es da ein SaveToStream gibt. |
AW: Datei an Datei anhängen
Zitat:
Und wegen der Länge: Wenn die JPG im Stream drin ist, dann ist sie ja fertig kodiert etc. das heißt man kennt schon deren Größe. Ein anderer Weg wäre die Länge hinten zu speichern. Bei Schreiben wird dann direkt hintereinander weg geschrieben, und beim lesen wird die letzte Größe gelesen, soweit nach vorne gesprungen und dann eingelesen werden:
Code:
Der aktuelle Weg wäre auch mit einem Pufferstream möglich. Darein kopiert man den Inhalt nimmt die Länge, schreibt sie, und kopiert dann den Inhalt des Pufferstreams in den echten Dateistream.
i := Lese letzten Cardinal
Mache solange Springe i Bytes - Cardinalbreite * 2 zurück j := Lese Cardinal (= Länge von den Daten davor) Lese i Bytes Springe (i + j) Bytes - Cardinalbreite * 2 zurück i := j; bis Position <= 0 [redbox]Statt Image1.SaveToStram mach mal lieber Image1.Picture.SaveToStream. Das TImage zeigt nur ein TPicture an, das heißt speichern kann nur das Bild selber (und nicht der "Anzeiger").[/redbox] [redbox #2]TImage selber geht nicht zu speichern, nur das Bild, was es geladen hat.[/redbox #2] MfG Fabian |
AW: Datei an Datei anhängen
Ganz einfach: Du willst doch das Bild speichern und nicht den Container. Also brauchst du: (Image1.Picture.Graphic as TJPEGImage).SaveToStream();
Sollte sich mal kein JPEG in dem Image befinden, gibts hier ne Exception. Bernhard |
AW: Datei an Datei anhängen
Zitat:
Delphi-Quellcode:
So brauchst du nur den Konstruktor ändern und kannst es in alles andere speichern, sofern es von TGraphic erbt. Und du hast keine Exception und es ist irrelevant was im Image1 steht (imho).
var
jpg : TGraphic; begin jpg := TJPEGImage.Create(); try jpg.Assign(Image1.Picture.Graphic); jpg.SaveToStream(stream); finally jpg.Free; end; end; MfG Fabian |
AW: Datei an Datei anhängen
Ist das alles überhaupt nötig? Ist SaveToStream nicht eine abstrakte Methode von TGraphic so das man sich jeden Cast etc. sparen kann?
|
AW: Datei an Datei anhängen
Zitat:
Bernhard ADD: Ja, ansonsten kann man auf den Cast verzichten. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:52 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