Registriert seit: 7. Jul 2003
Ort: Stuttgart
163 Beiträge
Delphi 6 Enterprise
|
AW: EXIF auf anderes JPEG übertragen
5. Nov 2013, 15:38
So, ich habe nun mal die Anleitung von ASM umgesetzt. Leider ist das JPEG nach der Übernahme von EXIF nicht mehr lesbar.
Delphi-Quellcode:
procedure TForm1.CopyEXIF(const FileNameEXIFSource, FileNameEXIFTarget: string);
var MSSource,MSTarget: TMemoryStream;
FS: TFileStream;
TargetStartPos, SourceEndPos: Longint;
Buf: Array [0..3] of Byte;
begin
MSTarget := TMemoryStream.Create;
try
// 4. Lies dann Deine veränderte jpeg-Datei in den MemoryStream.
MSTarget.LoadFromFile(FileNameEXIFTarget);
MSTarget.Seek(2, soFromBeginning);
if (MSTarget.Read(Buf, 4) = 4) then begin
if (Buf[1] <> M_EXIF) or
(MessageDLG('Die Datei '''+FileNameEXIFTarget+''' hat selbst ein EXIF! Soll dieser wirklich überschrieben werden?',
mtConfirmation, [mbYes, mbNo], 0) = mrYes) then begin
if Buf[1] = M_EXIF then TargetStartPos := (Buf[2]*256)+Buf[3]+2
else TargetStartPos := 2;
MSSource := TMemoryStream.Create;
try
// 1. Lies aus Deiner originalen jpeg-Datei die Größe der EXIF-Struktur aus (steht in den Bytes unmittelbar nach dem EXIF-StartTag "FFE1" und reicht bis zur Kennung "786969660000" = "Exif").
SourceEndPos := 2;
MSSource.LoadFromFile(FileNameEXIFSource);
MSSource.Seek(SourceEndPos, soFromBeginning);
MSSource.Read(Buf, 3);
if Buf[1] = M_EXIF then SourceEndPos := SourceEndPos+(Buf[2]*256)+Buf[3]+2;
// 2. Lies die originale jpeg-Datei in einen MemoryStream. Setze die Größe des MemoryStreams zurück auf die Größe der EXIF-Struktur zuzüglich der 4 führenden Kennbytes der jpeg-Datei (FFD8 und FFE1).
MSSource.SetSize(SourceEndPos);
// 3. Übertrage den MemoryStream in den FileStream, der Deine neue jpeg-Datei anlegt, welche sowohl Dein verändertes jpeg-Bild als auch die ursprüngliche EXIF-Information aufnehmen soll.
FS:= TFileStream.Create(FileNameEXIFTarget, fmCreate or fmShareExclusive);
try
MSSource.SaveToStream(FS);
// 5. Setze den Pointer des MemoryStreams auf die Position $02 (also ab dem 3.Byte, d.h. ohne die JPEG-Kennung "FFD8" der zweiten Datei) und übertrage den MemoryStream ab dieser Position in den zuvor begonnenen Filestream.
MSTarget.Seek(TargetStartPos, soFromBeginning);
FS.CopyFrom(MSTarget, MSTarget.Size-TargetStartPos);
finally
FS.Free;
end
finally
MSSource.Free;
end
end;
end
else MessageDLG('Fehler beim Lesen der Datei '''+FileNameEXIFTarget+'''!', mtError, [mbOk], 0);
finally
MSTarget.Free;
end;
end;
Kann mir jemand sagen, was ich falsch gemacht habe? Ich finde einfach keinen Fehler. Oder geht das so gar nicht?
Gruß
e-gon
|
|
Zitat
|