Wie entferne ich EXIF-Daten, ohne das JPEG erneut zu komprimieren?

127

Ich möchte die EXIF-Informationen (einschließlich Miniaturansichten, Metadaten, Kamerainformationen ... alles!) Aus JPEG-Dateien entfernen, aber ich möchte sie nicht erneut komprimieren, da das erneute Komprimieren des JPEG die Qualität beeinträchtigt und normalerweise die Qualität erhöht Dateigröße.

Ich suche nach einer Unix / Linux-Lösung, noch besser, wenn ich die Befehlszeile benutze. Verwenden Sie nach Möglichkeit ImageMagick (Konvertierungswerkzeug). Wenn dies nicht möglich ist, wäre ein kleines Python-, Perl-, PHP-Skript (oder eine andere unter Linux gebräuchliche Sprache) in Ordnung.

Es gibt eine ähnliche Frage, die sich jedoch auf .NET bezieht .

Denilson Sá Maia
quelle
1
Verwandte: askubuntu.com/questions/260810/…
Ciro Santilli 法轮功 冠状 病. 事件 法轮功

Antworten:

166

exiftool erledigt den Job für mich, es ist in Perl geschrieben und sollte für Sie auf allen Betriebssystemen funktionieren

https://exiftool.org/

Verwendung :

exiftool -all= image.jpg
chris
quelle
6
Einige andere interessante Optionen: "-o outfile.jpg" oder "-out outfile.jpg", "-overwrite_original" oder "-overwrite_original_in_place", "-P" oder "-preserve", "-r" oder "-recurse"
Denilson Sá Maia
6
Ich bin gerade auf diesen Thread gestoßen und habe nach dem gleichen gesucht. Ich dachte nur, ich würde hier einen Kommentar für Ubuntu-Benutzer hinzufügen: Das Skript ist in den Ubuntu-Repos als libimage-exiftool-perl verfügbar: sudo apt-get install libimage-exiftool-perl
user605331
7
Oder mit Homebrewbrew install exiftool
CWD
6
Wenn Sie dem Programm wirklich vertrauen, fügen Sie den -overwrite_originalSchalter hinzu und das Programm erstellt die Sicherungsdateien nicht.
Salman A
10
Die akzeptierte Verwendung mit der Option -all = entfernt ALLE Tags aus Ihrer image.jpg! Die richtige Antwort wäreexiftool -EXIF= image.jpg
PeterCo
85

Mit imagemagick:

convert <input file> -strip <output file>
JayM
quelle
21
Entschuldigung, aber -strip funktioniert nicht wie erwartet, da ImageMagick die JPEG-Datei immer noch erneut komprimiert.
Denilson Sá Maia
5
Beachten Sie übrigens, dass "-strip" nützlich sein kann, wenn jemand andere Transformationen mit der Datei durchführt. Beachten Sie auch, dass "-thumbnail 123x456" FAST "-strip -resize 123x456" entspricht.
Denilson Sá Maia
15
+1, weil dies meilenweit einfacher war als das Herunterladen eines neuen Tools.
Dave Dopson
13
Hinweis -stripentfernt Farbprofile. Für alle, die versuchen, EXIF-Daten zu entfernen,
Robbert
2
OP sollte diese Antwort aktualisieren, da sie zweimal falsch ist.
Berbt
49

ImageMagick verfügt über den Parameter -strip , komprimiert das Bild jedoch vor dem Speichern erneut. Daher ist dieser Parameter für meine Bedürfnisse unbrauchbar.

In diesem Thema aus dem ImageMagick-Forum wird erklärt, dass verlustfreie JPEG-Operationen in ImageMagick nicht unterstützt werden (wenn sich dies ändert, posten Sie bitte einen Kommentar mit einem Link!) Und die Verwendung von jpegtran (von libjpeg) vorgeschlagen wird:

jpegtran -copy none -progressive image.jpg > newimage.jpg
jpegtran -copy none -progressive -outfile newimage.jpg image.jpg

(Wenn Sie sich nicht sicher sind, ob ich meine eigene Frage beantworte, lesen Sie dies und das und das )

