EXIF verilerini JPEG'i yeniden sıkıştırmadan nasıl kaldırabilirim?


127

EXIF bilgilerini (küçük resim, meta veriler, kamera bilgileri ... her şey dahil!) JPEG dosyalarından kaldırmak istiyorum, ancak JPEG'yi yeniden sıkıştırmak kaliteyi düşürecek ve genellikle Dosya boyutu.

Komut satırını kullanırsam daha da iyi bir Unix / Linux çözümü arıyorum. Mümkünse, ImageMagick (dönüştürme aracı) kullanarak. Bu mümkün değilse, küçük bir Python, Perl, PHP (veya Linux'ta başka bir yaygın dil) betiği uygun olacaktır.

Benzer bir soru var ama .NET ile ilgili .


Yanıtlar:


166

exiftool işi benim için yapıyor, perl ile yazılmış, bu yüzden herhangi bir o / s'de sizin için çalışmalı

https://exiftool.org/

kullanım:

exiftool -all= image.jpg

6
Diğer bazı ilginç seçenekler: "-o outfile.jpg" veya "-out outfile.jpg", "-overwrite_original" veya "-overwrite_original_in_place", "-P" veya "-preserve", "-r" veya "-recurse"
Denilson Sá Maia

6
Aynı şeyi arayan bu konuya rastladım. Ubuntu kullanıcıları için buraya bir yorum ekleyeceğimi düşündüm: Komut, Ubuntu depolarında libimage-exiftool-perl olarak mevcuttur: sudo apt-get install libimage-exiftool-perl
user605331

7
Veya homebrew ilebrew install exiftool
cwd

6
Eğer varsa gerçekten programı eklenti güven -overwrite_originalanahtarı ve program yedekleme dosyaları oluşturmaz.
Salman

10
-All = seçeneğiyle kabul edilen kullanım, image.jpg dosyanızdaki TÜM etiketleri kaldırır! Doğru cevapexiftool -EXIF= image.jpg
PeterCo

85

İmagemagick ile:

convert <input file> -strip <output file>

21
Maalesef ImageMagick JPEG dosyasını yeniden sıkıştırdığı için -strip beklendiği gibi çalışmıyor.
Denilson Sá Maia

5
Bu arada, birisi dosyayla başka dönüşümler yapıyorsa "-strip" seçeneğinin yararlı olabileceğini unutmayın. Ayrıca "-tumbnail 123x456" değerinin "-şerit-yeniden boyutlandır 123x456" ile NEREDEYSE eşdeğer olduğuna dikkat edin.
Denilson Sá Maia

15
+1 çünkü bu, yeni bir araç indirmekten çok daha kolaydı.
Dave Dopson

13
Not, -striprenk profillerini kaldırır. Profil bilgilerini kaybetmeden EXIF ​​verilerini çıkarmaya çalışan herkes için
çözümüme

2
OP, iki kez yanlış olduğu için bu yanıtı güncellemelidir.
berbt

49

ImageMagick -strip parametresine sahiptir, ancak kaydetmeden önce görüntüyü yeniden sıkıştırır. Bu nedenle, bu parametre ihtiyacım için işe yaramaz.

ImageMagick forumundaki bu konu, ImageMagick'te JPEG kayıpsız işlemler için hiçbir destek olmadığını açıklar (bu her değişiklik olduğunda, lütfen bir bağlantı içeren bir yorum gönderin!) Ve jpegtran ( libjpeg'den ) kullanmanızı önerir :

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

(Bana kendi soruya cevap hakkında emin değilseniz, okumak bu ve bu ve bu )


1
Jpegtran yöntemini denedi, ancak çoğu durumda, onu azaltmak yerine dosya boyutunu artırdı. Çoğu durumda dosya boyutunu azaltmak için bunu yapmak istersiniz.
Codebeat

1
Exif verilerini çıkarmak için ImageMagick'i kullanmaya çalışırken, başladığımdan daha büyük bir dosyaya sahip olduğumu fark ettim. Bu, Imagemagick'in çıkarılmasını istediğiniz verileri kodladığına ve dosyada başka bir yerde sakladığına inanmamı sağlıyor. Bana eski moda deyin, ancak bir dosyadan bir şey kaldırdığımda, bir dosya boyutunun aynı boyutta olmasa da daha küçük olmasını istiyorum. Diğer sonuçlar veri madenciliğini önerir.
Deanie

1
Küçük bir nokta: benim için listelenen 2 komuttan hiçbiri işe yaramadı, bunun yerine aşağıdakiler işe yarıyor: jpegtran -copy none image.jpg newimage.jpg
ibic

@Codebeat Param eklemeniz gerekiyor -progressiveBu, boyutu küçültecektir.
Tom

31

Exiv2'ye de bakmak isteyebilirsiniz - gerçekten hızlıdır (C ++ ve yeniden sıkıştırma yok), komut satırı ve ayrıca bağlantı kurabileceğiniz EXIF ​​manipülasyonu için bir kitaplık sağlar. Bunu kaç tane Linux dağıtımı yaptığını bilmiyorum, ancak CentOS'ta şu anda temel depoda mevcut.

Kullanımı:

exiv2 rm image.jpg

1
Teşekkürler dostum, bu işi kalite kaybı olmadan ve hızla parlayarak çok iyi yapan ilk kişi! +100'ü hak ediyorsun! Ancak TÜM başlık türlerini kaldırmak için -da seçeneğini belirtmem gerekiyor, aksi takdirde adobe photoshop / creator bilgilerini jpg'lerden kaldırmayacaktır. Yine de Windows'tayım.
Codebeat

