it-swarm.com.de

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

Ich möchte die EXIF-Informationen (einschließlich Miniaturbild, Metadaten, Kamerainformationen ... alles!) Von JPEG-Dateien entfernen. Ich möchte sie jedoch nicht erneut komprimieren, da durch das erneute Komprimieren von JPEG die Qualität herabgesetzt wird Dateigröße.

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

Es gibt eine ähnliche Frage, aber bezogen auf .NET .

92

exiftool erledigt den Job für mich, es ist in Perl geschrieben, also sollte es für Sie funktionieren

http://www.sno.phy.queensu.ca/~phil/exiftool

verwendungszweck : 

exiftool -all= image.jpg
131
chris

Mit Imagemagick:

convert <input file> -strip <output file>
74
JayM

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

In diesem Thema des ImageMagick-Forums wird erläutert, dass in ImageMagick keine verlustfreien JPEG-Vorgänge unterstützt werden (wenn sich dies ändert, bitte einen Kommentar mit einem Link posten!) Und die Verwendung von jpegtran (aus libjpeg) vorschlagen:

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

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

41

Vielleicht möchten Sie auch in Exiv2 - nachsehen, es ist wirklich schnell (C++ und keine Rekomprimierung), es ist eine Befehlszeile und bietet auch eine Bibliothek für die EXIF-Manipulation, mit der Sie verknüpfen können. Ich weiß nicht, wie viele Linux-Distributionen es zur Verfügung stellen, aber in CentOS ist es derzeit im Basis-Repo verfügbar.

Verwendungszweck:

exiv2 rm image.jpg
25

Ich würde jhead vorschlagen:

man jhead
jhead -purejpg image.jpg
  • das Paket unter Debian (/ ubuntu) hat nur eine Größe von 123 KB
  • es verliert nicht an Qualität, da es nicht erneut komprimiert wird
  • das Programm verändert das Image, sodass Sie ein Backup machen sollten, wenn Sie möchten
18
VasiliNovikov

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

Zum 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 , behält die Originaldatei als Backup bei)
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 , Daten werden überschrieben)
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: PNGs in ICO konvertieren im Kontextmenü .

2
geekley

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

1) Ruft die aktuelle Ausrichtung des Bildes ab.

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

3) Erzeugt die APP1-Orientierungsmarkierung neu und setzt sie auf den ursprünglichen Wert.

4) Findet die erste EOI-Markierung (Ende des Bildes) und schneidet die Datei ab, falls nötig.

Einige Dinge, die Sie zuerst beachten sollten:

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 verschlüsseln diese Daten bis zum Ende der Bilddatei, indem sie eine zweite EOI-Markierung erstellen. Normalerweise lesen Bildprogramme bis zur ersten gefundenen EOI-Markierung. Nikon hat danach Informationen, die mein Programm abschneidet.

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

3) Beim Versuch, ImageMagick zum Entfernen von Exif-Daten zu verwenden, bemerkte ich, dass ich mit einer größeren Datei endete als mit der, mit der ich angefangen habe. Dies lässt mich glauben, dass Imagemagick die Daten verschlüsselt, die entfernt werden sollen, und sie an einer anderen Stelle in der Datei speichert. Nennen Sie mich altmodisch, aber wenn ich etwas aus einer Datei entferne, möchte ich, dass die Dateigröße kleiner ist, wenn sie nicht gleich groß ist. 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!

1
Deanie

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

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

.bat-Datei per Drag & Drop für die Verwendung mit cygwin:

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

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 mit exiv2 -pa IMG.TIF alle Metadaten auflisten.

0

Andere Software:

MetAbility QuickFix

"MetabilityQuickFix entfernt alle Ihre persönlichen Daten und GPS-Positionsdaten mit nur einem Mausklick von allen Ihren Fotos. Er löscht 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/Reinigen/Entfernen von Metadaten (Junk) aus JPG/JPEG/JFIF- und PNG-Dateien. Die Bildqualität IS NICHT BETROFFEN. Beinhaltet die Befehlszeilenunterstützung Kommandozeile (Platzhalter erlaubt) "

0
Remus Rigo