JPEGを再圧縮せずにEXIFデータを削除する方法


127

JPEGファイルからEXIF情報(サムネイル、メタデータ、カメラ情報などすべて!)を削除したいのですが、再圧縮したくないのです。JPEGを再圧縮すると品質が低下し、通常はファイルサイズ。

Unix / Linuxソリューションを探しています。コマンドラインを使用する場合はさらに良いです。可能であれば、ImageMagick(変換ツール)を使用します。それが不可能な場合は、小さなPython、Perl、PHP(またはLinuxの他の一般的な言語)スクリプトで問題ありません。

同様の質問がありますが、.NETに関連しています


回答:


166

exiftoolは私のために仕事をします、それはperlで書かれているので、どんなo / sでもあなたのために働くはずです

https://exiftool.org/

使用法 :

exiftool -all= image.jpg

6
その他の興味深いオプション:「-o outfile.jpg」または「-out outfile.jpg」、「-overwrite_original」または「-overwrite_original_in_place」、「-P」または「-preserve」、「-r」または「-recurse」
DenilsonSáMaia 2010

6
私は同じものを探しているこのスレッドに出くわしました。Ubuntuユーザー向けのコメントをここに追加すると思いました。スクリプトは、Ubuntuリポジトリでlibimage-exiftool-perl:sudo apt-get install libimage-exiftool-perl
user605331

7
または自作brew install exiftool
2013

6
プログラムを本当に信頼している場合、-overwrite_originalスイッチを追加すると、プログラムはバックアップファイルを作成しません。
Salman A

10
オプション-all =で受け入れられた使用法は、image.jpgからすべてのタグを削除します!正解はexiftool -EXIF= image.jpg
次のとおり

85

imagemagickの場合:

convert <input file> -strip <output file>

21
申し訳ありませんが、ImageMagickがまだJPEGファイルを再圧縮しているため、-stripは期待どおりに機能しません。
DenilsonSáMaia

5
ちなみに、「-strip」は、誰かがファイルに対して他の変換を行っている場合に役立つことがあります。また、「-thumbnail 123x456」は「-strip -resize 123x456」と同等のALMOSTです。
DenilsonSáMaia

15
+1。これは、新しいツールをダウンロードするよりもはるかに簡単でした。
デイブ・ドプソン

13
注:-stripカラープロファイルを削除します。プロファイル情報を失わずにEXIFデータを取り除こうとしている人は、私の解決策をここで参照してください:stackoverflow.com/a/17516878/1854499
Robbert

2
OPはこの答えを2度間違っているため、更新する必要があります。
2015

49

ImageMagickには-stripパラメータがありますが、保存する前に画像を再圧縮します。したがって、このパラメーターは私のニーズには役に立たない。

ImageMagickフォーラムのこのトピックは、ImageMagickではJPEGロスレス操作がサポートされていないことを説明しており(この変更があった場合は、リンク付きのコメントを投稿してください!)、jpegtran(libjpegから)の使用を推奨しています。

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

(私が自分の質問に答えているかどうかわからない場合は、これこれこれを読んでください)


1
jpegtranメソッドを試しましたが、ほとんどの場合、ファイルサイズを小さくするのではなく、大きくします。ほとんどの場合、これを実行してファイルサイズを小さくします。
Codebeat、2015年

1
ImageMagickを使用してexifデータを削除しようとすると、最初のファイルよりも大きなファイルになってしまうことに気づきました。これにより、Imagemagickは削除したいデータをエンコードして、ファイル内の別の場所に格納していると思います。昔ながらと呼んでいますが、ファイルから何かを削除するときは、同じサイズではないにしても、ファイルサイズを小さくしたいと思います。その他の結果はすべて、データマイニングを示唆しています。
Deanie

1
マイナーポイント:私のために、リストされている2つのコマンドのどれもが、次の作品代わりに、働いていない: jpegtran -copy none image.jpg newimage.jpg
IBIC

@Codebeatパラメータを追加する必要があります-progressiveこれによりサイズが小さくなります。
トム

31

