File Exchange

image thumbnail

run_exiftool

version 1.1 (50.5 KB) by

Read and write full Exif metadata from image files. A Matlab front end for ExifTool, by Phil Harvey.

20 Downloads

Updated

View License

Two functions:
 getexif: read Exif matadata
 putexif: save image with matedata
This is a front end for the command-line executable, ExifTool. It can also serve as an example of how to call other programs from Matlab. This is useful when a reference implementation is available as a command-line version.

Comments and Ratings (12)

Gin Chin

missing exiftool.exe

Michelle

I'm not sure if this problem comes up a lot, but this script as-is doesn't work on Macs. Here's how I edited it.

function [exifdata, nf] = getexif(fname)
%[status] = getexif(fname) read Exif data from an image file
% fname = name of image file, e.g., 'myfile.jpg'
%
%Needs ExifTool.exe, written by Phil Harvey
% http://www.sno.phy.queensu.ca/~phil/exiftool/
% 1. Download the file, exiftool(-k).exe
% 2. Rename this file, exiftool.exe
% 3. Save this file in a folder on your Matlab path, e.g. .../matlab/
%Peter Burns, 28 May 2013
% 22 July 2013, following suggestions from jhh and Jonathan via
% Matlab Central.

% Modified by Michelle Maiden to be Mac-patible

if strcmp('PCWIN',computer) %If this is a windows machine
    test = which('exiftool.exe');
    if isempty(test)
        disp('ExifTool not available:');
        disp('Please download from,')
        disp(' http://www.sno.phy.queensu.ca/~phil/exiftool/')
        disp('make sure that the installed exiftool.exe is on your Matlab path')
        beep
        exifdata=[];
        nf = 0;
        return
    end
elseif strcmp('MACI64',computer)
    test = '/usr/local/bin/exiftool';
    if isempty(test)
        disp('ExifTool not available:');
        disp('Please download from,')
        disp(' http://www.sno.phy.queensu.ca/~phil/exiftool/')
        disp('make sure that the exiftool installer has been run')
        beep
        exifdata=[];
        nf = 0;
        return
    end
else
    disp('Computer type not recognized.');
end
TS=[ '"' test '" -s "' fname '"'];
[status, exifdata] = system(TS);
       
nf = find(exifdata==':');
nf = length(nf);
end

Is there a Linux version for this script?

I would like to add a new tag to a Image. How can I do that with this code?

I exactly wish to add the GPSInfo tag to a JPEG or TIFF image. I want to add GPS information from other device into the images

works like a charm

Peter Burns

Update is posted now.

Peter Burns

Note: I have submitted an update. It has not been posted yet.

Peter Burns

I have updated the files as suggested by jhh and Jonathan. Thanks.

Also, we can suppress the '1 image files updated', returned by ExifTool to the Command window by adding a second argument, so in putexif.m,
%[status] = system(temp1);
is replaced by,
[status, junk] = system(temp1);
or
[status, ~] = system(temp1);
I have included this in the update.

Jonathan

Thanks jhh, that did the tick,
For others you can get the second file, putexif.m to work by making the following changes to the else section:

%-----
    test = which('exiftool.exe');
    [exifdata, nf] = getexif(refname);
   % Save data as image file with Matlab metadata
    imwrite(dat, fname, 'quality', 100);
    [exifdata2, nf2] = getexif(fname);
   % Replace matadata from this file with desired tags from reference file
    temp1=['"' test '" -m -tagsfromfile "',refname,'" -all:all "', fname, '"'];
    status = system(temp1);
   
   % Approximate check
    [exifdata3, nf3] = getexif(fname);
    
   % Delete extra copy of reference image file
    temp3 = ['del "',fname,'_original"'];
    status = system(temp3);
    
   % Test approx. number of tags
    if abs(nf3-nf2<10)
        disp('Warning: Exif tags may not have been copied');
        status = 1;
    end
%----

I can't figure out how to suppress the output saying that '1 image files was updated' as I think it is being passed from exiftool.exe

jhh

jhh (view profile)

I've got it running now by (1) using 'addpath' to tell Matlab where exiftool can be found and (2) changing the 'else' part of getexif.m as follows:

 TS=[ '"' test '" -s "' fname '"']
    [status, exifdata]=system(TS);
    nf = find(exifdata==':');
    nf = length(nf);

But even then, you just get exifdata as a 1xn char array, you you still have to decipher that into meaningfull variables. (I've done so for myself, and it works, but it's not mature enough to post it on FileExchange).

I suppose nf should reurn the number of fields in the exif data, but counting the ':' is not the right way to do it.
 

Jonathan

I'm having the same issue as jhh, with it not acculay running

jhh

jhh (view profile)

Sounds like just what I need, but is not working on my syetem (R2007b).
I get: "'exiftool.exe' is not recognized as an internal or external command,
operable program or batch file."
Even though exiftool.exe is in my path (confirmed by 'whcih exiftool.exe')

Updates

1.1

Improved following suggestions from jhh and Jonathan. Thanks.

MATLAB Release
MATLAB 8.1 (R2013a)

Download apps, toolboxes, and other File Exchange content using Add-On Explorer in MATLAB.

» Watch video