Cloudinary Blog

Cloud-based animated GIF generation

Back in the 1990s, websites mainly comprised of static textual pages dashed with a few images to make them slightly more appealing. You could even disable image downloading in your browser to make pages load faster, quite unthinkable in today's websites.
 
In order to make web pages look more alive, developers started looking for animation solutions. Proprietary browser plugins started to appear, followed by a real usability breakthrough - the enhanced, 89a GIF format. As part of its many enhancements, this new format allowed for simple animation sequences. While initially supported only by the Netscape browser, using GIF to add animations has proved quite straightforward and soon became very popular.
 
The modern web supports animations using Flash and HTML5 techniques, but animated GIFs still persist as a way to to create simple, efficient, cross-browser animations. A recent example can be seen at one of the Internet’s greatest innovators and biggest HTML5 early adopter - Apple itself. If you scroll through Apple's iPad features page, you will notice animation scenes depicting the new iPad's capabilities. These animations aren't based on the HTML5 Video format. They are based on dozens of separate JPG images that are pre-loaded and displayed programmatically to achieve a smooth animation effect. In the Design page of Apple's iPhone 5, if you scroll down to the earbuds section, you will notice a smooth animation of rotating earbuds. Again, no videos were used here. This time a more complex solution based on HTML Canvas, JPG images and Javascript is used.
 
In this blog post we wanted to show you how to easily generate simple animations with Cloudinary and how to generate animated GIF files that are still very useful for short animation sequences.
 

Animation building blocks 

Consider the following two images that were uploaded to Cloudinary - a blue cloud icon and three arrows:
 
 
 
With Cloudinary overlays and chained transformations it is very easy to generate an image where the arrows appear above the cloud icon. The following URL first expands the cloud icon to a 280x150 image with white padding and then adds an overlay with the arrows in the top left corner:
 
 
 
We can use the custom overlay coordinates to position the arrows in a different location. We can also apply a brightness effect as the following example shows. The arrows are now positioned 150 pixels from the left. We also applied another cropping transformation to make sure that the final image remains 280x150 even if the arrows overflow outside the original canvas.
 
 
 
Quick side-note - don't you think it's quite amazing what you can accomplish so easily with Cloudinary? If you don't have an account already, you can go ahead and sign up for a free account, we'll wait... (and if we were back in the early 1990s, this link would probably be flashing red :-)
 

Generating Animations

You could probably already guess where we're aiming at. Using the previous overlay concepts and a simple script, we can now create an animation sequence depicting the arrows moving from left to right while growing lighter and lighter until disappearing.
 
The following Ruby script uses Cloudinary's Ruby GEM to generate 34 images that construct the frames of the animation. The same can be easily done using any of our other client libraries (PHP, Python, Node.js, etc.), or directly with our URL-based apis.
 
The script programmatically generates transformation URLs similar to the examples above. Horizontal (X) position of the arrows moving from -50 to 280. Brightness effect increasing while X position increases. The URL is then given to Cloudinary's upload API call to generate a new image based on the given transformation. 
(-5..28).each_with_index do |x, index|
  url = Cloudinary::Utils.cloudinary_url("cloud_icon_right.png", 
   :width => 280, :height => 150, :crop => :crop, :gravity => (x < 0 ? :east : :west),
   :transformation => [
     { :width => 280, :height => 150, :gravity => :west, :crop => :pad },
     { :overlay => "arrows_right", :x => x * 10, :y => 0, :gravity => :west, 
       :effect => (x > 7 ? "brightness:#{(x-7)*4}" : nil) }
   ])
 
  Cloudinary::Uploader.upload(url, 
                :public_id => "arrow_animation_#{index.to_s.rjust(2, "0")}", 
                :tags => "arrow_animation")   
end
Executing the script above, generated 34 images in the cloud. All these images have a public ID formatted as arrow_animated_XX. For example, here's the thirteenth generated frame:
 
 
 
All generated images were assigned with the tag arrow_animation. If you are familiar with Cloudinary, you probably know that a tag can be used to generate a 'sprite' - a single image merging together all images of the same tag. Click on the following links to view the sprite image and generated CSS. You can see all the animation frames in this sprite. 
 
 
As mentioned, Cloudinary now supports easy animated GIF generation. All images sharing a tag can be merged into a single animated GIF, sorted alphabetically by their public IDs.
 
And here it is, the animated GIF generated using an amazingly simply URL. As always, the final image is generated on-the-fly* in the cloud and is then cached and delivered through a fast CDN:
 
 
 
This animation might be a little too slow. You can use the 'delay' parameter to change that. The parameter accepts the delay between frames, in milliseconds. Here is a much faster example:
 
 

*Update: Animated GIFs now need to be pregenerated with a call to the multi method of the upload API. The delivery URLs described in this blog post are now used to display the pregenerated animated GIFs.

Summary

Animated GIFs might be a little restrictive with their small 8 bit indexed color space and inefficient lossless compression. Still, these can be quite indispensable in various occasions. 
 
We've shown you how you can programmatically achieve powerful transformations, frame generation and GIF-based animations, easily and efficiently. We hope that these building blocks will be useful for your projects. We're sure that they will give you some interesting ideas of what you can accomplish with Cloudinary!

Recent Blog Posts

Improve user experience with responsive websites and applications
This article originally appeared on Inc. Magazine and is reprinted with permission.

Back in the day, responsive website design wasn't the business imperative that it is now. In fact, just having a functioning website was all that it took to set you apart, and if it had images that loaded correctly within a few minutes, then that was a nice bonus. Needless to say, but I'll say it anyway, those days are long gone.
Read more
What to consider when developing media rich websites and apps
Websites have evolved greatly over the past few years. Once text-heavy websites have become more eye-catching with prominent images and video. But the addition of richer media isn’t the only change impacting websites. Consumer behavior also factors into this evolution, as web access has moved from the desktop realm to a variety of different devices – smartphones, tablets, laptops, smartwatches and TVs – with different dimensions and resolutions. And consumers want to be able to access web content anytime and from any location.
 
To ensure that website performance is optimized, bandwidth usage is minimized and users have a top-notch experience, we will need to address many challenges.

High resolution images and videos

If a picture is worth 1,000 words, it’s no surprise that website owners are using images and videos as powerful tools on their websites to engage visitors. High-resolution images look best, but these files are so big that they cause websites to load slowly and use excessive bandwidth. These problems frustrate visitors, and potentially decrease their incentive to  engage further on the website.
Read more
Plugin for automatic responsive images in Jekyll-generated sites

This is a guest post by Nicolas Hoizey, co-founder of Clever Age and creator of the Jekyll Cloudinary plugin. Nicolas’ plugin leverages Cloudinary’s image storage, optimization, resizing, and delivery infrastructures to automate responsive images in Jekyll-generated static sites. We think it’s the bee’s knees, and invited Nicolas to write a bit about the process and motivation behind it. Without further ado, here’s Nicolas.

Read more
Cloudinary now delivers images and videos over HTTP/2

Even though websites have changed dramatically over the years – from simple text-based pages to advanced in-browser apps full of images and videos – the underlying HTTP protocol really hasn’t changed - until recently, with the approval of the HTTP/2 protocol by the IETF. Today Cloudinary is proud to announce, as part of a CDN infrastructure upgrade, general availability of HTTP/2 support in our image and video management solution. This will help you optimize the user experience on your app or website even more.

Read more