また、Exiv2を調べることもできます-非常に高速(C ++ 再圧縮なし)、コマンドラインであり、リンクできるEXIF操作用のライブラリも提供します。Linuxディストリビューションがいくつ利用可能になっているかはわかりませんが、CentOSでは現在、ベースリポジトリで利用できます。

使用法:

exiv2 rm image.jpg

1
おかげで、これは品質を損なうことなく非常にうまく機能し、速く燃える最初のものです!+100に値するよ!ただし、すべてのタイプのヘッダーを削除するには、-daオプションを指定する必要があります。そうしないと、jpgからadobe photoshop / creator情報が削除されません。とにかくWindowsを使用しています。
Codebeat、2015年

ありがとう!exiv2がGPS位置情報を表示することを確認したいので、それがなくなったことがわかります。印刷のデフォルトのオプションは、GPS情報を含まない「要約」です。使用する必要があるすべての情報を表示するには:exiv2 -pa pr image.jpg
Rob Russell

このツールが一部のJPEGの品質を破壊したことに注意してください。幸いにもバックアップがありました。
スチールブレイン

@SteelBrain、それは本当に奇妙です–これによって影響を受けるJPEG画像の1つを共有できますか?
BogdanStăncescu

これが最も安全なソリューションです
Mohammed Shareef C

20

私は提案しjheadます:

man jhead
jhead -purejpg image.jpg

debian / ubuntuでは123Kbのみで、再圧縮されません。ただし、画像が変化するため、必要に応じてオリジナルをコピーしてください。


2

私は最近Cでこのプロジェクトに着手しました。以下のコードは次のことを行います。

1)画像の現在の向きを取得します。

2)APP1(Exifデータ)に含まれるすべてのデータを削除し、APP2(Flashpixデータ)にをブランキングによって。

3)を再作成します APP1方向マーカーをし、元の値に設定します。

4)最初を見つける EOIマーカー(画像の終わり必要に応じてファイルを切り捨てます。

最初に注意すべき点は次のとおりです。

1)このプログラムは、私のニコンのカメラで使用されています。ニコンのJPEG形式は、作成する各ファイルの最後に何かを追加します。2番目のEOIマーカーを作成することにより、このデータを画像ファイルの最後にエンコードします。通常、画像プログラムは最初まで読み取りますEOI見つかったマーカー。この後、ニコンには私のプログラムで切り捨てられる情報があります。

2)これはニコン形式の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;
}

これが誰かを助けることを願っています!


1

便利なヒント: Windowsを使用している場合は、REGファイルをレジストリに適用して、コンテキストメニューにエントリをインストールできます。これにより、ファイルを右クリックしてコマンドを選択することで、メタデータを簡単に削除できます。

例(実行可能ファイルがコンピューターにインストールされている場所を指すようにパスを編集することを忘れないでください):


JPEG、JPG、JPE、JFIFファイルの場合:コマンド「メタデータを削除
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に変換します


1

これを使用して、TIFFファイルから緯度データを削除しました。

exiv2 mo -M"del Exif.GPSInfo.GPSLatitude" IMG.TIF ここで、exiv2 -pa IMG.TIFすべてのメタデータを一覧表示できます。


1

ロスレスEXIFストリップの場合は、cygwin利用可能なlibexifを使用できます。画像を匿名化するには、EXIFとサムネイルの両方を削除します。

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

.batcygwinで使用するためのドラッグアンドドロップファイル:

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

0

その他のソフトウェア:

MetAbility QuickFix

「MetabilityQuickFixは、マウスを1回クリックするだけで、すべての写真からすべての個人情報とGPS位置データを取り除きます。JPEGファイルからすべてのメタデータアイテムをExif、Iptc、XMPデータブロックから安全に削除し、元のファイルのバックアップコピーを自動的に作成します」

JPEG&PNGストリッパー

"JPG / JPEG / JFIFおよびPNGファイルから不要なメタデータ(ジャンク)を除去/クリーニング/削除するためのツール。画質は影響を受けません。コマンドラインサポートが含まれています。コマンドラインでフォルダーまたはファイルを指定するだけです(ワイルドカードを使用できます)"


0

すでにjpegoptimを使用している場合は、それを使用してexifを削除することもできます。

jpegoptim -s *
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.