Einzelnen Beitrag anzeigen

e-gon

Registriert seit: 7. Jul 2003
Ort: Stuttgart
163 Beiträge
 
Delphi 6 Enterprise
 
#8

AW: EXIF auf anderes JPEG übertragen

  Alt 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
  Mit Zitat antworten Zitat