Verhindert, dass imagejpeg () EXIF-Daten für Bilder speichert (spez. FileDateTime)

8

Unser Server speichert EXIF-Daten in jeder Datei, die mit imagejpeg() gespeichert wurde. Soweit ich weiß, ist dies nicht das Standardverhalten (oder sogar möglich, von dem, was ich gelesen habe). Aber tritt auf, und aufgrund der FileDateTime -Information, die eingeschlossen wird (und die time von save verwendet), bricht es die Funktionalität in unserem Upload- / Genehmigungssystem ( md5_file() gibt a zurück anderer Wert für das exakt gleiche Bild, da FileDateTime immer unterschiedlich ist).

Gibt es eine Möglichkeit zu verhindern, dass imagejpeg() standardmäßig EXIF-Daten für Bilder speichert?

Serverinformationen

  • CentOS 5
  • Parallels Plesk Panel 10.4.4
  • GD Version: gebündelt (2.0.34 kompatibel)
  • PHP 5.3

Code

%Vor%     
0b10011 30.04.2012, 17:43
quelle

10 Antworten

2

Offenbar mag GD nicht, wenn der Pfad zur Eingabe- / Ausgabedatei gleich ist, aber das Guthaben ist nicht meins. Um das Problem zu beheben, verwenden Sie eine neue (tmp) Datei, um das neu erstellte Bild zu speichern:

%Vor%     
Alix Axel 16.05.2012, 17:08
quelle
4

Es sieht so aus, als ob Sie hier verschiedene Dinge ausprobiert haben, aber versuchen Sie es noch einmal. Benötigen Sie jemals EXIF-Informationen in Ihrer Anwendung? Wenn nicht, lassen Sie Unterstützung für EXIF ​​herausnehmen und sehen, ob es das vollständig entfernt.

Wenn es es nicht entfernt, dann lesen vielleicht die Funktionen es von den vorhandenen Fotos und fügen es dann blind in die Datei ein, die geschrieben wird. Sie können das sicher wissen, indem Sie die EXIF-Informationen bei jedem Prozessschritt ausdrucken.

    
Michael Blood 11.05.2012 03:58
quelle
4

Keine Ahnung, warum EXIF-Daten geschrieben werden - daher hilft Ihnen das Folgende, es zu entfernen.

Ein Vorschlag ist es, etwas als Befehl auf dem Server auszuführen - es wird eine Installation benötigt: Ссылка - und dann ausführen durch EXEC von PHP.

Es gibt hier auch eine Lösung, die ImageMagick verwendet, wenn Sie das auch installiert haben (oder es installieren lassen: Lösche EXIF-Daten aus JPG mit PHP (aber beachte die Warnung vor der Farbe)

Andernfalls ist der andere Vorschlag wie oben, versuchen Sie, die EXIT-Erweiterung auszuschalten.

Tut mir leid, wenn sie nicht helfen, aber Sie haben nach Vorschlägen gefragt.

    
Robbie 11.05.2012 11:49
quelle
2

Lesen Sie dies, vielleicht wird es helfen:

Ссылка

und das:

Ссылка

    
Vlad Balmos 14.05.2012 15:17
quelle
2

Sie könnten die jpeg möglicherweise zuerst in eine gif umwandeln und dann die gif zurück in eine jpeg konvertieren. Wenn ich das tue, verstehe ich, dass Sie die EXIF-Daten zerstören würden. Es ist ein Hack, aber es sollte funktionieren.

    
pogeybait 09.05.2012 16:51
quelle
2

Das einzige, was Ihnen in den Sinn kommt, ist, dass Sie die EXIF-Daten ignorieren und Ihren Hash von etwas anderem machen könnten? Mein Vorschlag wäre, entweder die rohe Ausgabe zu hashen, ohne sie in einer Datei zu speichern (hier im gif-Format, die ein kleineres 8-Bit-Bild für die Performance erzeugt), in einen Ausgabepuffer und den Pufferinhalt zu hashing)

%Vor%

Oder Sie könnten eine Zeichenkette erstellen, die nur die Pixelinformationen und den Hashwert enthält (hier durch Zugreifen auf jeden Pixel und Anhängen seines Wertes an eine Zeichenkette, umgekehrt für die Leistung)

%Vor%

Für die Performance können Sie auch nur Samples aus dem Bild nehmen, da dies genauso gut oder vielleicht sogar besser funktionieren sollte (hier wird jedes fünfte Pixel jeder fünften Zeile abgetastet)

%Vor%

Ich hoffe, dass einige davon funktionieren werden (wie ich es momentan nicht testen kann) oder zumindest wird es dir helfen, den Weg zu finden, der für dich funktioniert:)

    
Flygenring 16.05.2012 13:21
quelle
1

Dies ist ein bisschen ein Hack, aber es wird funktionieren, tun Sie dies nach Ihrer switch() -Anweisung:

%Vor%

GD entfernt alle EXIF-Daten, da sie dies nicht unterstützen.

    
Dave 16.05.2012 14:10
quelle
0

Sie könnten imagecreatefromjpeg für das mit imagejpeg erstellte Bild verwenden und es durch das neu erstellte Bild ersetzen.

    
Newton Smartt 09.05.2012 22:53
quelle
0

$res = imagecreatefromjpeg($filename) um das Bild zu laden, dann imagejpeg($res, $filename, QUALITY) um es neu zu rendern.

Sie können auch imagemagick verwenden:

%Vor%     
Moritz 09.05.2012 23:08
quelle
0
  

Dein PHP muss mit --enable-exif kompiliert werden.

Versuchen Sie, die globale EXIF-Funktionalität zu deaktivieren, indem Sie PHP ohne diese Option neu kompilieren.

    
bodi0 16.05.2012 14:17
quelle

Tags und Links