JPEG को फिर से देखे बिना EXIF ​​डेटा कैसे निकालें?


127

मैं JPEG फ़ाइलों से EXIF ​​जानकारी (थंबनेल, मेटाडेटा, कैमरा जानकारी ... सब कुछ सहित!) को निकालना चाहता हूं, लेकिन मैं इसे फिर से जोड़ना नहीं चाहता, क्योंकि JPEG को फिर से कॉपी करने से गुणवत्ता खराब हो जाएगी, साथ ही साथ आम तौर पर इसे बढ़ाना होगा फाइल का आकार।

मैं एक यूनिक्स / लिनक्स समाधान की तलाश कर रहा हूं, भले ही कमांड-लाइन का उपयोग कर रहा हो। यदि संभव हो, तो ImageMagick (कन्वर्ट टूल) का उपयोग करें। यदि यह संभव नहीं है, तो एक छोटा पायथन, पर्ल, पीएचपी (या लिनक्स पर अन्य सामान्य भाषा) स्क्रिप्ट ठीक होगी।

एक समान प्रश्न है, लेकिन .NET से संबंधित है


जवाबों:


166

exiftool मेरे लिए काम करता है, यह पर्ल में लिखा है इसलिए आपको किसी भी ओ / एस पर काम करना चाहिए

https://exiftool.org/

उपयोग:

exiftool -all= image.jpg

6
कुछ अन्य दिलचस्प विकल्प: "-o outfile.jpg" या "-out outfile.jpg", "-overwrite_original" या "-overwrite_original_in_place", "-P" या "-preserve", "-r" या "-recurse"
डेनिल्सन सआ मिया

6
मैं बस इसी बात की तलाश में इस धागे में आया था। मुझे लगा कि मैं उबंटू उपयोगकर्ताओं के लिए यहां एक टिप्पणी जोड़ूंगा: स्क्रिप्ट उबंटू रिपॉज में लिबिमेज-एग्जिस्टूल-पर्ल के रूप में उपलब्ध है: sudo apt-get install libimage-exiftool-perl
user605331

7
या होमब्रे के साथbrew install exiftool
cwd

6
यदि आप वास्तव में प्रोग्राम ऐड -overwrite_originalस्विच पर भरोसा करते हैं और प्रोग्राम बैकअप फ़ाइलों को नहीं बनाएगा।
सलमान ए

10
विकल्प के साथ स्वीकृत उपयोग -all = आपकी image.jpg से सभी टैग हटा देता है! सही उत्तर होगाexiftool -EXIF= image.jpg
पीटरको

85

इमेजमैजिक के साथ:

convert <input file> -strip <output file>

21
क्षमा करें, लेकिन -strip अपेक्षा के अनुरूप काम नहीं करता है, क्योंकि ImageMagick अभी भी JPEG फ़ाइल को पुनः प्राप्त करता है।
डेनिलसन सिया मिया

5
ध्यान दें, वैसे "-स्ट्रिप" उपयोगी हो सकता है यदि कोई व्यक्ति फ़ाइल के साथ अन्य परिवर्तन कर रहा है। यह भी ध्यान दें कि "-thumbnail 123x456" ALMOST "-strip -resize 123x456" के बराबर है।
डेनिल्सन सआ मिया

15
+1 क्योंकि यह एक नया टूल डाउनलोड करने से मीलों आसान था।
डेव डॉपसन

13
नोट -stripरंग प्रोफ़ाइल हटाता है। प्रोफ़ाइल जानकारी खोए बिना EXIF ​​डेटा को स्ट्रिप करने की कोशिश करने वाले किसी के लिए, मेरा समाधान यहां देखें: stackoverflow.com/a/17516878/1854499
Robbert

2
ओपी को इस उत्तर को अपडेट करना चाहिए, क्योंकि यह दो बार गलत है।
berbt

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 विधि की कोशिश की, लेकिन ज्यादातर मामलों में इसे कम करने के बजाय filesize बढ़ा। ज्यादातर मामलों में आप फ़ाइलों को कम करने के लिए ऐसा करना चाहते हैं।
कोडबीट

