AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia EXIF auf anderes JPEG übertragen
Thema durchsuchen
Ansicht
Themen-Optionen

EXIF auf anderes JPEG übertragen

Ein Thema von e-gon · begonnen am 28. Okt 2013 · letzter Beitrag vom 6. Nov 2013
 
ASM

Registriert seit: 15. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#9

AW: EXIF auf anderes JPEG übertragen

  Alt 5. Nov 2013, 16:27
Kann mir jemand sagen, was ich falsch gemacht habe? Ich finde einfach keinen Fehler. Oder geht das so gar nicht?
Doch natürlich, es geht. Aber Dein Fehlschlag ist durch einen unvorsichtigen Fehler bei meinen Angaben zum Vorgehen verursacht:
Auch wenn man den Pointer im Stream auf eine Position in einem Offset vom Anfang des Streams setzt, wird trotzdem beim SaveToStream der komplette Stream von Position 0 an gespeichert. Somit also auch die beiden ersten Bytes $FF$D8 aus dem Stream des Files ohne ExIf, von dem die eigentlichen Bilddaten übernommen werden und der an den Stream der ExIf-Daten angehängt wird. Diese beiden Bytes dürfen aber nicht mitkopiert werden. Wenn das jedoch der Fall ist, kommen diverse (allerdings nicht alle) Bildbearbeitungsprogramme bzw. Viewer aus dem Tritt.

Berichtigte Lösung: Überschreiben der ersten beiden Bytes (also $FF$D8) im Stream der Bilddaten durch $00$00 vor dem Anhängen dieses Streams an den Stream der ExIf-Struktur.

Folgendes Beispiel vermeidet den beschriebenen Fehler (ausgetestet!):
Delphi-Quellcode:
procedure CopyExIf2JPG(const SourceFileHasExIf, SourceFileWithOutExIf, TargetFile: String);
var
  fsTarget: TFileStream;
  ms: TMemoryStream;
  buffer: Array [1..2] of byte;
begin
  fsTarget := TFileStream.Create(TargetFile, fmCreate);
  try
    ms := TMemoryStream.Create;
    try
      ms.LoadFromFile(SourceFileHasExIf);
      ms.Seek(0, soFromBeginning);
      ms.Size := $03E6;
      ms.SaveToStream(fsTarget);
      ms.Clear;
      ms.LoadFromFile(SourceFileWithOutExIf);
      fillchar(buffer,sizeof(buffer),#0);
      ms.Seek(0, soFromBeginning);
      ms.Write(Buffer,2); // hic!
      ms.SaveToStream(fsTarget);
    finally
      ms.Free;
    end;
  finally
    fsTarget.Free;
  end;
end;
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:25 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