{"id":21663,"date":"2018-01-22T18:19:32","date_gmt":"2018-01-22T18:19:32","guid":{"rendered":"http:\/\/impressed_by_whatsapp_tech_build_a_whatsapp_clone_with_image_manipulation_and_optimization"},"modified":"2024-06-01T10:18:48","modified_gmt":"2024-06-01T17:18:48","slug":"impressed_by_whatsapp_tech_build_a_whatsapp_clone_with_image_manipulation_and_optimization","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/impressed_by_whatsapp_tech_build_a_whatsapp_clone_with_image_manipulation_and_optimization","title":{"rendered":"Build a WhatsApp Clone with Automatic Image Optimization"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><p><a href=\"https:\/\/cloudinary.com\/blog\/impressed_by_whatsapp_technology_build_a_whatsapp_clone_with_image_and_video_upload\">In the previous post<\/a>, we showed how to upload images to a Cloudinary server. In this part, we will play with some of the features we see on the WhatsApp technology. After you or your users have uploaded image assets to Cloudinary, you can deliver them via dynamic URLs. You can include instructions in your dynamic URLs that tell Cloudinary to transform your assets using a set of transformation parameters. All image transformations and image optimizations are performed automatically in the cloud and your transformed assets are automatically optimized before they are routed through a fast CDN to the end user for an optimal user experience.\nFor example, you can resize and crop, add overlays, blur or pixelate faces, apply a variety of special effects and filters, and apply settings to optimize your images and to deliver them responsively.<\/p>\n<p>Here are a few examples of the commonly used image transformation features, along with links to their more detailed documentation :<\/p>\n<ul>\n<li>\n<a href=\"https:\/\/cloudinary.com\/documentation\/android_image_manipulation#resizing_and_cropping\">Resizing and cropping<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/documentation\/android_image_manipulation#converting_to_another_image_format\">Converting to another image format<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/documentation\/android_image_manipulation#applying_image_effects_and_filters\">Applying image effects and filters<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/documentation\/android_image_manipulation#adding_text_and_image_overlays\">Adding text and image overlays<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/documentation\/android_image_manipulation#image_optimizations\">Image optimizations<\/a>\n<\/li>\n<\/ul>\n<h2>Resizing and Cropping :<\/h2>\n<p>We won\u2019t be going in detail about all the listed features, as there are still a lot of them to be explored. However we\u2019ve attached links to each of them should you decide to read further on your own. Now, with our <code>MediaManager<\/code> already initialized, we\u2019ll quickly resize and crop our uploaded image in the <code>onCreate()<\/code> method. Here\u2019s how :<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css shcb-wrap-lines\"><span class=\"hljs-selector-tag\">MediaManager<\/span><span class=\"hljs-selector-class\">.get<\/span>()<span class=\"hljs-selector-class\">.url<\/span>()<span class=\"hljs-selector-class\">.transformation<\/span>(<span class=\"hljs-selector-tag\">new<\/span> <span class=\"hljs-selector-tag\">Transformation<\/span>()<span class=\"hljs-selector-class\">.width<\/span>(250)<span class=\"hljs-selector-class\">.height<\/span>(250)<span class=\"hljs-selector-class\">.gr<\/span>\n<span class=\"hljs-selector-tag\">avity<\/span>(\"<span class=\"hljs-selector-tag\">faces<\/span>\")<span class=\"hljs-selector-class\">.crop<\/span>(\"<span class=\"hljs-selector-tag\">fill<\/span>\"))<span class=\"hljs-selector-class\">.generate<\/span>(\"<span class=\"hljs-selector-tag\">selected_image<\/span><span class=\"hljs-selector-class\">.jpg<\/span>\")\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>This example uses the <code>fill<\/code> cropping method to generate and deliver an image that completely fills the requested 250&#215;250 size while retaining the original aspect ratio. It uses face detection gravity to ensure that all the faces in the image are retained and centered when the image is cropped<\/p>\n<h2>Applying Effects and Filters<\/h2>\n<p>WhatsApp technology doesn\u2019t provide options like applying effects and filters just like Instagram. We can add this feature to our clone using Cloudinary:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css shcb-wrap-lines\"><span class=\"hljs-selector-tag\">MediaManager<\/span><span class=\"hljs-selector-class\">.get<\/span>()<span class=\"hljs-selector-class\">.url<\/span>()<span class=\"hljs-selector-class\">.transformation<\/span>(<span class=\"hljs-selector-tag\">new<\/span> <span class=\"hljs-selector-tag\">Transformation<\/span>()\n  <span class=\"hljs-selector-class\">.effect<\/span>(\"<span class=\"hljs-selector-tag\">cartoonify<\/span>\")<span class=\"hljs-selector-class\">.chain<\/span>()\n  <span class=\"hljs-selector-class\">.radius<\/span>(\"<span class=\"hljs-selector-tag\">max<\/span>\")<span class=\"hljs-selector-class\">.chain<\/span>()\n  <span class=\"hljs-selector-class\">.effect<\/span>(\"<span class=\"hljs-selector-tag\">outline<\/span><span class=\"hljs-selector-pseudo\">:100\").color(\"lightblue\").chain()<\/span>\n  <span class=\"hljs-selector-class\">.background<\/span>(\"<span class=\"hljs-selector-tag\">lightblue<\/span>\")<span class=\"hljs-selector-class\">.chain<\/span>()\n  <span class=\"hljs-selector-class\">.height<\/span>(300)<span class=\"hljs-selector-class\">.crop<\/span>(\"<span class=\"hljs-selector-tag\">scale<\/span>\"))<span class=\"hljs-selector-class\">.generate<\/span>(\"<span class=\"hljs-selector-tag\">selected_image<\/span><span class=\"hljs-selector-class\">.jpg<\/span>\")\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>The code above applies a cartoonify effect, rounding corners effect, and background color effect (and then scales the image down to a height of 300 pixels).<\/p>\n<p>There is a lot more you can do with Cloudinary image transformations; you can even apply transformations based on certain conditions.<\/p>\n<p>With Cloudinary\u2019s conditional transformations, images are transformed on-the-fly using dynamic delivery URLs for any uploaded image. A condition and its associated transformations are added to the URLs using the <code>if<\/code> parameter which accepts a string value detailing the condition to evaluate. You can apply a transformation based on the image\u2019s width, height, aspect ratio, the number of faces in the image (if any) or the number of frames (for animated images) or pages (for PDFs) present. For example, we can evaluate whether our uploaded image\u2019s width is greater than 500 pixels with <code>if_w_gt_500<\/code>. Also, multiple conditions can be evaluated by concatenating the conditions with an <code>and<\/code> or <code>or<\/code> operator, and a different transformation can be applied in the case that the condition is evaluated as negative by using the <code>if_else<\/code> parameter. Now let\u2019s transform our uploaded image such that <code>if<\/code> it contains a face, we zoom into the face otherwise, we fit the entire image into the defined space.<\/p>\n<p>Here\u2019s how :\nHead back inside the <code>onCreate()<\/code> method in the MainActivity Class and define the transformations we just described using the <code>MediaManager<\/code> as thus :<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-comment\">\/\/ define transformation from MediaManager<\/span>\nMediaManager.get().url().transformation(<span class=\"hljs-keyword\">new<\/span> Transformation()\n<span class=\"hljs-comment\">\/\/if a face is detected<\/span>\n  .if(<span class=\"hljs-string\">\"fc_gte_1\"<\/span>).chain()\n  <span class=\"hljs-comment\">\/\/zoom into the face with the defined parameters<\/span>\n  .width(<span class=\"hljs-number\">200<\/span>).height(<span class=\"hljs-number\">200<\/span>).gravity(<span class=\"hljs-string\">\"face\"<\/span>).crop(<span class=\"hljs-string\">\"thumb\"<\/span>).chain()\n  <span class=\"hljs-comment\">\/\/if a face is not detected, fit the image into the defined params<\/span>\n  .if(<span class=\"hljs-string\">\"else\"<\/span>).width(<span class=\"hljs-number\">200<\/span>).height(<span class=\"hljs-number\">200<\/span>).crop(<span class=\"hljs-string\">\"fit\"<\/span>).chain()\n  <span class=\"hljs-comment\">\/\/end transformation<\/span>\n  .if(<span class=\"hljs-string\">\"end\"<\/span>).chain()\n  .radius(<span class=\"hljs-number\">40<\/span>).border(<span class=\"hljs-string\">\"4px_solid_black\"<\/span>)).generate(<span class=\"hljs-string\">\"selected_image.jpg\"<\/span>)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<h2>Image Optimizations<\/h2>\n<p>By default, Cloudinary automatically performs certain optimizations on all transformed images. There are also a number of additional features that enable you to further optimize the images you use in your Android application. These include optimizations to image quality, format and size, among others.\nFor example, you can use the <code>auto<\/code> value for the <code>fetchFormat<\/code> and <code>quality<\/code> attributes to automatically deliver the image in the format and quality that minimize file size while meeting the required quality level. Below, these two parameters are applied, resulting in a 50 percent file size reduction (1.4MB vs. 784KB) with no visible change in quality.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css shcb-wrap-lines\"><span class=\"hljs-selector-tag\">MediaManager<\/span><span class=\"hljs-selector-class\">.get<\/span>()<span class=\"hljs-selector-class\">.url<\/span>()<span class=\"hljs-selector-class\">.transformation<\/span>(<span class=\"hljs-selector-tag\">new<\/span> <span class=\"hljs-selector-tag\">Transformation<\/span>()<span class=\"hljs-selector-class\">.quality<\/span>(\"<span class=\"hljs-selector-tag\">auto<\/span>\")<span class=\"hljs-selector-class\">.fetchForm<\/span>\n<span class=\"hljs-selector-tag\">at<\/span>(\"<span class=\"hljs-selector-tag\">auto<\/span>\"))<span class=\"hljs-selector-class\">.generate<\/span>(\"<span class=\"hljs-selector-tag\">selected_image<\/span><span class=\"hljs-selector-class\">.webp<\/span>\")\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<h2>Convert image to another format<\/h2>\n<p>You can deliver any image uploaded to Cloudinary in essentially any image format. There are two major ways to convert and deliver in another format:<\/p>\n<ul>\n<li>Specify the image\u2019s public ID with the desired extension.<\/li>\n<li>Explicitly set the desired format using the <code>fetchFormat<\/code> parameter.\nSpecifying the image\u2019s public ID with the desired extension is primarily the easiest way to convert it to another format. let\u2019s take for example that we want to change the format of our uploaded image to a <code>gif<\/code>, we\u2019ll simply specify it in the image delivery URL as thus :<\/li>\n<\/ul>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css shcb-wrap-lines\"><span class=\"hljs-selector-tag\">MediaManager<\/span><span class=\"hljs-selector-class\">.get<\/span>()<span class=\"hljs-selector-class\">.url<\/span>()<span class=\"hljs-selector-class\">.generate<\/span>(\"<span class=\"hljs-selector-tag\">selected_image<\/span><span class=\"hljs-selector-class\">.gif<\/span>\")\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>Yeah, it\u2019s that simple. We can also achieve the same result with the <code>fetchFormat<\/code> parameter. this is a bit trickier, but equally as simple.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css shcb-wrap-lines\"><span class=\"hljs-selector-tag\">MediaManager<\/span><span class=\"hljs-selector-class\">.get<\/span>()<span class=\"hljs-selector-class\">.url<\/span>()<span class=\"hljs-selector-class\">.transformation<\/span>(<span class=\"hljs-selector-tag\">new<\/span> <span class=\"hljs-selector-tag\">Transformation<\/span>()<span class=\"hljs-selector-class\">.width<\/span>(350)<span class=\"hljs-selector-class\">.crop<\/span>(\"<span class=\"hljs-selector-tag\">scale<\/span>\"))\n<span class=\"hljs-selector-class\">.format<\/span>(\"<span class=\"hljs-selector-tag\">gif<\/span>\")<span class=\"hljs-selector-class\">.generate<\/span>(\"<span class=\"hljs-selector-tag\">selected_image<\/span><span class=\"hljs-selector-class\">.jpg<\/span>\")\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>All we had to do was set the desired format to be a <code>gif<\/code>.<\/p>\n<h2>Cloudinary Transformation and Delivery capabilities<\/h2>\n<p>Cloudinary enables you to easily transform your images on-the-fly to any required format, style and dimension, and also optimizes images to have the minimal file size for an improved user experience and for saving bandwidth. You can do this by implementing dynamic image transformation and delivery URLs for accessing the images. You can change the required transformations at any time and all transformed images will be created on-demand (lazily) and delivered to your users through a fast CDN with optimized caching.<\/p>\n<p>Cloudinary\u2019s image management service supports the following image transformation and delivery capabilities:<\/p>\n<ul>\n<li>\n<a href=\"https:\/\/cloudinary.com\/documentation\/image_transformations#delivering_images_using_dynamic_urls\">Deliver images<\/a> using dynamic Cloudinary URLs<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/documentation\/image_transformations#embedding_images_in_web_pages\">Embed images<\/a> in web pages<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/documentation\/image_transformations#resizing_and_cropping_images\">Resize<\/a> image dimensions and crop to match your graphic design<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/documentation\/image_transformations#face_detection_based_transformations\">Detect faces<\/a> in images for automatic cropping, resizing, overlay placement and using visual effects<\/li>\n<li>Convert between <a href=\"https:\/\/cloudinary.com\/documentation\/image_transformations#image_format_support\">image formats<\/a>\n<\/li>\n<li>Adjust <a href=\"https:\/\/cloudinary.com\/documentation\/image_transformations#adjusting_image_quality\">image quality<\/a>\n<\/li>\n<li>Modify the image <a href=\"https:\/\/cloudinary.com\/documentation\/image_transformations#modify_image_shape_and_style\">shape and style<\/a>\n<\/li>\n<li>Apply <a href=\"https:\/\/cloudinary.com\/documentation\/image_transformations#applying_image_effects_and_filters\">effects<\/a> to images<\/li>\n<li>Add <a href=\"https:\/\/cloudinary.com\/documentation\/image_transformations#image_and_text_overlays\">image and text overlays<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/documentation\/image_transformations#chained_transformations\">Chain transformations<\/a> together<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/documentation\/image_transformations#named_transformations\">Name<\/a> custom transformations<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/documentation\/image_transformations#optimizing_images\">Optimize images<\/a>\n<\/li>\n<li>Deliver <a href=\"https:\/\/cloudinary.com\/documentation\/image_transformations#delivering_responsive_images\">responsive images<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/documentation\/image_transformations#fetching_images_from_remote_locations\">Fetch images<\/a> from remote locations<\/li>\n<li>Control <a href=\"https:\/\/cloudinary.com\/documentation\/image_transformations#control_access_to_images\">access to your images<\/a>\n<\/li>\n<li>Use <a href=\"https:\/\/cloudinary.com\/documentation\/image_transformations#advanced_url_delivery_options\">advanced URL delivery options<\/a>\n<\/li>\n<li>Create <a href=\"https:\/\/cloudinary.com\/documentation\/image_transformations#creating_images_from_pdf_files\">images from PDF files<\/a>\n<\/li>\n<li>Manage <a href=\"https:\/\/cloudinary.com\/documentation\/image_transformations#managing_animated_gifs\">animated GIFs<\/a>\n<\/li>\n<li>Add <a href=\"https:\/\/cloudinary.com\/documentation\/image_transformations#flags_for_controlling_transformations\">flags<\/a> to control transformation behavior<\/li>\n<li>Apply transformations only if a specified <a href=\"https:\/\/cloudinary.com\/documentation\/image_transformations#conditional_transformations\">condition<\/a> is met<\/li>\n<li>Use <a href=\"https:\/\/cloudinary.com\/documentation\/image_transformations#using_arithmetic_expressions\">arithmetic expressions<\/a> to adjust the value of numeric parameters or user-defined variables<\/li>\n<li>Define and use <a href=\"https:\/\/cloudinary.com\/documentation\/image_transformations#using_user_defined_variables\">user-defined variables<\/a> in your transformations\nThese features were also listed with their respective links to provide you the flexibility to read further on your own.<\/li>\n<\/ul>\n<h2>Conclusion<\/h2>\n<p>Cloudinary is a cloud-based service that provides an end-to-end image and video management solution. The Android SDK provides simple, yet comprehensive <a href=\"https:\/\/cloudinary.com\/blog\/automating_file_upload_and_sharing\">file upload<\/a>, administration, transformation, optimization, and delivery capabilities. These can be implemented using code that integrates seamlessly with your existing Android application. You can leverage these awesome capabilities and deliver amazing media solutions to your subscribers and have them thank you later.\n<a href=\"https:\/\/github.com\/christiannwamba\/cl-whatsapp-clone\">DEMO<\/a><\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":41,"featured_media":21664,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[333,134,165,202,227,263],"class_list":["post-21663","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-android","tag-guest-post","tag-image-transformation","tag-mobile","tag-performance-optimization","tag-sdk"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.6 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Build a WhatsApp Clone with Automatic Image Optimization<\/title>\n<meta name=\"description\" content=\"Easily build a WhatsApp clone with image transformation and optimization\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cloudinary.com\/blog\/impressed_by_whatsapp_tech_build_a_whatsapp_clone_with_image_manipulation_and_optimization\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Build a WhatsApp Clone with Automatic Image Optimization\" \/>\n<meta property=\"og:description\" content=\"Easily build a WhatsApp clone with image transformation and optimization\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/impressed_by_whatsapp_tech_build_a_whatsapp_clone_with_image_manipulation_and_optimization\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-01-22T18:19:32+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-06-01T17:18:48+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1649723642\/Web_Assets\/blog\/Android_WhatsApp_Clone_Part2_2000x1100_v2\/Android_WhatsApp_Clone_Part2_2000x1100_v2-jpg?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"1540\" \/>\n\t<meta property=\"og:image:height\" content=\"847\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"NewsArticle\",\"@id\":\"https:\/\/cloudinary.com\/blog\/impressed_by_whatsapp_tech_build_a_whatsapp_clone_with_image_manipulation_and_optimization#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/impressed_by_whatsapp_tech_build_a_whatsapp_clone_with_image_manipulation_and_optimization\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Build a WhatsApp Clone with Automatic Image Optimization\",\"datePublished\":\"2018-01-22T18:19:32+00:00\",\"dateModified\":\"2024-06-01T17:18:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/impressed_by_whatsapp_tech_build_a_whatsapp_clone_with_image_manipulation_and_optimization\"},\"wordCount\":8,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/impressed_by_whatsapp_tech_build_a_whatsapp_clone_with_image_manipulation_and_optimization#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723642\/Web_Assets\/blog\/Android_WhatsApp_Clone_Part2_2000x1100_v2\/Android_WhatsApp_Clone_Part2_2000x1100_v2.jpg?_i=AA\",\"keywords\":[\"Android\",\"Guest Post\",\"Image Transformation\",\"Mobile\",\"Performance Optimization\",\"SDK\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2018\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/impressed_by_whatsapp_tech_build_a_whatsapp_clone_with_image_manipulation_and_optimization\",\"url\":\"https:\/\/cloudinary.com\/blog\/impressed_by_whatsapp_tech_build_a_whatsapp_clone_with_image_manipulation_and_optimization\",\"name\":\"Build a WhatsApp Clone with Automatic Image Optimization\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/impressed_by_whatsapp_tech_build_a_whatsapp_clone_with_image_manipulation_and_optimization#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/impressed_by_whatsapp_tech_build_a_whatsapp_clone_with_image_manipulation_and_optimization#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723642\/Web_Assets\/blog\/Android_WhatsApp_Clone_Part2_2000x1100_v2\/Android_WhatsApp_Clone_Part2_2000x1100_v2.jpg?_i=AA\",\"datePublished\":\"2018-01-22T18:19:32+00:00\",\"dateModified\":\"2024-06-01T17:18:48+00:00\",\"description\":\"Easily build a WhatsApp clone with image transformation and optimization\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/impressed_by_whatsapp_tech_build_a_whatsapp_clone_with_image_manipulation_and_optimization#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/impressed_by_whatsapp_tech_build_a_whatsapp_clone_with_image_manipulation_and_optimization\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/impressed_by_whatsapp_tech_build_a_whatsapp_clone_with_image_manipulation_and_optimization#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723642\/Web_Assets\/blog\/Android_WhatsApp_Clone_Part2_2000x1100_v2\/Android_WhatsApp_Clone_Part2_2000x1100_v2.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723642\/Web_Assets\/blog\/Android_WhatsApp_Clone_Part2_2000x1100_v2\/Android_WhatsApp_Clone_Part2_2000x1100_v2.jpg?_i=AA\",\"width\":1540,\"height\":847},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/impressed_by_whatsapp_tech_build_a_whatsapp_clone_with_image_manipulation_and_optimization#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Build a WhatsApp Clone with Automatic Image Optimization\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"name\":\"Cloudinary Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cloudinary.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\",\"name\":\"Cloudinary Blog\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"width\":312,\"height\":60,\"caption\":\"Cloudinary Blog\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Build a WhatsApp Clone with Automatic Image Optimization","description":"Easily build a WhatsApp clone with image transformation and optimization","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cloudinary.com\/blog\/impressed_by_whatsapp_tech_build_a_whatsapp_clone_with_image_manipulation_and_optimization","og_locale":"en_US","og_type":"article","og_title":"Build a WhatsApp Clone with Automatic Image Optimization","og_description":"Easily build a WhatsApp clone with image transformation and optimization","og_url":"https:\/\/cloudinary.com\/blog\/impressed_by_whatsapp_tech_build_a_whatsapp_clone_with_image_manipulation_and_optimization","og_site_name":"Cloudinary Blog","article_published_time":"2018-01-22T18:19:32+00:00","article_modified_time":"2024-06-01T17:18:48+00:00","og_image":[{"width":1540,"height":847,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1649723642\/Web_Assets\/blog\/Android_WhatsApp_Clone_Part2_2000x1100_v2\/Android_WhatsApp_Clone_Part2_2000x1100_v2-jpg?_i=AA","type":"image\/jpeg"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/impressed_by_whatsapp_tech_build_a_whatsapp_clone_with_image_manipulation_and_optimization#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/impressed_by_whatsapp_tech_build_a_whatsapp_clone_with_image_manipulation_and_optimization"},"author":{"name":"","@id":""},"headline":"Build a WhatsApp Clone with Automatic Image Optimization","datePublished":"2018-01-22T18:19:32+00:00","dateModified":"2024-06-01T17:18:48+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/impressed_by_whatsapp_tech_build_a_whatsapp_clone_with_image_manipulation_and_optimization"},"wordCount":8,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/impressed_by_whatsapp_tech_build_a_whatsapp_clone_with_image_manipulation_and_optimization#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723642\/Web_Assets\/blog\/Android_WhatsApp_Clone_Part2_2000x1100_v2\/Android_WhatsApp_Clone_Part2_2000x1100_v2.jpg?_i=AA","keywords":["Android","Guest Post","Image Transformation","Mobile","Performance Optimization","SDK"],"inLanguage":"en-US","copyrightYear":"2018","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/impressed_by_whatsapp_tech_build_a_whatsapp_clone_with_image_manipulation_and_optimization","url":"https:\/\/cloudinary.com\/blog\/impressed_by_whatsapp_tech_build_a_whatsapp_clone_with_image_manipulation_and_optimization","name":"Build a WhatsApp Clone with Automatic Image Optimization","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/impressed_by_whatsapp_tech_build_a_whatsapp_clone_with_image_manipulation_and_optimization#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/impressed_by_whatsapp_tech_build_a_whatsapp_clone_with_image_manipulation_and_optimization#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723642\/Web_Assets\/blog\/Android_WhatsApp_Clone_Part2_2000x1100_v2\/Android_WhatsApp_Clone_Part2_2000x1100_v2.jpg?_i=AA","datePublished":"2018-01-22T18:19:32+00:00","dateModified":"2024-06-01T17:18:48+00:00","description":"Easily build a WhatsApp clone with image transformation and optimization","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/impressed_by_whatsapp_tech_build_a_whatsapp_clone_with_image_manipulation_and_optimization#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/impressed_by_whatsapp_tech_build_a_whatsapp_clone_with_image_manipulation_and_optimization"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/impressed_by_whatsapp_tech_build_a_whatsapp_clone_with_image_manipulation_and_optimization#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723642\/Web_Assets\/blog\/Android_WhatsApp_Clone_Part2_2000x1100_v2\/Android_WhatsApp_Clone_Part2_2000x1100_v2.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723642\/Web_Assets\/blog\/Android_WhatsApp_Clone_Part2_2000x1100_v2\/Android_WhatsApp_Clone_Part2_2000x1100_v2.jpg?_i=AA","width":1540,"height":847},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/impressed_by_whatsapp_tech_build_a_whatsapp_clone_with_image_manipulation_and_optimization#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Build a WhatsApp Clone with Automatic Image Optimization"}]},{"@type":"WebSite","@id":"https:\/\/cloudinary.com\/blog\/#website","url":"https:\/\/cloudinary.com\/blog\/","name":"Cloudinary Blog","description":"","publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cloudinary.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cloudinary.com\/blog\/#organization","name":"Cloudinary Blog","url":"https:\/\/cloudinary.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","width":312,"height":60,"caption":"Cloudinary Blog"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":""}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723642\/Web_Assets\/blog\/Android_WhatsApp_Clone_Part2_2000x1100_v2\/Android_WhatsApp_Clone_Part2_2000x1100_v2.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21663","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/users\/41"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=21663"}],"version-history":[{"count":1,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21663\/revisions"}],"predecessor-version":[{"id":34204,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21663\/revisions\/34204"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/21664"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=21663"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=21663"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=21663"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}