Denilson Sá Maia
quelle
1
Versuchte die jpegtran-Methode, aber in den meisten Fällen wird die Dateigröße erhöht, anstatt sie zu verringern. In den meisten Fällen möchten Sie dies tun, um die Dateigröße zu verringern.
Codebeat
1
Beim Versuch, mit ImageMagick Exif-Daten zu entfernen, stellte ich fest, dass ich eine größere Datei hatte als ursprünglich. Dies lässt mich glauben, dass Imagemagick die Daten, die Sie entfernen möchten, codiert und an einer anderen Stelle in der Datei speichert. Nennen Sie mich altmodisch, aber wenn ich etwas aus einer Datei entferne, möchte ich, dass eine Dateigröße kleiner ist, wenn nicht dieselbe. Alle anderen Ergebnisse deuten auf Data Mining hin.
Deanie
1
Ein kleiner Punkt: Für mich funktionierte keiner der jpegtran -copy none image.jpg newimage.jpg
beiden
@Codebeat Sie müssen param hinzufügen. -progressiveDadurch wird die Größe verringert.
Tom
31

Vielleicht möchten Sie auch einen Blick auf Exiv2 werfen - es ist sehr schnell (C ++ und keine Neukomprimierung), es ist eine Befehlszeile und es bietet auch eine Bibliothek für die EXIF-Manipulation, mit der Sie verknüpfen können. Ich weiß nicht, wie viele Linux-Distributionen es verfügbar machen, aber in CentOS ist es derzeit im Basis-Repo verfügbar.

Verwendung:

exiv2 rm image.jpg
Bogdan Stăncescu
quelle
1
Danke Mann, dies ist der erste, der seine Arbeit sehr gut macht, ohne Qualitätsverlust und blitzschnell! Du verdienst +100! Aber um ALLE Arten von Headern zu entfernen, muss ich die Option -da angeben, da sonst keine Adobe Photoshop / Creator-Informationen aus JPGs entfernt werden. Ich bin sowieso unter Windows.
Codebeat
Vielen Dank! Ich wollte bestätigen, dass exiv2 GPS-Standortinformationen anzeigt, damit ich sehen kann, dass sie verschwunden sind. Die Standardoption für den Druck ist "Zusammenfassung", bei der GPS-Informationen ausgeschlossen sind. Um alle Informationen zu sehen, müssen Sie verwenden: exiv2 -pa pr image.jpg
Rob Russell
Bitte beachten Sie, dass dieses Tool die Qualität einiger meiner JPEGs zerstört hat. Zum Glück hatte ich ein Backup
Steel Brain
@SteelBrain, das ist wirklich seltsam - können Sie eines der davon betroffenen JPEG-Bilder freigeben?
Bogdan Stăncescu
Dies ist die sicherste Lösung
Mohammed Shareef C
20

Ich würde vorschlagen jhead:

man jhead
jhead -purejpg image.jpg

Nur 123 KB unter Debian / Ubuntu werden nicht erneut komprimiert. Beachten Sie jedoch, dass das Bild mutiert. Kopieren Sie daher das Original, wenn Sie es benötigen.

VasiliNovikov
quelle
2

Ich habe dieses Projekt kürzlich in C durchgeführt. Der folgende Code bewirkt Folgendes:

1) Ruft die aktuelle Ausrichtung des Bildes ab.

2) Entfernt alle in APP1(Exif-Daten) und APP2(Flashpix-Daten) enthaltenen Daten durch Ausblenden.

3) Erstellt die APP1Orientierungsmarkierung neu und setzt sie auf den ursprünglichen Wert.

4) Findet den ersten EOIMarker (Bildende) und schneidet die Datei ab, falls erforderlich.

Einige Dinge, die zuerst zu beachten sind, sind:

1) Dieses Programm wird für meine Nikon-Kamera verwendet. Das JPEG-Format von Nikon fügt am Ende jeder erstellten Datei etwas hinzu. Sie codieren diese Daten bis zum Ende der Bilddatei, indem sie eine zweite EOIMarkierung erstellen . Normalerweise lesen Bildprogramme bis zum ersten EOIgefundenen Marker. Nikon hat danach Informationen, die mein Programm abschneidet.

2) Da dies für das Nikon-Format gilt, wird die big endianBytereihenfolge angenommen. Wenn Ihre Bilddatei verwendet wird little endian, müssen einige Anpassungen vorgenommen werden.

