Je souhaite supprimer les informations EXIF (y compris les vignettes, métadonnées, informations relatives à l'appareil photo ... tout!) Des fichiers JPEG, mais je ne souhaite pas les recompresser, car la recompression des images JPEG dégradera la qualité et taille du fichier.
Je recherche une solution Unix/Linux, encore meilleure si vous utilisez la ligne de commande. Si possible, utilisez ImageMagick (outil de conversion). Si ce n'est pas possible, un petit script Python, Perl, PHP (ou un autre langage commun sous Linux) serait acceptable.
Il existe une question similaire, mais liée à .NET .
exiftool fait le travail pour moi, il est écrit en Perl et devrait donc fonctionner pour vous sur tous les systèmes.
http://www.sno.phy.queensu.ca/~phil/exiftool
utilisation:
exiftool -all= image.jpg
Avec imagemagick:
convert <input file> -strip <output file>
ImageMagick a le paramètre -strip , mais il recompresse l'image avant de l'enregistrer. Ainsi, ce paramètre est inutile pour mon besoin.
Cette rubrique du forum ImageMagick explique qu’il n’existe pas de support pour les opérations JPEG sans perte dans ImageMagick (si cela change, merci de poster un commentaire avec un lien!), Et suggère d’utiliser jpegtran (de libjpeg):
jpegtran -copy none image.jpg > newimage.jpg
jpegtran -copy none -outfile newimage.jpg image.jpg
(Si vous n'êtes pas sûr que je réponde à ma propre question, lisez ceci et ceci et ceci )
Vous voudrez peut-être aussi regarder dans Exiv2 - il est très rapide (C++ et pas de recompression), sa ligne de commande et il fournit également une bibliothèque pour la manipulation EXIF que vous pouvez lier. Je ne sais pas combien de distributions Linux le rendent disponible, mais dans CentOS, il est actuellement disponible dans le référentiel de base.
Usage:
exiv2 rm image.jpg
Je proposerais jhead
:
man jhead
jhead -purejpg image.jpg
Astuce pratique: Si vous êtes sous Windows, vous pouvez appliquer un fichier REG au registre pour installer une entrée dans le menu contextuel. Vous pourrez ainsi facilement supprimer les métadonnées en cliquant avec le bouton droit de la souris et en sélectionnant la commande. commander.
Par exemple (souvenez-vous de modifier les chemins pour qu'ils soient dirigés vers les fichiers exécutables installés sur votre ordinateur):
Pour les fichiers JPEG, JPG, JPE, JFIF: commande " Supprimer les métadonnées "
(avec ExifTool , conserve le fichier d'origine en tant que sauvegarde)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"
Pour les fichiers PNG: commande " Convertir en PNG minifié "
(avec ImageMagick , modifie les données en remplaçant le fichier d'origine)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"
Connexes: convertir les fichiers PNG en ICO dans le menu contextuel .
J'ai récemment entrepris ce projet en C. Le code ci-dessous fait ce qui suit:
1) Obtient l'orientation actuelle de l'image.
2) Supprime toutes les données contenues dans APP1
(données Exif) et APP2
(données Flashpix) en les supprimant.
3) Recrée le marqueur d’orientation APP1
et le définit sur la valeur initiale.
4) Trouve le premier marqueur EOI
(Fin de l’image) et tronque le fichier si nécessaire.
Certaines choses à noter en premier sont:
1) Ce programme est utilisé pour mon appareil photo Nikon. Le format JPEG de Nikon ajoute quelque chose à la fin de chaque fichier créé. Ils encodent ces données jusqu'à la fin du fichier image en créant un deuxième marqueur EOI
. Normalement, les programmes image sont lus jusqu'au premier marqueur EOI
trouvé. Nikon a ensuite des informations que mon programme tronque.
2) Comme il s’agit du format Nikon, il suppose un ordre big endian
octets. Si votre fichier image utilise little endian
, certains ajustements doivent être effectués.
3) En essayant d'utiliser ImageMagick
pour effacer les données exif, j'ai remarqué que je me suis retrouvé avec un fichier plus volumineux que celui avec lequel j'avais commencé. Cela me porte à croire que Imagemagick
encode les données que vous voulez supprimer et les stocke ailleurs dans le fichier. Appelez-moi à l'ancienne, mais lorsque je supprime quelque chose d'un fichier, je souhaite une taille de fichier inférieure, voire identique. Tout autre résultat suggère une exploration de données.
Et voici le 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;
}
J'espère que cela aide quelqu'un!
Pour les bandes EXIF sans perte, vous pouvez utiliser libexif , qui est disponible avec cygwin . Supprimez EXIF et la vignette pour anonymiser une image:
$ exif --remove --tag=0 --remove-thumbnail exif.jpg -o anonymized.jpg
Drag-n-drop fichier .bat
à utiliser avec cygwin:
@ECHO OFF
exif --remove --tag=0 --remove-thumbnail %~1
Nous avons utilisé cela pour supprimer les données de latitude du fichier TIFF:
exiv2 mo -M"del Exif.GPSInfo.GPSLatitude" IMG.TIF
où vous pouvez utiliser exiv2 -pa IMG.TIF
pour répertorier toutes les métadonnées.
Autres logiciels:
"MetabilityQuickFix supprime toutes vos informations personnelles et données de localisation GPS de toutes vos photos, d'un simple clic de souris. Il supprime tous les éléments de métadonnées des blocs de données Exif, Iptc et XMP en toute sécurité de vos fichiers JPEG et effectue automatiquement des copies de sauvegarde des fichiers. fichiers d'origine "
"Outil pour supprimer/nettoyer/supprimer les métadonnées inutiles (fichiers indésirables) des fichiers JPG/JPEG/JFIF & PNG. La qualité d'image IS NON AFFECTE. Inclut la prise en charge de la ligne de commande. Spécifiez simplement un dossier ou un fichier ligne de commande (caractères génériques autorisés) "