Writing IPTC field data into a border

Questions and postings pertaining to the usage of ImageMagick regardless of the interface. This includes the command-line utilities, as well as the C and C++ APIs. Usage questions are like "How do I use ImageMagick to create drop shadows?".
adrianlambert

Writing IPTC field data into a border

Post by adrianlambert »

Hi there, first post...
I want to create a digital frame with the data from several IPTC fields displayed on the frame, Caption, date, copyright info etc. I've used LR/mogrify with lightroom to do this but want to move away from lightroom and the one last bind is that I can't find a solution to this problem. Before I get stuck into the user resources I wanted to pose the simple question, is this possible with Imagemagick? I'm working on macs and would then like to be able to make this run as a folder action or some kind of droplet. Any thoughts on this?
snibgo
Posts: 12159
Joined: 2010-01-23T23:01:33-07:00
Authentication code: 1151
Location: England, UK

Re: Writing IPTC field data into a border

Post by snibgo »

Yes, it probably is possible. Your best bet is to post the URL to a sample image and tell us if you are on Unix/Windows/Mac/whatever, and someone may chip in a script.
snibgo's IM pages: im.snibgo.com
adrianlambert

Re: Writing IPTC field data into a border

Post by adrianlambert »

Thanks, I'll have a go myself first though just for fun...
I've got to first base and got a border that I like. As for the IPTC, this looks tricky.
Could someone let me know if my thinking is sound... Would I read the metadata from the field that I want to annotate, and write it into a text file then use the contents of that file as the source of the annotation?
snibgo
Posts: 12159
Joined: 2010-01-23T23:01:33-07:00
Authentication code: 1151
Location: England, UK

Re: Writing IPTC field data into a border

Post by snibgo »

Thanks, I'll have a go myself first though just for fun...
That's the spirit!

You could use a text file, which would be a good way of finding out what IPTC info a file contains. For production use, you could set environment variables, eg COPYRIGHT for the copyright string, and use these variables in "annotate" or "caption".

See http://www.imagemagick.org/script/sitemap.php for general docs, and viewtopic.php?f=1&t=15825 for a (Windows) example of environment variables.
snibgo's IM pages: im.snibgo.com
Bonzo
Posts: 2971
Joined: 2006-05-20T08:08:19-07:00
Location: Cambridge, England

Re: Writing IPTC field data into a border

Post by Bonzo »

You need to get your EXIF data into a variable and it may need some formatting to get what you want:
Image Magick returns the F number in the format of 700/100 or 40/10

Image Magick returns the shutter speed in the format of 810/100

Calculate the speed in seconds using the power of 2 and save it in the shutterspeed variable
I pressume IPTC data is similar to EXIF ?

Anyway you can see the full list of data ImageMagick can find using:

Code: Select all

identify -verbose image.jpg
User avatar
anthony
Posts: 8883
Joined: 2004-05-31T19:27:03-07:00
Authentication code: 8675308
Location: Brisbane, Australia

Re: Writing IPTC field data into a border

Post by anthony »

The second example in...
http://www.imagemagick.org/Usage/thumbnails/#labels
may be of help. Yes it is complex, but it is extracting the text from one image for generating another 'overlay image' which is then heavily processed. However it should be something like what you are after.
Anthony Thyssen -- Webmaster for ImageMagick Example Pages
https://imagemagick.org/Usage/
adrianlambert

Re: Writing IPTC field data into a border

Post by adrianlambert »

Thanks fellas.
I'm going for function over form so I'm thinking a bunch of reads of about 8 different IPTC fields and 1 Exif field into variables that can then be compiled into an annotate command might be the way to go. I might be able to do this as a shell script or automator action (mac) then turn it into a droplet for ease of use.

The text in the border at the bottom of the image will just be made up of delimiters and field titles followed by the field variables.

Here's an example of what I currently have.
http://goo.gl/6QeU
I'm hoping to get pretty much the same result. (The photoshop script, written by Russell Brown that does this no longer works with Photoshop CS5 - rather than patch it up which is what I did in the first place I'm hoping to write my own that isn't dependent on a Photoshop)
User avatar
fmw42
Posts: 25562
Joined: 2007-07-02T17:14:51-07:00
Authentication code: 1152
Location: Sunnyvale, California, USA

Re: Writing IPTC field data into a border

Post by fmw42 »

in unix, you can script this by extracting each IPTC field as a variable as follows

field1=`convert image -format "%[IPTC:dataset:record]" info:`

then you can use -annotate or caption: to write all of the variables into the image.