3) Beim Versuch, ImageMagickExif-Daten zu entfernen, stellte ich fest, dass ich eine größere Datei hatte als die, mit der ich begonnen hatte. Dies lässt mich glauben, dass Imagemagickdie zu entfernenden Daten verschlüsselt und an einer anderen Stelle in der Datei gespeichert werden. Nennen Sie mich altmodisch, aber wenn ich etwas aus einer Datei entferne, möchte ich, dass eine Dateigröße kleiner ist, wenn nicht dieselbe. Alle anderen Ergebnisse deuten auf Data Mining hin.

Und hier ist der Code:

#include <stdio.h>
#include <stdlib.h>
#include <libgen.h>
#include <string.h>
#include <errno.h>

// Declare constants.
#define COMMAND_SIZE     500
#define RETURN_SUCCESS     1
#define RETURN_FAILURE     0
#define WORD_SIZE         15

int check_file_jpg (void);
int check_file_path (char *file);
int get_marker (void);
char * ltoa (long num);
void process_image (char *file);

// Declare global variables.
FILE *fp;
int orientation;
char *program_name;

int main (int argc, char *argv[])
{
// Set program name for error reporting.
    program_name = basename(argv[0]);

// Check for at least one argument.
    if(argc < 2)
    {
        fprintf(stderr, "usage: %s IMAGE_FILE...\n", program_name);
        exit(EXIT_FAILURE);
    }

// Process all arguments.
    for(int x = 1; x < argc; x++)
        process_image(argv[x]);

    exit(EXIT_SUCCESS);
}

void process_image (char *file)
{
    char command[COMMAND_SIZE + 1];

// Check that file exists.
    if(check_file_path(file) == RETURN_FAILURE)
        return;

// Check that file is an actual JPEG file.
    if(check_file_jpg() == RETURN_FAILURE)
    {
        fclose(fp);
        return;
    }

// Jump to orientation marker and store value.
    fseek(fp, 55, SEEK_SET);
    orientation = fgetc(fp);

// Recreate the APP1 marker with just the orientation tag listed.
    fseek(fp, 21, SEEK_SET);
    fputc(1, fp);

    fputc(1, fp);
    fputc(18, fp);
    fputc(0, fp);
    fputc(3, fp);
    fputc(0, fp);
    fputc(0, fp);
    fputc(0, fp);
    fputc(1, fp);
    fputc(0, fp);
    fputc(orientation, fp);

// Blank the rest of the APP1 marker with '\0'.
    for(int x = 0; x < 65506; x++)
        fputc(0, fp);

// Blank the second APP1 marker with '\0'.
    fseek(fp, 4, SEEK_CUR);

    for(int x = 0; x < 2044; x++)
        fputc(0, fp);

// Blank the APP2 marker with '\0'.
    fseek(fp, 4, SEEK_CUR);

    for(int x = 0; x < 4092; x++)
        fputc(0, fp);

// Jump the the SOS marker.
    fseek(fp, 72255, SEEK_SET);

    while(1)
    {
// Truncate the file once the first EOI marker is found.
        if(fgetc(fp) == 255 && fgetc(fp) == 217)
        {
            strcpy(command, "truncate -s ");
            strcat(command, ltoa(ftell(fp)));
            strcat(command, " ");
            strcat(command, file);
            fclose(fp);
            system(command);
            break;
        }
    }
}

int get_marker (void)
{
    int c;

// Check to make sure marker starts with 0xFF.
    if((c = fgetc(fp)) != 0xFF)
    {
        fprintf(stderr, "%s: get_marker: invalid marker start (should be FF, is %2X)\n", program_name, c);
        return(RETURN_FAILURE);
    }

// Return the next character.
    return(fgetc(fp));
}

int check_file_jpg (void)
{
// Check if marker is 0xD8.
    if(get_marker() != 0xD8)
    {
        fprintf(stderr, "%s: check_file_jpg: not a valid jpeg image\n", program_name);
        return(RETURN_FAILURE);
    }

    return(RETURN_SUCCESS);
}

int check_file_path (char *file)
{
// Open file.
    if((fp = fopen(file, "rb+")) == NULL)
    {
        fprintf(stderr, "%s: check_file_path: fopen failed (%s) (%s)\n", program_name, strerror(errno), file);
        return(RETURN_FAILURE);
    }

    return(RETURN_SUCCESS);
}

