Delphi-PRAXiS
Seite 4 von 7   « Erste     234 56     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Datei an Datei anhängen (https://www.delphipraxis.net/154806-datei-datei-anhaengen.html)

rollstuhlfahrer 26. Sep 2010 13:48

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

Luckie 26. Sep 2010 13:52

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).

mkinzler 26. Sep 2010 14:00

AW: Datei an Datei anhängen
 
Wenn es bei den 2 Dateien bleibt

MiniMax 26. Sep 2010 14:03

AW: Datei an Datei anhängen
 
So habe es erstmal mit dem Zusammenfügen getestet:

Delphi-Quellcode:
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;
Es kommt ein Fehler bei der Zeile
Delphi-Quellcode:
    image1.savetostream(lStream);
Code:
[DCC Fehler] Unit1.pas(110): E2003 Undeklarierter Bezeichner: 'savetostream'
Was is falsch?

SirThornberry 26. Sep 2010 14:05

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.

xZise 26. Sep 2010 14:05

AW: Datei an Datei anhängen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1052090)
Zitat:

Zitat von xZise (Beitrag 1052084)
[...]Und es gibt viele die nicht das Rad neu erfinden: jars, Open Document, Open Office XML Dokumente verwenden alle *.zip zum komprimieren.[...]

Selbst MS nutzt das ZIP-Format für die neuen Office-Dokumente

Argh ein Verdreher, aber Office Open XML ist das neue Format von Office (docx etc.).

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:
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
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.

[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

rollstuhlfahrer 26. Sep 2010 14:07

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

xZise 26. Sep 2010 14:14

AW: Datei an Datei anhängen
 
Zitat:

Zitat von rollstuhlfahrer (Beitrag 1052116)
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

Oder man spart sich den Cast? Weil TGraphic (und btw auch TPicture) können in einem Stream speichern. Wenn man es unbedingt in einen JPG haben will:
Delphi-Quellcode:
var
  jpg : TGraphic;
begin
  jpg := TJPEGImage.Create();
  try
    jpg.Assign(Image1.Picture.Graphic);
    jpg.SaveToStream(stream);
  finally
    jpg.Free;
  end;
end;
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).

MfG
Fabian

SirThornberry 26. Sep 2010 14:21

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?

rollstuhlfahrer 26. Sep 2010 14:22

AW: Datei an Datei anhängen
 
Zitat:

Zitat von xZise (Beitrag 1052122)
Oder man spart sich den Cast? Weil TGraphic (und btw auch TPicture) können in einem Stream speichern.

Du sparst dir zwar den Cast, riskierst aber, dass du die Datei nicht mehr laden kannst, weil einfach kein JPEG gespeichert wurde. Das Problem ist: Der Image-Container schafft es, die Dateieendungen zu den Bildtypen zuzuordnen. Bei Streams sieht das anders aus. Raten macht er nicht und iterativ geht er auch nicht durch. Du musst also dem TJPEGImage einen JPEG-Stream geben. Wenn du jetzt beim speichern gerade zufällig kein JPEG erwischt hast, sondern ein Bitmap, wirds kriminell. Du speicherst erfolgreich dein Bitmap, schaffst es aber nicht mehr dein JPEG zu laden, weil du ja ein Bitmap hast.

Bernhard

ADD: Ja, ansonsten kann man auf den Cast verzichten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:27 Uhr.
Seite 4 von 7   « Erste     234 56     Letzte »    

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