see http://www.imagemagick.org/script/escape.php and http://www.imagemagick.org/Usage/text/
snibgo
Posts: 12159
Joined: 2010-01-23T23:01:33-07:00
Authentication code: 1151
Location: England, UK

Re: Writing IPTC field data into a border

Post by snibgo »

Yes, that should be straight-forward. "caption:" might be best, as it does word-wrapping for you.

For the IPTC and EXIF fields available, see http://www.imagemagick.org/script/escape.php

For text, see http://www.imagemagick.org/Usage/text/
snibgo's IM pages: im.snibgo.com
User avatar
anthony
Posts: 8883
Joined: 2004-05-31T19:27:03-07:00
Authentication code: 8675308
Location: Brisbane, Australia

Re: Writing IPTC field data into a border

Post by anthony »

Also see IM Examples, Annotating Images, Annotating Above and Below..
http://www.imagemagick.org/Usage/annotating/#anno_below
Anthony Thyssen -- Webmaster for ImageMagick Example Pages
https://imagemagick.org/Usage/
adrianlambert

Re: Writing IPTC field data into a border

Post by adrianlambert »

fmw42 wrote: in unix, you can script this by extracting each IPTC field as a variable as follows
field1=`convert image -format "%[IPTC:dataset:record]" info:`
Thanks, this will likely be the basis of what I'm going to do.
snibgo wrote: Yes, that should be straight-forward. "caption:" might be best, as it does word-wrapping for you.
Great tip, thanks. I'd scanned the relevant options but hadn't picked that up yet. Looks like "caption" it is.
adrianlambert

Re: Writing IPTC field data into a border

Post by adrianlambert »

Thanks to everyone for the invaluable help, here it is so far...

Code: Select all

#!/bin/sh

# Set variable for the current filename
CURRENTIMAGE=./EvaPassport.jpg

# Set variables for the IPTC EXIF and ImageMagick fields

COPYRIGHTNOTICE=`convert $CURRENTIMAGE -format "%[IPTC:2:116]" info:`
FILENAME=`convert $CURRENTIMAGE -format "%t" info:`
CAPTION=`convert $CURRENTIMAGE -format "%[IPTC:2:120]" info:`
CITY=`convert $CURRENTIMAGE -format "%[IPTC:2:90]" info:`
STATEPROVINCE=`convert $CURRENTIMAGE -format "%[IPTC:2:95]" info:`
COLOURPROFILE=`convert $CURRENTIMAGE -format "%r]" info:`
SPECIALINSTRUCTIONS=`convert $CURRENTIMAGE -format "%[IPTC:2:40]" info:`
JOBIDENTIFIER=`convert $CURRENTIMAGE -format "%[IPTC:2:103]" info:`
IMAGEWIDTH=`convert $CURRENTIMAGE -format "%w" info:`
IMAGEHEIGHT=`convert $CURRENTIMAGE -format "%h" info:`
CAPTIONHEIGHT=$[$IMAGEHEIGHT / 10]
CAPTIONSIZE=$IMAGEWIDTH"x"$CAPTIONHEIGHT

echo imagewidth is $IMAGEWIDTH
echo imageheight is $IMAGEHEIGHT
echo captionheight is $CAPTIONHEIGHT
echo captionsize is $CAPTIONSIZE

# print out a test caption based on specific text combined with the returned variables (works except where do I get the colour profile name)
#echo 'Please archive original file with border. A path is embedded to remove the border | '$COPYRIGHTNOTICE' | '$FILENAME' | Caption: '$CAPTION' | '$CITY' | '$STATEPROVINCE' | '$COLOURPROFILE' | Usage Terms: '$SPECIALINSTRUCTIONS' | Licensee: '$JOBIDENTIFIER |

#create a simple border at the bottom only (Works)
convert $CURRENTIMAGE -gravity North -background grey -extent 100x105% $CURRENTIMAGE

echo 'Please archive original file with border. A path is embedded to remove the border | '$COPYRIGHTNOTICE' | '$FILENAME' | Caption: '$CAPTION' | '$CITY' | '$STATEPROVINCE' | '$COLOURPROFILE' | Usage Terms: '$SPECIALINSTRUCTIONS' | Licensee: '$JOBIDENTIFIER > caption.txt

convert -background grey -font Arial-Narrow-Bold -gravity Center -fill grey10 -size $CAPTIONSIZE caption:@caption.txt caption.jpg

composite -gravity South caption.jpg $CURRENTIMAGE  $CURRENTIMAGE

