Come rimuovere i dati EXIF ​​senza ricomprimere il JPEG?


127

Voglio rimuovere le informazioni EXIF ​​(inclusi miniature, metadati, informazioni sulla fotocamera ... tutto!) Dai file JPEG, ma non voglio ricomprimerli, poiché ricomprimere il JPEG peggiorerà la qualità, e di solito aumentando il dimensione del file.

Sto cercando una soluzione Unix / Linux, ancora meglio se si utilizza la riga di comando. Se possibile, usando ImageMagick (strumento di conversione). Se ciò non fosse possibile, un piccolo script Python, Perl, PHP (o altro linguaggio comune su Linux) sarebbe ok.

C'è una domanda simile, ma relativa a .NET .


Risposte:


166

exiftool fa il lavoro per me, è scritto in perl, quindi dovrebbe funzionare per te su qualsiasi o / s

https://exiftool.org/

utilizzo:

exiftool -all= image.jpg

6
Alcune altre opzioni interessanti: "-o outfile.jpg" o "-out outfile.jpg", "-overwrite_original" o "-overwrite_original_in_place", "-P" o "-preserve", "-r" o "-recurse"
Denilson Sá Maia,

6
Mi sono appena imbattuto in questa discussione cercando la stessa cosa. Ho appena pensato di aggiungere un commento qui per gli utenti Ubuntu: lo script è disponibile nei repository Ubuntu come libimage-exiftool-perl: sudo apt-get install libimage-exiftool-perl
user605331

7
O con l'homebrewbrew install exiftool
cwd

6
Se ti fidi davvero del programma aggiungi -overwrite_originalswitch e il programma non creerà i file di backup.
Salman A

10
L'utilizzo accettato con l'opzione -all = rimuove TUTTI i tag da image.jpg! La risposta corretta sarebbeexiftool -EXIF= image.jpg
PeterCo

85

Con imagemagick:

convert <input file> -strip <output file>

21
Siamo spiacenti, ma -strip non funziona come previsto, poiché ImageMagick ricomprime ancora il file JPEG.
Denilson Sá Maia,

5
Nota, a proposito, che "-strip" potrebbe essere utile se qualcuno sta facendo altre trasformazioni con il file. Si noti inoltre che "-thumbnail 123x456" è QUASI equivalente a "-strip -resize 123x456".
Denilson Sá Maia,

15
+1 perché questo è stato molto più facile rispetto al download di un nuovo strumento.
Dave Dopson,

13
Nota -striprimuove i profili di colore. Per chiunque cerchi di eliminare i dati EXIF ​​senza perdere le informazioni sul profilo, vedere la mia soluzione qui: stackoverflow.com/a/17516878/1854499
Robbert

2
OP dovrebbe aggiornare questa risposta, dal momento che è due volte sbagliato.
berbt,

49

ImageMagick ha il parametro -strip , ma ricomprime l'immagine prima di salvarla. Pertanto, questo parametro è inutile per le mie necessità.

Questo argomento dal forum di ImageMagick spiega che non esiste alcun supporto per le operazioni lossless JPEG in ImageMagick (ogni volta che cambia, si prega di inviare un commento con un link!), E suggerisce di usare jpegtran (da libjpeg):

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

(Se non sei sicuro che io risponda alla mia domanda, leggi questo e questo e questo )


1
Ho provato il metodo jpegtran ma nella maggior parte dei casi aumenta la dimensione del file invece di diminuirla. Nella maggior parte dei casi si desidera eseguire questa operazione per ridurre le dimensioni del file.
Codebeat,

1
Quando ho provato a usare ImageMagick per eliminare i dati exif, ho notato che ho finito con un file più grande di quello che avevo iniziato. Questo mi porta a credere che Imagemagick stia codificando i dati che desideri vengano eliminati e li stia memorizzando altrove nel file. Chiamami vecchio stile, ma quando rimuovo qualcosa da un file, voglio che una dimensione del file sia più piccola se non della stessa dimensione. Qualsiasi altro risultato suggerisce il data mining.
Deanie,

1
Un punto minore: per me nessuno dei 2 comandi elencati ha funzionato, invece i seguenti lavori: jpegtran -copy none image.jpg newimage.jpg
ibic

@Codebeat Devi aggiungere param -progressiveQuesto ridurrà le dimensioni.
Tom,

31

Potresti anche voler esaminare Exiv2 : è davvero veloce (C ++ e nessuna ricompressione), è riga di comando e fornisce anche una libreria per la manipolazione EXIF ​​a cui puoi collegarti. Non so quante distro Linux lo rendono disponibile, ma in CentOS è attualmente disponibile nel repository di base.

Uso:

exiv2 rm image.jpg

