<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/assets/atom.xsl" type="text/xsl"?><feed
	xmlns="http://www.w3.org/2005/Atom"
	xmlns:thr="http://purl.org/syndication/thread/1.0"
	xml:lang="en-US"
	><title>Sacha Chua - tag - imagemagick</title>
	<subtitle>Emacs, sketches, and life</subtitle>
	<link rel="self" type="application/atom+xml" href="https://sachachua.com/blog/tag/imagemagick/feed/atom/index.xml" />
  <link rel="alternate" type="text/html" href="https://sachachua.com/blog/tag/imagemagick" />
  <id>https://sachachua.com/blog/tag/imagemagick/feed/atom/index.xml</id>
  <generator uri="https://11ty.dev">11ty</generator>
	<updated>2018-06-16T03:45:00Z</updated>
<entry>
		<title type="html">Experimenting with adding labels to photos</title>
		<link rel="alternate" type="text/html" href="https://sachachua.com/blog/2018/06/experimenting-with-adding-labels-to-photos/"/>
		<author><name><![CDATA[Sacha Chua]]></name></author>
		<updated>2018-06-16T08:15:20Z</updated>
    <published>2018-06-16T03:45:00Z</published>
    <category term="geek" />
<category term="linux" />
		<id>https://sachachua.com/blog/?p=29240</id>
		<content type="html"><![CDATA[<p>A-&#8216;s gotten really interested in letters lately, so I'm looking for ways to add more personally relevant text and images to her life. She often flips through the 4&#8243;x6&#8243; photos I got printed. Since they're photos, they're sturdier and can stand up to a little bending. I wanted to experiment with printing more pictures and labeling them with text, building on the script I used to <a href="https://sachachua.com/blog/2018/03/labeling-toy-storage-bins-with-photos-and-text-using-imagemagick-and-org-babel/">label our toy storage bins</a>. Here's a sample:</p>
<p><a href="https://sachachua.com/blog/wp-content/uploads/2018/06/2018-06-14-16-12-14-★★★-A-gently-lifted-the-flaps-in-the-book.-🏷fine-motor-3.jpg"><img loading="lazy" class="alignnone size-medium wp-image-29242" src="https://sachachua.com/blog/wp-content/uploads/2018/06/2018-06-14-16-12-14-★★★-A-gently-lifted-the-flaps-in-the-book.-🏷fine-motor-3-640x427.jpg" alt="2018-06-14-16-12-14 ★★★ A- gently lifted the flaps in the book. 🏷fine-motor" width="640" height="427" srcset="https://sachachua.com/blog/wp-content/uploads/2018/06/2018-06-14-16-12-14-★★★-A-gently-lifted-the-flaps-in-the-book.-🏷fine-motor-3-640x427.jpg 640w, https://sachachua.com/blog/wp-content/uploads/2018/06/2018-06-14-16-12-14-★★★-A-gently-lifted-the-flaps-in-the-book.-🏷fine-motor-3-280x187.jpg 280w, https://sachachua.com/blog/wp-content/uploads/2018/06/2018-06-14-16-12-14-★★★-A-gently-lifted-the-flaps-in-the-book.-🏷fine-motor-3-768x512.jpg 768w" sizes="(max-width: 640px) 100vw, 640px"></a></p>
<p>(Name still elided in the sample until I figure out what we want to do with names and stuff. I'll use <code>NAME_REPLACEMENTS</code> to put her name into the printed ones, though, since kids tend to learn how to read their names first.)</p>
<p>I haven't printed these out yet to see how legible they are, but a quick on-screen check looks promising.</p>
<p><code>prepare-for-printing:</code></p>
<div class="org-src-container">
<pre class="src src-sh"><span class="org-comment-delimiter">#</span><span class="org-comment">!/bin/</span><span class="org-keyword">bash</span>

<span class="org-comment-delimiter"># </span><span class="org-comment">Add label from ImageDescription EXIF tag to bottom of photo</span>

<span class="org-variable-name">destination</span>=~/cloud/print
<span class="org-variable-name">description_field</span>=ImageDescription
<span class="org-variable-name">font</span>=Alegreya-Regular
<span class="org-variable-name">SAVEIFS</span>=$<span class="org-variable-name">IFS</span>
<span class="org-variable-name">IFS</span>=$(<span class="org-builtin">echo</span> -en <span class="org-string">"\n\b"</span>)
<span class="org-variable-name">border</span>=50
<span class="org-variable-name">output_width_inches</span>=6
<span class="org-variable-name">output_height_inches</span>=4

<span class="org-comment-delimiter"># </span><span class="org-comment">NAME_REPLACEMENTS is an environment variable that's a sed expression</span>
<span class="org-comment-delimiter"># </span><span class="org-comment">for any name replacements, like s/A-/Actual name goes here/g</span>

<span class="org-keyword">for</span> file<span class="org-keyword"> in</span> $<span class="org-variable-name">*</span>; <span class="org-keyword">do</span>
  <span class="org-variable-name">description</span>=$(exiftool -s -s -s -$<span class="org-variable-name">description_field</span> <span class="org-string">"$file"</span> <span class="org-sh-escaped-newline">\</span>
     | sed <span class="org-string">"s/\"/\\\"/g;s/'/\\\'/g;$NAME_REPLACEMENTS"</span>)
  <span class="org-variable-name">date</span>=$(exiftool -s -s -s -DateTimeOriginal <span class="org-string">"$file"</span> <span class="org-sh-escaped-newline">\</span>
     | cut -c 1-10 | sed s/:/-/g)
  <span class="org-variable-name">width</span>=$(identify -format <span class="org-string">"%w"</span> <span class="org-string">"$file"</span>)
  <span class="org-variable-name">height</span>=$(identify -format <span class="org-string">"%h"</span> <span class="org-string">"$file"</span>)
  <span class="org-variable-name">largest</span>=$(( $<span class="org-variable-name">width</span> &gt; $<span class="org-variable-name">height</span> ? $<span class="org-variable-name">width</span> : $<span class="org-variable-name">height</span> ))
  <span class="org-variable-name">pointsize</span>=12
  <span class="org-variable-name">density</span>=$(( $<span class="org-variable-name">largest</span> / $<span class="org-variable-name">output_width_inches</span> ))
  <span class="org-variable-name">correct_height</span>=$(( $<span class="org-variable-name">output_height_inches</span> * $<span class="org-variable-name">density</span> ))
  <span class="org-variable-name">captionwidth</span>=$(( $<span class="org-variable-name">width</span> - $<span class="org-variable-name">border</span> * 2 ))
  convert <span class="org-string">"$file"</span> -density $<span class="org-variable-name">density</span> -units PixelsPerInch <span class="org-sh-escaped-newline">\</span>
    -gravity North -extent ${<span class="org-variable-name">width</span>}x${<span class="org-variable-name">correct_height</span>} <span class="org-sh-escaped-newline">\</span>
    -strip <span class="org-string">\(</span> -undercolor white -background white <span class="org-sh-escaped-newline">\</span>
    -fill black -font <span class="org-string">"$font"</span> -bordercolor White <span class="org-sh-escaped-newline">\</span>
    -gravity SouthWest -border $<span class="org-variable-name">border</span> -pointsize $<span class="org-variable-name">pointsize</span> <span class="org-sh-escaped-newline">\</span>
    -size ${<span class="org-variable-name">captionwidth</span>}x  caption:<span class="org-string">"$date $description"</span> <span class="org-string">\)</span> <span class="org-sh-escaped-newline">\</span>
    -composite <span class="org-string">"$destination/$file"</span>
<span class="org-keyword">done</span>
<span class="org-variable-name">IFS</span>=$<span class="org-variable-name">SAVEIFS</span>
gwenview $<span class="org-variable-name">destination</span>
</pre>
</div>
<p>Here's my current <code>rename-based-on-exif</code>, too. I modified it to use the <code>ImageDescription</code> or the <code>UserComment</code> field, and I switched to using Unicode stars and labels instead of # to minimize problems with exporting to HTML.</p>
<div class="org-src-container">
<pre class="src src-sh"><span class="org-comment-delimiter">#</span><span class="org-comment">!/bin/</span><span class="org-keyword">bash</span>

<span class="org-variable-name">date</span>=<span class="org-string">"\${DateTimeOriginal;s/[ :]/-/g}"</span>
<span class="org-variable-name">rating</span>=<span class="org-string">"\${Rating;s/([1-5])/'★' x \$1/e}"</span>
<span class="org-variable-name">tags</span>=<span class="org-string">"\${Subject;s/^/🏷/;s/, / 🏷/g}"</span>
<span class="org-variable-name">field</span>=FileName  <span class="org-comment-delimiter"># </span><span class="org-comment">TestName for testing</span>
exiftool -m -<span class="org-string">"$field&lt;$date $rating \${ImageDescription} $tags.%e"</span> \
         -<span class="org-string">"$field&lt;$date $rating \${UserComment} $tags.%e"</span> <span class="org-string">"$@"</span></pre>
</div>
<p>In order to upload my fancy-shmancy Unicode-filenamed files, I also had to convert my WordPress database from utf8 to utf8mb4. <a href="https://florianbrinkmann.com/en/3457/switch-wordpress-from-utf8-to-utf8mb4-retrospectively/">This upgrade plugin</a> was very helpful.</p>
<p>You can <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2018%2F06%2Fexperimenting-with-adding-labels-to-photos%2F&body=Name%20you%20want%20to%20be%20credited%20by%20(if%20any)%3A%20%0AMessage%3A%20%0ACan%20I%20share%20your%20comment%20so%20other%20people%20can%20learn%20from%20it%3F%20Yes%2FNo%0A">e-mail me at sacha@sachachua.com</a>.</p>]]></content>
		</entry>
</feed>