char * ltoa (long num)
{
// Declare variables.
        int ret;
        int x = 1;
        int y = 0;
        static char temp[WORD_SIZE + 1];
        static char word[WORD_SIZE + 1];

// Stop buffer overflow.
        temp[0] = '\0';

// Keep processing until value is zero.
        while(num > 0)
        {
                ret = num % 10;
                temp[x++] = 48 + ret;
                num /= 10;
        }

// Reverse the word.
        while(y < x)
        {
                word[y] = temp[x - y - 1];
                y++;
        }

        return word;
}

Hoffe das hilft jemandem!

Deanie
quelle
1

Hinweis zur Vereinfachung: Wenn Sie unter Windows arbeiten, können Sie eine REG-Datei auf die Registrierung anwenden, um einen Eintrag im Kontextmenü zu installieren, sodass Sie Metadaten einfach entfernen können, indem Sie mit der rechten Maustaste auf die Datei klicken und den Befehl auswählen.

Beispiel: Denken Sie daran, die Pfade so zu bearbeiten, dass sie darauf verweisen, wo die ausführbaren Dateien auf Ihrem Computer installiert sind.)


Für JPEG-, JPG-, JPE- und JFIF-Dateien: Befehl " Metadaten entfernen "
(mit ExifTool wird die Originaldatei als Sicherung beibehalten)
exiftool -all= image.jpg

JPG-RemoveExif.reg

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Classes\jpegfile\shell\RemoveMetadata]
@="Remove metadata"
[HKEY_CURRENT_USER\Software\Classes\jpegfile\shell\RemoveMetadata\command]
@="\"C:\\Path to\\exiftool.exe\" -all= \"%1\""
[HKEY_CURRENT_USER\Software\Classes\jpegfile\shell\RemoveMetadata]
"Icon"="C:\\Path to\\exiftool.exe,0"

Für PNG-Dateien: Befehl "In minimiertes PNG konvertieren "
(mit ImageMagick werden Daten geändert, die die Originaldatei überschreiben)
convert -background none -strip -set filename:n "%t" image.png "%[filename:n].png"

PNG-Minify.reg

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Classes\pngfile\shell\ConvertToMinifiedPNG]
@="Convert to minified PNG"
[HKEY_CURRENT_USER\Software\Classes\pngfile\shell\ConvertToMinifiedPNG\command]
@="\"C:\\Path to\\convert.exe\" -background none -strip -set filename:n \"%%t\" \"%1\" \"%%[filename:n].png\""
[HKEY_CURRENT_USER\Software\Classes\pngfile\shell\ConvertToMinifiedPNG]
"Icon"="C:\\Path to\\convert.exe,0"

Verwandte: Konvertieren Sie PNGs in ICO im Kontextmenü .

Geekley
quelle
1

Wir haben dies verwendet, um Breitengraddaten aus der TIFF-Datei zu entfernen:

exiv2 mo -M"del Exif.GPSInfo.GPSLatitude" IMG.TIF Hier können Sie exiv2 -pa IMG.TIFalle Metadaten auflisten.

Muhammet Ali Asan
quelle
1

Für verlustfreie EXIF-Streifen können Sie libexif verwenden , das mit cygwin verfügbar ist . Entfernen Sie sowohl EXIF ​​als auch Miniaturansicht, um ein Bild zu anonymisieren:

$ exif --remove --tag=0 --remove-thumbnail exif.jpg -o anonymized.jpg

Drag- .batand -Drop- Datei zur Verwendung mit Cygwin:

@ECHO OFF
exif --remove --tag=0 --remove-thumbnail %~1
Radioxom
quelle
0

Andere Software:

MetAbility QuickFix

"MetabilityQuickFix entfernt alle Ihre persönlichen Informationen und GPS-Standortdaten mit nur einem Mausklick von all Ihren Fotos. Es entfernt alle Metadatenelemente aus Exif-, Iptc- und XMP-Datenblöcken sicher aus Ihren JPEG-Dateien und erstellt automatisch Sicherungskopien der Originaldateien ""

JPEG & PNG Stripper

"Ein Tool zum Entfernen / Bereinigen / Entfernen nicht benötigter Metadaten (Junk) aus JPG / JPEG / JFIF- und PNG-Dateien. Die Bildqualität wird nicht beeinflusst. Enthält Befehlszeilenunterstützung. Geben Sie einfach einen Ordner oder eine Datei in der Befehlszeile an (Platzhalter zulässig)."

Remus Rigo
quelle
0

Wenn Sie jpegoptim bereits verwenden, können Sie damit auch das Exif entfernen.

jpegoptim -s *
strifel
quelle