rm caption.txt
rm caption.jpg
Things I still want to achieve are finding a way to write the colour profile into the border. At the moment I get a result that says "DirectClassRGB]". What i wanted to see was "Adobe RGB (1998)". Also the textbox is cropping into the image slightly... too late in the evening to figure that out now though. The one other thing is how to get the CURRENTIMAGE to be dynamic.

Would love any feedback or advice as this is the first scripting I've ever tried.
snibgo
Posts: 12159
Joined: 2010-01-23T23:01:33-07:00
Authentication code: 1151
Location: England, UK

Re: Writing IPTC field data into a border

Post by snibgo »

Good stuff. You can get the ICC profile name from "identify -verbose in.jpg". Look for the line after "Profile-icc". There may be a smarter way to get this.
snibgo's IM pages: im.snibgo.com
adrianlambert

Re: Writing IPTC field data into a border

Post by adrianlambert »

snibgo wrote:You can get the ICC profile name from "identify -verbose in.jpg". Look for the line after "Profile-icc
Thanks.
I can't see a simple way to ensure the right text would pass through.
I might have to drop that field.
adrianlambert

Re: Writing IPTC field data into a border

Post by adrianlambert »

snibgo wrote:You can get the ICC profile name from "identify -verbose in.jpg". Look for the line after "Profile-icc".
Thanks snibgo, that fixed it for me after a bit more reading...
I also got the caption to sit better without cropping the image.

If anyone wants to try this that would be much appreciated.

to run it, in a terminal window type ./MetaCaptionIM.sh /PATHTO/FILENAME.XXX
It overwrites the inputted image so back it up first.

I'd like to do more to make it more useable as I mentioned before so that it could run a batch of images.
Any advice?

Thanks for the help, I've over the moon just being able to figure this much out. Great forum.


Code: Select all

#!/bin/sh

# This is a script written with help by Adrian Lambert to unceremoniously caption an image file with a set of matadata fields using ImageMagick.

# Set variable for the current filename to the first argument in the command line.
CURRENTIMAGE=$1

# Set caption variables for the IPTC EXIF and ImageMagick fields.

FILENAME=`convert $CURRENTIMAGE -format "%t" info:`
COPYRIGHTNOTICE=`convert $CURRENTIMAGE -format "%[IPTC:2:116]" info:`
CAPTION=`convert $CURRENTIMAGE -format "%[IPTC:2:120]" info:`
CITY=`convert $CURRENTIMAGE -format "%[IPTC:2:90]" info:`
STATEPROVINCE=`convert $CURRENTIMAGE -format "%[IPTC:2:95]" info:`
SPECIALINSTRUCTIONS=`convert $CURRENTIMAGE -format "%[IPTC:2:40]" info:`
JOBIDENTIFIER=`convert $CURRENTIMAGE -format "%[IPTC:2:103]" info:`

# Set the Colourspace name in a simple format from ImageMagick
COLOURPROFILE=`identify -verbose $CURRENTIMAGE | grep -E "Grey|RGB|sRGB|CMYK" | grep -v Colorspace`

# Get the image width and height.
IMAGEWIDTH=`convert $CURRENTIMAGE -format "%w" info:`
IMAGEHEIGHT=`convert $CURRENTIMAGE -format "%h" info:`

# Set caption height to 5% of the overall image height.
CAPTIONHEIGHT=$[$IMAGEHEIGHT / 20]

# Set the caption area to the width of the input image by the captionheight
CAPTIONSIZE=$IMAGEWIDTH"x"$CAPTIONHEIGHT

# Create a simple border at the bottom only
convert $CURRENTIMAGE -gravity North -background grey -extent 100x105% $CURRENTIMAGE

# Write the caption to a temporary text file.
echo 'Please archive original file with border. A path is embedded to remove the border | '$COPYRIGHTNOTICE' | '$FILENAME' | Caption: '$CAPTION' | '$CITY' | '$STATEPROVINCE' | '$COLOURPROFILE' | Usage Terms: '$SPECIALINSTRUCTIONS' | Licensee: '$JOBIDENTIFIER > caption.txt

# Create an image from the temporary text file as a temporary image file.
convert -background grey -font Arial-Narrow-Bold -gravity Center -fill grey10 -size $CAPTIONSIZE caption:@caption.txt caption.jpg

# Create a composite of the input image with it's caption
composite -gravity South caption.jpg $CURRENTIMAGE  $CURRENTIMAGE

# Tidy up temp files. 
rm caption.txt
rm caption.jpg

Post Reply