JPEGファイルからEXIF情報(サムネイル、メタデータ、カメラ情報など)を削除したいのですが、JPEGを再圧縮すると品質が低下し、通常はファイルサイズ。
Unix/Linuxソリューションを探しています。コマンドラインを使用する場合はなおさらです。可能であれば、ImageMagick(変換ツール)を使用します。それが不可能な場合は、小さなPython、Perl、PHP(またはLinuxのその他の共通言語)スクリプトで問題ありません。
同様の質問がありますが、 。NETに関連 です。
exiftoolは私のために仕事をします、それはPerlで書かれているので、どんなo/sでもあなたのために働くはずです
http://www.sno.phy.queensu.ca/~phil/exiftool
使用法 :
exiftool -all= image.jpg
Imagemagickの場合:
convert <input file> -strip <output file>
ImageMagickには -strip パラメーターがありますが、保存する前に画像を再圧縮します。したがって、このパラメーターは私のニーズには役に立たない。
ImageMagickフォーラムのこのトピック は、ImageMagickでJPEGロスレス操作がサポートされていないことを説明し(これが変更されるたびに、リンク付きのコメントを投稿してください!)、 jpegtran の使用を提案します(libjpegから):
jpegtran -copy none image.jpg > newimage.jpg
jpegtran -copy none -outfile newimage.jpg image.jpg
Exiv2 -本当に高速(C++and再圧縮なし)、コマンドライン、そしてまた、リンク可能なEXIF操作用のライブラリも提供します。 Linuxディストリビューションがいくつ利用できるかはわかりませんが、CentOSでは現在、ベースリポジトリで利用可能です。
使用法:
exiv2 rm image.jpg
jhead
を提案します:
man jhead
jhead -purejpg image.jpg
Debian/ubuntuの123Kbのみ、再圧縮しません。ただし、イメージが変更されるため、必要に応じて元のファイルをコピーしてください。
私は最近、Cでこのプロジェクトに着手しました。以下のコードは次のことを行います。
1)画像の現在の向きを取得します。
2)APP1
(Exifデータ)およびAPP2
(Flashpixデータ)に含まれるすべてのデータをブランキングによって削除します。
3)APP1
方向マーカーを再作成し、元の値に設定します。
4)最初のEOI
マーカー(画像の終わり)を見つけ、必要に応じてファイルを切り捨てます。
最初に注意することがいくつかあります:
1)このプログラムは、ニコンのカメラで使用されています。ニコンのJPEG形式は、作成する各ファイルの最後に何かを追加します。 2番目のEOI
マーカーを作成することにより、このデータを画像ファイルの最後にエンコードします。通常、画像プログラムは最初に見つかったEOI
マーカーまで読み取ります。ニコンはこの後、私のプログラムが切り捨てる情報を持っています。
2)これはNikon形式用であるため、big endian
バイト順を想定しています。画像ファイルがlittle endian
を使用している場合、いくつかの調整が必要です。
3)ImageMagick
を使用してexifデータを削除しようとすると、最初に作成したファイルよりも大きいファイルになっていることに気付きました。これは、Imagemagick
が削除したいデータをエンコードし、ファイル内の別の場所に保存していると信じさせることにつながります。昔ながらの私を呼び出しますが、ファイルから何かを削除するとき、同じサイズではないにしてもファイルサイズを小さくしたいと思います。その他の結果は、データマイニングを示唆しています。
そして、ここにコードがあります:
#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;
}
これが誰かを助けることを願っています!
ロスレスEXIFストリップの場合、 libexif を使用できます。これは cygwinで利用可能 です。 EXIFとサムネイルの両方を削除して、画像を匿名化します。
$ exif --remove --tag=0 --remove-thumbnail exif.jpg -o anonymized.jpg
ドラッグアンドドロップ.bat
cygwinで使用するファイル:
@ECHO OFF
exif --remove --tag=0 --remove-thumbnail %~1
ヒント:Windowsの場合、レジストリファイルにREGファイルを適用して、コンテキストメニューにエントリをインストールできます。ファイルを右クリックしてコマンドを選択すると、メタデータを簡単に削除できます。
例(コンピューター上の実行可能ファイルがインストールされている場所を指すようにパスを編集することを忘れないでください):
JPEG、JPG、JPE、JFIFファイルの場合:コマンド「Remove metadata」
( ExifTool を使用すると、元のファイルがバックアップとして保存されます)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"
PNGファイルの場合:コマンド「縮小されたPNGに変換」
( ImageMagick を使用して、元のファイルを上書きするデータを変更します)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"
関連: コンテキストメニューでPNGをICOに変換 。
これを使用して、TIFFファイルから緯度データを削除しました。
exiv2 mo -M"del Exif.GPSInfo.GPSLatitude" IMG.TIF
使用できる場所exiv2 -pa IMG.TIF
すべてのメタデータをリストします。
その他のソフトウェア:
」MetabilityQuickFixは、マウスを1回クリックするだけで、すべての写真からすべての個人情報とGPS位置データを削除します。Exif、Iptc、およびXMPデータブロックからのすべてのメタデータアイテムをJPEGファイルから安全にスクラブします元のファイルのバックアップコピーを自動的に作成します」
"JPG/JPEG/JFIFおよびPNGファイルから不要なメタデータ(ジャンク)をストリッピング/クリーニング/削除するためのツール。画質IS NOT AFFECTED。コマンドラインのサポート。コマンドラインでフォルダーまたはファイルを指定するだけです(ワイルドカードを使用できます) "