1
जब एक्सफ़िफ़ डेटा को छीनने के लिए ImageMagick का उपयोग करने की कोशिश की जा रही है, तो मैंने देखा कि मैंने जो कुछ भी शुरू किया था उससे बड़ी फ़ाइल के साथ समाप्त हुआ। यह मुझे विश्वास दिलाता है कि Imagemagick उस डेटा को एन्कोड कर रहा है जिसे आप छीनना चाहते हैं, और इसे फ़ाइल में कहीं और संग्रहीत कर रहे हैं। मुझे पुराने ढंग से बुलाओ, लेकिन जब मैं किसी फ़ाइल से कुछ निकालता हूं, तो मैं चाहता हूं कि एक फ़ाइल का आकार छोटा हो, यदि वह समान आकार का न हो। कोई अन्य परिणाम डेटा खनन का सुझाव देते हैं।
डीनी

1
एक मामूली बात: मेरे लिए, सूचीबद्ध किए गए 2 आदेशों में से कोई भी काम नहीं किया, इसके बजाय निम्नलिखित काम करता है: jpegtran -copy none image.jpg newimage.jpg
ibic

@ कोडबीट आपको परम जोड़ने की जरूरत है -progressiveयह आकार कम कर देगा।
टॉम

31

आप Exiv2 में भी देखना चाह सकते हैं - यह वास्तव में तेज है (C ++ और कोई पुनर्संयोजन ), यह कमांड लाइन है, और यह EXIF ​​हेरफेर के लिए एक पुस्तकालय भी प्रदान करता है, जिसके खिलाफ आप लिंक कर सकते हैं। मैं नहीं जानता कि कितने लिनक्स डिस्ट्रो इसे उपलब्ध कराते हैं, लेकिन CentOS में यह फिलहाल बेस रेपो में उपलब्ध है।

उपयोग:

exiv2 rm image.jpg

1
धन्यवाद आदमी, यह पहला ऐसा है जो बिना गुणवत्ता हानि और तेजी से धधकते हुए काम करता है! यो एक +100 के लायक है! लेकिन सभी प्रकार के हेडर को हटाने के लिए मुझे -da विकल्प को निर्दिष्ट करना होगा अन्यथा यह एडॉब फ़ोटोशॉप / क्रिएटर की जानकारी को jpg के से नहीं हटाएगा। मैं वैसे भी विंडोज पर हूँ।
कोडबीट

धन्यवाद! मैं इस बात की पुष्टि करना चाहता था कि exiv2 जीपीएस स्थान की जानकारी दिखाएगा ताकि मैं देख सकूं कि यह बाद में चला गया था। प्रिंट के लिए डिफ़ॉल्ट विकल्प "सारांश" है जो जीपीएस जानकारी को बाहर करता है। आप का उपयोग करने के लिए है सभी जानकारी को देखने के लिए: exiv2 -pa pr image.jpg
Rob Russell

कृपया ध्यान दें कि इस उपकरण ने मेरे कुछ जेपीईजी की गुणवत्ता को नष्ट कर दिया, सौभाग्य से मेरे पास एक बैकअप था
स्टील ब्रेन

@SteelBrain, यह वास्तव में अजीब है - क्या आप इससे प्रभावित JPEG छवियों में से एक को साझा कर सकते हैं?
बजे बोगडान स्टेंसनस्कु

यह सबसे सुरक्षित उपाय है
मोहम्मद शरीफ C

20

मैं प्रस्ताव करूँगा jhead:

man jhead
jhead -purejpg image.jpg

केवल 123Kb पर डेबियन / ubuntu, पुन: संपीड़ित नहीं करता है। ध्यान दें कि यह छवि को बदल देता है, इसलिए यदि आवश्यक हो तो मूल की प्रतिलिपि बनाएँ।


2

मैंने हाल ही में इस परियोजना को C. में लिया। नीचे दिया गया कोड निम्नलिखित है:

1) छवि के वर्तमान उन्मुखीकरण हो जाता है।

2) सभी डेटा APP1(Exif डेटा) और APP2(Flashpix डेटा) को खाली करके हटाता है ।

3) APP1ओरिएंटेशन मार्कर को फिर से बनाता है और इसे मूल मूल्य पर सेट करता है।

4) पहले EOIमार्कर (छवि का अंत ) को ढूँढता है और यदि nasasary है तो फ़ाइल को काट देता है।

पहले ध्यान देने योग्य कुछ बातें हैं:

