Use exiv2 or imagemagick to remove EXIF data from stdin and output to stdout

exiv2, image-manipulation, imagemagick, shell

Solution

Using exiv2

I was not able to find a way to get `exiv2` to output to `stdout` -- it only wants to overwrite the existing file. You could use a small `bash` script to make a temporary file and get the md5 hash of that.

image.sh:

#!/bin/bash
cat <&0 > tmp.jpg  # Take input on stdin and dump it to temp file.
exiv2 rm tmp.jpg   # Remove EXIF tags in place.
md5sum tmp.jpg     # md5 hash of stripped file.
rm tmp.jpg         # Remove temp file.

You would use it like this:

cat image.jpg | image.sh

Using ImageMagick

You can do this using ImageMagick instead by using the `convert` command:

cat image.jpg | convert -strip - - | md5sum

Caveat:

I found that stripping an image of EXIF tags using `convert` resulted in a smaller file-size than using `exiv2`. I don't know why this is and what exactly is done differently by these two commands.

From `man exiv2`:

rm Delete image metadata from the files.

From `man convert`:

-strip strip image of all profiles and comments

Using exiftool

ExifTool by Phil Harvey

You could use `exiftool` (I got the idea from https://stackoverflow.com/a/2654314/3565972):

cat image.jpg | exiftool -all= - -out - | md5sum

This too, for some reason, produces a slightly different image size from the other two.

Conclusion

Needless to say, all three methods (`exiv2`, `convert`, `exiftool`) produce outputs with different md5 hashes. Not sure why this is. But perhaps if you pick a method and stick to it, it will be consistent enough for your needs.

Problem

How can I pipe an image into exiv2 or imagemagick, strip the EXIF tag, and pipe it out to stdout for more manipulation? I'm hoping for something like: ``` exiv2 rm - - | md5sum ``` which would output an image supplied via stdin and calcualte its md5sum. Alternatively, is there a faster way to do this?

Original source

Related problems