Portable Network Graphics To Graphics Interchange Format

Posted on by Ryan Desfosses

I recently had a pitch accepted for fedora magazine and as I was putting the article together I wanted some images to liven up the piece a bit. I decided to attempt to reuse images from the application’s website, but there were a couple of hurdles I had to get over to use them.

First, the images were taken on another distro, so I felt like it would be appropriate to crop that out. Second, the images were provided in a png format and I wanted a gif.

Download Images

The first leg of my gif journey required me to get the images I wanted to work with… simple enough. The commands below are what I used.

mkdir /tmp/ring_images
curl https://ring.cx/sites/ring.cx/files/1_welcome_screen_0.png -o /tmp/ring_images/1_welcome_screen_0.png
curl https://ring.cx/sites/ring.cx/files/2_register_username.png -o /tmp/ring_images/2_register_username.png
curl https://ring.cx/sites/ring.cx/files/3_ringid_qr_code_0.png -o /tmp/ring_images/3_ringid.png
ls /tmp/ring_images

Format

Originally, I just edited the images in shotwell, but I wanted the process to be reproducible in the future. So, I decided to look up imagemagick. The code below iterates through pictures downloaded in the previous step and crops the undesired bits.

for i in $( ls /tmp/ring_images/ ); do
  convert /tmp/ring_images/$i -crop 3050x1710+150+90 +repage /tmp/ring_images/$i
done

A couple notes about the command above. The format of the crop option takes the <width>x<height>+<x offset>+<y offset> and repage option resets the virtual canvas. This is necessary to avoid blank spaces that appear on the edges of the images (as result from the cropping).

Create gif

Now that the images are formatted to my liking I just had to glue them together into a single gif. This was done with the following.

convert -size 600x600 -delay 300 -loop 0 /tmp/ring_images/*.png /tmp/output.gif

The delay option specifies the number of ticks each image will show for in the gif. Since I set it to 300 and the default ticks per second is 100, each image should show for 3 seconds. To set the gif to repeat infinitely loop was set to zero.

Final Thoughts

The scripts above will still need to be updated to use for other projects in the future, but they still produce a usable gif and the structure of the code is still there. Most importantly it was fun putting it together and learning more about such a dynamic tool like imagemagick.