1) इस कार्यक्रम का उपयोग मेरे Nikon कैमरे के लिए किया जाता है। निकॉन का जेपीईजी प्रारूप प्रत्येक फ़ाइल के बहुत अंत में कुछ बनाता है। वे इस डेटा को दूसरी फ़ाइल बनाकर छवि फ़ाइल के अंत में एन्कोड करते हैं EOI। आम तौर पर छवि कार्यक्रम पहले EOIमार्कर को पढ़ते हैं। निकॉन के पास इसके बाद की जानकारी है जो मेरे कार्यक्रम को काट देती है।

2) क्योंकि यह Nikon प्रारूप के लिए है, यह big endianबाइट ऑर्डर को मानता है । यदि आपकी छवि फ़ाइल का उपयोग करती है little endian, तो कुछ समायोजन किए जाने की आवश्यकता है।

3) जब ImageMagickएक्सिफ़ डेटा को स्ट्रिप करने के लिए उपयोग करने की कोशिश की जाती है , तो मैंने देखा कि मैंने जो कुछ भी शुरू किया था उससे बड़ी फ़ाइल के साथ समाप्त हुआ। यह मुझे विश्वास दिलाता है कि आपके 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

सुविधा के लिए संकेत: यदि आप विंडोज पर हैं, तो आप संदर्भ मेनू में एक प्रविष्टि स्थापित करने के लिए, रजिस्ट्री में एक आरईजी फ़ाइल लागू कर सकते हैं, ताकि आप फ़ाइल को राइट-क्लिक करके और कमांड का चयन करके आसानी से मेटाडेटा निकाल सकते हैं।

उदाहरण के लिए (अपने कंप्यूटर पर निष्पादनयोग्य स्थापित होने के बिंदु के लिए पथों को संपादित करना याद रखें):


JPEG, JPG, JPE, JFIF फ़ाइलों के लिए: कमांड " मेटाडेटा निकालें "
( ExifTool का उपयोग करके , मूल फ़ाइल को बैकअप के रूप में संरक्षित करता है)
exiftool -all= image.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"

पीएनजी फाइलों के लिए: कमांड " कन्वर्ट पीएनजी में परिवर्तित करें "
( इमेजमैजिक का उपयोग करके , डेटा ओवरराइटिंग मूल फ़ाइल में परिवर्तन)
convert -background none -strip -set filename:n "%t" image.png "%[filename:n].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"

संबंधित: संदर्भ मेनू में PNGs को ICO में रूपांतरित करें


1

हमने TIFF फ़ाइल से अक्षांश डेटा निकालने के लिए इसका उपयोग किया:

exiv2 mo -M"del Exif.GPSInfo.GPSLatitude" IMG.TIF जहां आप exiv2 -pa IMG.TIFसभी मेटाडेटा को सूचीबद्ध करने के लिए उपयोग कर सकते हैं ।


1

दोषरहित EXIF ​​स्ट्रिप के लिए आप लिबेक्सिफ का उपयोग कर सकते हैं , जो कि साइबरविन के साथ उपलब्ध है । छवि को अनाम बनाने के लिए EXIF ​​और थंबनेल दोनों को निकालें:

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

.batसाइबरविन के साथ उपयोग के लिए ड्रैग-एन-ड्रॉप फ़ाइल:

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

0

अन्य सॉफ्टवेयर:

मेटाएबिलिटी क्विकफिक्स

"MetabilityQuickFix आपकी सभी तस्वीरों के साथ आपकी व्यक्तिगत जानकारी और GPS स्थान डेटा को केवल एक माउस क्लिक के साथ स्ट्रिप्स करता है। यह आपकी मेटाडाटा आइटमों को एक्सपीएफ, Iptc और XMP डेटा ब्लॉक को अपनी JPEG फ़ाइलों से सुरक्षित रूप से स्क्रब करता है और स्वचालित रूप से मूल फ़ाइलों की बैकअप प्रतियां बनाता है। "

JPEG और PNG स्ट्रिपर

"JPG / JPEG / JFIF और PNG फ़ाइलों से अनियंत्रित मेटाडेटा (जंक) को हटाने / साफ करने / हटाने का एक उपकरण। छवि की गुणवत्ता को प्रभावित नहीं किया जाता है। इसमें कमांड लाइन का समर्थन भी शामिल है। कमांडलाइन (वाइल्डकार्ड अनुमति) पर एक फ़ोल्डर या फ़ाइल निर्दिष्ट करें"।


0

यदि आप पहले से ही jpegoptim का उपयोग करते हैं, तो आप इसे exif को हटाने के लिए भी उपयोग कर सकते हैं।

jpegoptim -s *
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.