Cloudinary Blog

Image opacity manipulation and dynamic watermark generation

Modifying an image opacity so the image is semi-transparent is a common requirement when implementing modern graphics design. Reducing image opacity allows background images to feel less dominant. Reducing opacity also allows layering of multiple images one on top of the other, an important step when adding watermarks, badges and textual overlays to images.
 
Modern web browsers support opacity manipulation via CSS directives. This however does not solve the problem completely. Watermarks need to be embedded as part of the original image and can't be added on the client's side. In addition, manipulating the opacity of the image itself allows for a consistent view across all your service's mediums - website, mobile application, emails (notifications) and PDFs (reports). Emails in particular do not support many of the modern CSS directives.
 
In this blog post we wanted to show how you can use Cloudinary's cloud-based image transformations to easily manipulate the opacity of images and how to use this technique to add watermarks to images.
 

Dynamically changing Image Opacity

Let's look at the following image the was uploaded to the cloud using the 'mountain' public ID.
 
 
You might want to use an image like the one above as a background image for a section of your web or mobile application. Simply set the 'opacity' parameter (or 'o' for URLs) to the desired percentage and Cloudinary will automatically modify the opacity of the image on-the-fly. As always, the resulting image is stored persistently in the cloud  and delivered optimized and cached to your worldwide users through a fast CDN.
 
The following example reduced the mountain image opacity to 20%. Now you can safely place text and other graphical elements above this image.
 
 
 
Below are examples of generating a transformation URL with modified opacity using our client libraries for Rails, PHP, Django and Node.js
<%= cl_image_tag("mountain.jpg", :opacity => 20) %>
<?php echo cl_image_tag("mountain.jpg", array("opacity" => 20)) ?>
import cloudinary
img = cloudinary.CloudinaryImage("mountain.jpg")
img.image(opacity=20)
cloudinary.image("mountain.jpg", { opacity: 20 });
 

Grayed-out Logos

Another common graphic design practice is to display a list of logos of customers and partners in your web site. Instead of the original, colorful logos, many web designers prefer to display semi-transparent grayed versions of these logos so they don't take attention from the website's messaging. 
 
With Cloudinary you can dynamically gray out images, and easily modify them in case your graphic designer has a change of heart.
 
In the following example, we've uploaded multiple logos to Cloudinary. We've went further and used Cloudinary's sprite-generation capabilities to merge these logos into a single sprite image for better performance:
 
 
 
By simply setting the 'effect' parameter (or 'e' for URLs) to 'grayscale' and setting the 'opacity' parameter ('o' for URLs), Cloudinary generates a semi-transparent gray-scale version of the logos for embedding in your website:
 

 

Generating Watermarks

In a previous blog post, we've shown how you can easily add overlays to images. Such overlays could be used to add watermarks to images using a previously uploaded semi-transparent PNG image of such watermark. With the new opacity manipulation transformation, you can upload your non-transparent watermark image and manipulate its opacity dynamically to make it semi-transparent, ready for adding as a watermark overlay.
 
The following example adds the previously uploaded image 'cloudinary_icon' as a 200 pixels wide overlay above the mountain image:
 
 
 
Now, by setting opacity to 40%, the overlay becomes semi transparent:
 
 
 
 
 
You can also apply an effect or filter on the overlay. In the following example we've increased the brightness of the overlay to make it white and reduced opacity to 30%:
 
 
 
The code samples below detail how to build the same URL in Ruby, PHP, Django and Node.js:
 
<%= cl_image_tag("mountain.jpg", :opacity => 30, :effect => "brightness:20", 
                  :width => 200, :overlay => "cloudinary_icon") %>
<?php echo cl_image_tag("mountain.jpg", array("opacity" => 30, 
  "effect" => "brightness:20", "width" => 200, "overlay" => "cloudinary_icon")) ?>
import cloudinary
img = cloudinary.CloudinaryImage("mountain.jpg")
img.image(opacity=30, effect="brightness:20", width=200, overlay="cloudinary_icon")
cloudinary.image("mountain.jpg", 
  { opacity: 30, effect: "brightness:20", width: 200, overlay: "cloudinary_icon" });
 

Summary

Dynamic opacity manipulation and watermark generation are some of the newest Cloudinary capabilities in your image manipulation tool-belt. These capabilities further simplify your web and mobile applications tedious image management tasks. 
 
With a simple URL (or one line of code) you can generate images that match your ever evolving graphic requirements and deliver them quickly to your users. You don't have to deal with complex non-standard CSS directives and you don't have to use over-qualified graphical software like Photoshop to generate images in your desired color balance and opacity.
 
Please share your thoughts and let us know how we can further improve Cloudinary's growing feature set.

Recent Blog Posts

ImageCon17: Delivering Responsive Images

By Jason Grigsby

After five years many specifications, some inflamed Twitter battles and other conversations, responsive images have finally landed and there's a sound. Which is really exciting right? People have been climbing for this for quite some time and we've reached a point where they're available in modern browsers. So people were excited, they wanted to go use them it's something that designers and developers have had as a point of frustration for a long time.

Read more
Auto padding images with content-aware color padding

How you present the content of your website can be just as important as the content itself. The images you display need to conform to the graphic design of your site, and every image needs to fit within a predefined size. Although that may be simple enough to achieve when you are dealing with your own images, the task can be more challenging when displaying images uploaded by your users.

Read more

Bounce! Hacking Jazzfest with Social Videos

By Eric Normand
Bounce! Hacking Jazzfest with Social Videos

Last week, I was invited to an exclusive hackathon to build apps for musicians. The app team I was assigned to was tasked with building a video upload site for Bounce videos. Bounce is a style of music that originated in New Orleans. The app would be called BounceDotCom.com and there were plans to have Big Freedia, the Queen of Bounce, promote it. I knew the organizer could make things happen, so I jumped at the chance.

Read more
Getting a Better React-ion with Progressive Web Apps

This is part 2 of a 3 part series

React has become more popular, as well as more mature, over the last four years since its release by Facebook. It has become one of the go-to technologies for people looking to componentize the front-end of any web application. It also helps that an entire mobile stack is built around React in the form of ReactNative. The components are wonderful, however there can be a burdensome learning curve. But, in the end, there’s the payoff of highly reusable code and a better user experience.

Read more
Build an Image Library with React & Cloudinary

This article was originally posted on Scotch.io

React is a good tool when it comes to building flexible and reusable UI components. However, it's "one of those libraries" that cannot handle all the tasks involved in building a full fleshed UI project. Other supporting tools - such as a recently announced React SDK from Cloudinary - are available to provide solutions that the React core cannot.

Read more
Getting Started with Vue JS: The Progressive JavaScript Framework

The most challenging aspect of building a product with a front-end framework is focusing on the complexity of the tool rather than the complexity of the actual problem being solved. It’s perhaps more frustrating when the tool is complex but the problem is a simple one (e.g. complex webpack config for a todo app). The term progressive, is used by Vue.js to describe how this challenge can be mitigated. Building a basic demo or small app? Vue.js is simple enough to handle that. How about a complex enterprise app? Vue.js is capable of produce cutting-edge solutions, as well.

Read more