Teşekkürler! Exiv2'nin GPS konum bilgisini göstereceğini doğrulamak istedim, böylece daha sonra gittiğini görebilirdim. Yazdırma için varsayılan seçenek, GPS bilgilerini hariç tutan "özettir". Kullanmanız gereken tüm bilgileri görmek için: exiv2 -pa pr image.jpg
Rob Russell

Lütfen bu aracın bazı JPEG dosyalarımın kalitesini bozduğunu unutmayın, neyse ki bir yedeğim vardı
Steel Brain

@SteelBrain, bu gerçekten tuhaf - bundan etkilenen JPEG resimlerinden birini paylaşabilir misiniz?
Bogdan Stăncescu

Bu en güvenli çözüm
Mohammed Shareef C

20

Ben önerirdim jhead:

man jhead
jhead -purejpg image.jpg

Debian / ubuntu'da yalnızca 123Kb, yeniden sıkıştırmaz. Görüntüyü değiştirdiğini unutmayın, bu nedenle ihtiyacınız olursa orijinali kopyalayın.


2

Yakın zamanda bu projeyi C'de üstlendim. Aşağıdaki kod şunları yapar:

1) Görüntünün mevcut yönünü alır.

2) APP1(Exif verileri) ve APP2(Flashpix verileri) içinde bulunan tüm verileri boş bırakarak kaldırır .

3) APP1Yönlendirme işaretini yeniden oluşturur ve orijinal değere ayarlar.

4) İlk EOIişaretleyiciyi (Görüntünün Sonu ) bulur ve gerekirse dosyayı keser.

İlk önce dikkat edilmesi gereken bazı noktalar şunlardır:

1) Bu program Nikon fotoğraf makinem için kullanılıyor. Nikon'un JPEG formatı, oluşturduğu her dosyanın sonuna bir şey ekler. İkinci bir EOIişaretçi oluşturarak bu verileri görüntü dosyasının sonuna kodlarlar . Normalde görüntü programları bulunan ilk EOIişaretleyiciye kadar okur . Nikon bundan sonra programımın keseceği bilgilere sahip.

2) Bu Nikon biçimi için olduğundan, big endianbayt sırasını varsayar . Görüntü dosyanız kullanıyorsa little endian, bazı ayarlamalar yapılması gerekir.

3) ImageMagickExif verilerini çıkarmaya çalışırken , başladığımdan daha büyük bir dosyaya sahip olduğumu fark ettim. Bu beni, Imagemagicksoyulmasını istediğiniz verileri kodladığına ve dosyanın başka bir yerinde depoladığına inanmamı sağlıyor . Bana eski moda deyin, ancak bir dosyadan bir şey kaldırdığımda, bir dosya boyutunun aynı boyutta olmasa da daha küçük olmasını istiyorum. Diğer sonuçlar veri madenciliğini önerir.

Ve işte kod:

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

Umarım bu birine yardımcı olur!


1

Kolaylık sağlamak için ipucu: Windows kullanıyorsanız, içerik menüsüne bir girdi yüklemek için kayıt defterine bir REG dosyası uygulayabilirsiniz, böylece dosyayı sağ tıklayıp komutu seçerek meta verileri kolayca kaldırabilirsiniz.

Örneğin (yürütülebilir dosyaların bilgisayarınızda nereye kurulduğunu gösterecek şekilde yolları düzenlemeyi unutmayın):


JPEG, JPG, JPE, JFIF dosyaları için: " Meta veriyi kaldır " komutu
( ExifTool kullanarak orijinal dosyayı yedek olarak saklar )
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 dosyaları için: Komut " minified PNG Dönüştür "
(kullanarak ImageMagick orijinal dosyanın üzerine yazarak, veri değişiklikleri)
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"

İlgili: bağlam menüsünde PNG'leri ICO'ya dönüştürün .


1

Bunu, enlem verilerini TIFF dosyasından kaldırmak için kullandık:

exiv2 mo -M"del Exif.GPSInfo.GPSLatitude" IMG.TIFexiv2 -pa IMG.TIFtüm meta verileri listelemek için kullanabileceğiniz yer .


1

İçin kayıpsız EXIF kullanabilirsiniz şerit libexif olduğunu cygwin ile kullanılabilir . Bir resmi anonimleştirmek için hem EXIF'i hem de küçük resmi kaldırın:

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

.batCygwin ile kullanmak için dosyayı sürükleyip bırakın :

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

0

Diğer Yazılımlar:

MetAbility QuickFix

"MetabilityQuickFix, tüm kişisel bilgilerinizi ve GPS konum verilerinizi tek bir fare tıklamasıyla tüm fotoğraflarınızdan çıkarır. Exif, Iptc ve XMP veri bloklarındaki tüm meta veri öğelerini JPEG dosyalarınızdan güvenle temizler ve orijinal dosyaların yedek kopyalarını otomatik olarak oluşturur "

JPEG ve PNG Sıyırıcı

"JPG / JPEG / JFIF ve PNG dosyalarındaki gereksiz meta verileri (gereksiz) çıkarmak / temizlemek / kaldırmak için bir araç. Görüntü kalitesi ETKİLENMEZ. Komut satırı desteği içerir. Komut satırında bir klasör veya dosya belirtmeniz yeterlidir (joker karakterlere izin verilir)"


0

Jpegoptim'i zaten kullanıyorsanız, exif'i kaldırmak için de kullanabilirsiniz.

jpegoptim -s *
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.