![]() |
AW: Datei an Datei anhängen
Zitat:
Bernhard PS: Das JPEG erkennst du daran, dass es mit "JFIF" anfängt. PPS: Da fehlt ein JPEGStream.Position := 0; |
AW: Datei an Datei anhängen
Moin,
@Bernhard: Und dann will er png Grafiken abspeichern und findet das JFIF nicht mehr ;) @DeddyH: Zitat:
MfG Fabian |
AW: Datei an Datei anhängen
Kann sein, hab ich noch nie versucht.
|
AW: Datei an Datei anhängen
Liste der Anhänge anzeigen (Anzahl: 2)
alsomit dem
Delphi-Quellcode:
geht es jetzt, aber es kommt beim laden ein JPEG Fehler #53
JPEGStream.Position := 0;
und in der Memo steht Statt Hallölle --> HallÿØÿà ??? Ich weiß net was da schief läüft! Habe mal die Datei angehängt |
AW: Datei an Datei anhängen
Ich habe da so meine Bedenken wegen Unicode. Erstmal scheint alles zu stimmen (wenn der Text Ansi ist). Die ersten 4 Byte enthalten die Zahl 8. Dann folgen 8 Zeichen und dann folgen wieder 4 Byte und in denen steht auch die Länge des Rests.
Könntest du vielleicht die JPG noch mit hochladen? [edit]Nachdem das Bild hochgeladen ist: Er scheint 8 Bytes zu früh anfangen zu schreiben. Deshalb überleben nur 4 Zeichen von deinem Satz. Und dann setzte noch ein drauf :mrgreen: und setzt dann nach 4 Byte von JPG noch deine 4 Byte für die Länge.[/edit] [edit]In dieser Zeile
Delphi-Quellcode:
hauts in aus den Socken! Das zweite
lStream.Position := lStream.Position + sizeof(lDataSize);
Delphi-Quellcode:
muss
lStream.Position
Delphi-Quellcode:
sein! Weil die Position ist nach dem setzen der Länge des Textes 4 (weil er 4 Bytes am Anfang der Datei geschrieben hat). Dann addierst du noch die Länge von der Größe dazu (auch 4 Byte). Stattdessen musst du aber am Ende der Datei springen und dann noch 4 Byte weiter (um Platz für die Größe zu lassen).
lStartPos
Übrigens könnte man da auch zwei Methoden daraus machen:
Delphi-Quellcode:
[/edit]
function WriteStream(Source, Dest : TStream; Offset : Integer) : Integer;
var lDataSize : Cardinal; begin Dest.Position := Offset + SizeOf(lDataSize); Dest.CopyFrom(Source); Result := Dest.Position; Dest.Position := Offset; lDataSize := Sourc....; Dest.Write(lDataSize, SizeOf(lDataSize)); end; MfG Fabian PS: Von JFIF scheint es nur das IF überlebt zu haben?! |
AW: Datei an Datei anhängen
und was is nun die Lösung?
|
AW: Datei an Datei anhängen
Wir sind auch keine Roboter oder deine Arbeiter. Hättest auch mal selber beide Dateien im Hex Editor angucken können. Dann wäre dir es vielleicht auch aufgefallen.
MfG Fabian |
AW: Datei an Datei anhängen
ja aber ich weiß nun echt keiine Lösung?
|
AW: Datei an Datei anhängen
Ich danke euch es geht!!! den edit habe ich eben übersehen :-D
Hier der Fertige funktionierende Code:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls,jpeg; type TForm1 = class(TForm) Memo1: TMemo; Image1: TImage; Memo2: TMemo; Image2: TImage; Button2: TButton; Button3: TButton; procedure Zusammenfügen(); procedure Trennen (); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} { TForm1 } { TForm1 } procedure TForm1.Button2Click(Sender: TObject); begin zusammenfügen(); end; procedure TForm1.Button3Click(Sender: TObject); begin trennen(); end; procedure TForm1.FormCreate(Sender: TObject); begin image1.picture.loadfromfile('./bild.jpg'); end; procedure TForm1.Trennen; var lStream: TStream; lStartPos: Int64; lDataSize: Cardinal; TextStream, JPEGStream: TMemoryStream; bildchen: tjpegimage; begin lStream := TFileStream.Create('./meinStream.ampstr', fmOpenRead); try // Länge lesen lStream.Read(lDataSize, sizeOf(lDataSize)); TextStream := TMemoryStream.Create; TextStream.Size := lDataSize; // Text auslesen TextStream.copyfrom(lStream, lDataSize); TextStream.Position := 0; memo2.Lines.LoadFromStream(TextStream); TextStream.Free; // Bild laden lStream.Position := sizeof(lDataSize) + lDataSize; // Diese Zeile sollte weggelassen werden können, da der Stream ja schon die richtige Position hat. // Länge lesen lStream.Read(lDataSize, sizeOf(lDataSize)); JPEGStream := TMemoryStream.Create; JPEGStream.Size := lDataSize; // bild auslesen JPEGStream.copyfrom(lStream, lDataSize); JPEGStream.Position := 0; bildchen:= tjpegimage.Create; bildchen.LoadFromStream(JPEGStream); bildchen.SaveToFile('./bildnew.jpg'); JPEGStream.Free; bildchen.Free; finally lStream.Free; end; end; procedure TForm1.Zusammenfügen; var lStream: TStream; lStartPos: Int64; lDataSize: Cardinal; bildchen:tjpegimage; begin lStream := TFileStream.Create('./meinStream.ampstr', fmCreate); try // Memo speichern lStartPos := 0; lStream.Position := lStartPos + 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 := lStartPos + sizeof(lDataSize); bildchen:= tjpegimage.Create; bildchen.LoadFromFile('./bild.jpg'); bildchen.SaveToStream(lstream); lDataSize := lStream.Position - lStartPos - sizeof(lDataSize); lStream.Position := lStartPos; lStream.Write(lDataSize, sizeof(lDataSize)); finally lStream.Free; bildchen.Free; end; end; end. |
AW: Datei an Datei anhängen
Auch wenn es funktioniert möchte ich noch ein Kommentar abgeben:
Zitat:
Jetzt noch kurz vor Augen führen was der Code da macht:
Naja und der Rest war dann nur den Code im Kopf durchzugehen. So bin ich zumindest den Fehler auf die schliche gekommen. Übrigens hätte ich nach der interessanten Symptomatik noch ein zweiten Test angelegt, wo der Text nicht ein vielfaches von 4 ist. So wäre dann aufgefallen, dass er immer ab den 9. Byte schreibt. Das soll kein Vorwurf sein, aber wenn ich hier so den Thread verfolge, dann befürchte ich du verstehst den Code nicht. Und wenn das der Fall ist kommt man natürlich nicht so schnell so "weit". MfG Fabian |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:56 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