1
Grazie amico, questo è il primo che fa molto bene il lavoro senza perdita di qualità e rapidità! Yo meriti un +100! Ma per rimuovere TUTTI i tipi di intestazioni devo specificare l'opzione -da altrimenti non rimuoverà le informazioni di Adobe Photoshop / Creator da jpg. Sono su Windows comunque.
Codebeat

Grazie! Volevo confermare che exiv2 avrebbe mostrato le informazioni sulla posizione GPS in modo da poter vedere che erano scomparse. L'opzione predefinita per la stampa è "riepilogo" che esclude le informazioni GPS. Per vedere tutte le informazioni che devi usare: exiv2 -pa pr image.jpg
Rob Russell,

Si prega di notare che questo strumento ha distrutto la qualità di alcuni dei miei JPEG, per fortuna ho avuto un backup
Steel Brain

@SteelBrain, è davvero strano - puoi condividere una delle immagini JPEG interessate da questo?
Bogdan Stăncescu

Questa è la soluzione più sicura
Mohammed Shareef C

20

Proporrei jhead:

man jhead
jhead -purejpg image.jpg

Solo 123Kb su debian / ubuntu, non ricomprime. Nota però che muta l'immagine, quindi copia l'originale se ne hai bisogno.


2

Di recente ho intrapreso questo progetto in C. Il codice seguente procede come segue:

1) Ottiene l'orientamento corrente dell'immagine.

2) Rimuove tutti i dati contenuti in APP1(Dati Exif) eAPP2 (Dati Flashpix) cancellando.

3) Ricrea il APP1 marcatore di orientamento e lo imposta sul valore originale.

4) Trova il primo EOI marcatore (Fine dell'immagine) e tronca il file se nessasary.

Alcune cose da notare prima sono:

1) Questo programma è utilizzato per la mia fotocamera Nikon. Il formato JPEG di Nikon aggiunge qualcosa alla fine di ogni file che crea. Codificano questi dati fino alla fine del file di immagine creando un secondo EOImarcatore. Normalmente i programmi di immagini leggono fino al primoEOI marker trovato. Dopo ciò, Nikon ha delle informazioni che il mio programma tronca.

2) Poiché questo è per il formato Nikon, presuppone l' big endianordine dei byte. Se si utilizza il file di immagine little endian, è necessario apportare alcune modifiche.

3) Quando ImageMagickho provato a usare per eliminare i dati exif, ho notato che ho finito con un file più grande di quello che avevo iniziato. Questo mi porta a credere che Imagemagicksta codificando i dati che desideri vengano eliminati e che li stia memorizzando altrove nel file. Chiamami vecchio stile, ma quando rimuovo qualcosa da un file, voglio che una dimensione del file sia più piccola se non della stessa dimensione. Qualsiasi altro risultato suggerisce il data mining.

Ed ecco il codice:

#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;
}

Spero che questo aiuti qualcuno!


1

Suggerimento per comodità: se sei su Windows, puoi applicare un file REG al registro, installare una voce nel menu contestuale, in modo da poter rimuovere facilmente i metadati facendo clic con il tasto destro del mouse sul file e selezionando il comando.

Ad esempio (ricordati di modificare i percorsi per indicare dove sono installati gli eseguibili sul tuo computer):


Per file JPEG, JPG, JPE, JFIF: comando " Rimuovi metadati "
(usando ExifTool , conserva il file originale come backup)
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"

Per i file PNG: comando " Converti in PNG minimizzato "
(usando ImageMagick , modifica i dati sovrascrivendo il file originale)
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"

Correlati: convertire i PNG in ICO nel menu di scelta rapida .


1

Abbiamo usato questo per rimuovere i dati di latitudine dal file TIFF:

exiv2 mo -M"del Exif.GPSInfo.GPSLatitude" IMG.TIF dove puoi usare exiv2 -pa IMG.TIFper elencare tutti i metadati.


1

Per la striscia EXIF ​​senza perdita di dati è possibile utilizzare libexif , disponibile con cygwin . Rimuovi sia EXIF ​​che la miniatura per anonimizzare un'immagine:

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

.batFile Drag-and-drop da utilizzare con cygwin:

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

0

Altro software:

MetAbility QuickFix

"MetabilityQuickFix rimuove tutte le tue informazioni personali e dati sulla posizione GPS da tutte le tue foto, con un solo clic del mouse. Scrub tutti gli elementi dei metadati dai blocchi di dati Exif, Iptc e XMP in modo sicuro dai tuoi file JPEG e crea automaticamente copie di backup dei file originali "

Stripper JPEG e PNG

"Uno strumento per rimuovere / pulire / rimuovere metadati (spazzatura) non necessari da file JPG / JPEG / JFIF e PNG. La qualità dell'immagine NON È INTERESSATA. Include il supporto della riga di comando. Basta specificare una cartella o un file sulla riga di comando (caratteri jolly consentiti)"


0

Se usi già jpegoptim puoi usarlo anche per rimuovere exif.

jpegoptim -s *
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.