{"id":28435,"date":"2022-03-24T19:42:39","date_gmt":"2022-03-24T19:42:39","guid":{"rendered":"http:\/\/Automatically-Generate-Social-Images-for-Blog-Posts"},"modified":"2023-07-09T03:24:46","modified_gmt":"2023-07-09T10:24:46","slug":"automatically-generate-social-images-for-blog-posts","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/guest_post\/automatically-generate-social-images-for-blog-posts\/","title":{"rendered":"Generate Social Images for Blog Posts"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><p>Have you shared a link to a post on any social platform and been unhappy with the image displayed because it didn\u2019t fit the article title or your brand? In this article, we will build an application that dynamically generates <a href=\"https:\/\/cloudinary.com\/glossary\/social-media-asset-management\">social images<\/a> based on a template.<\/p>\n<p>You can use an image or a banner that suits your brand as a base image, and with Cloudinary, we can dynamically layer texts on that image to generate custom social images for blog posts.<\/p>\n<p>Here is a link to the demo on <a href=\"https:\/\/codesandbox.io\/s\/social-images-for-blog-posts-c9ns4\">CodeSandbox<\/a>.<\/p>\n<\/div>\n\n\n  <div class=\"wp-block-cloudinary-code-sandbox \">\n    <iframe\n      src=\"https:\/\/codesandbox.io\/embed\/social-images-for-blog-posts-c9ns4?theme=dark&amp;codemirror=1&amp;highlights=&amp;editorsize=50&amp;fontsize=14&amp;expanddevtools=0&amp;hidedevtools=0&amp;eslint=0&amp;forcerefresh=0&amp;hidenavigation=0&amp;initialpath=%2F&amp;module=&amp;moduleview=0&amp;previewwindow=&amp;view=&amp;runonclick=1\"\n      height=\"500\"\n      style=\"width: 100%;\"\n      title=\"social-images-for-blog-posts-c9ns4\"\n      loading=\"lazy\"\n      allow=\"accelerometer; ambient-light-sensor; camera; encrypted-media; geolocation; gyroscope; hid; microphone; midi; payment; usb; vr; xr-spatial-tracking\"\n      sandbox=\"allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts\"\n    ><\/iframe>\n  <\/div>\n\n\n<div class=\"wp-block-cloudinary-markdown \"><h2>Create a Design Layout<\/h2>\n<p>We need a banner that will serve as the base image. You can choose a random background if you don\u2019t have one that suits your brand or design a custom layout using any design tool (Figma, Adobe XD, Sketch, e.tc).<\/p>\n<p>For this tutorial, I will be using this simple layout I designed with Figma.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-marketing-res.cloudinary.com\/image\/upload\/c_limit,w_2000\/f_auto\/q_auto\/media_jams\/s_FAF1C10590C0D42926F34DDD863E3D0F9062045AED447D2EC5B0F7E9384D0FD8_1636718778524_CleanShot+2021-11-12+at+16.06.012x.png\" alt=\"\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"2000\" height=\"999\"\/><\/p>\n<h2>Cloudinary Setup<\/h2>\n<p>First, we need to upload our image to Cloudinary. If you are new to Cloudinary, you can <a href=\"https:\/\/cloudinary.com\/users\/register\/free\">sign up here<\/a> for a free account. After successful signup, see <a href=\"https:\/\/cloudinary.com\/documentation\/media_library_upload_tutorial\">this documentation<\/a> for options on uploading assets to your Cloudinary <a href=\"https:\/\/cloudinary.com\/console\/media_library\">Media Library<\/a>. Upload the image you want to use as your base image and assign it a name you can easily remember.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-marketing-res.cloudinary.com\/image\/upload\/c_limit,w_2000\/f_auto\/q_auto\/media_jams\/s_FAF1C10590C0D42926F34DDD863E3D0F9062045AED447D2EC5B0F7E9384D0FD8_1636718578915_CleanShot+2021-11-12+at+16.02.142x.png\" alt=\"\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"2000\" height=\"620\"\/><\/p>\n<h2>Project Setup<\/h2>\n<p>Open your terminal and run the following command to create a React application in a folder named <code>social-media-card<\/code>.<\/p>\n<pre class=\"js-syntax-highlighted\"><span><code class=\"hljs shcb-wrap-lines\">    npx create-react-app social-image-template\n<\/code><\/span><\/pre>\n<p>Next, let\u2019s install the dependencies we will need for this project. Run the following command to install them.<\/p>\n<pre class=\"js-syntax-highlighted\"><span><code class=\"hljs shcb-wrap-lines\">    npm install cloudinary-react --save\n<\/code><\/span><\/pre>\n<p>The command above installs the <a href=\"https:\/\/cloudinary.com\/documentation\/react2_quick_start\">Cloudinary\u2019s React SDK<\/a>.<\/p>\n<p>After the installation, and add the following to the <code>App.js<\/code> file inside your <code>src<\/code> folder:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">\n    <span class=\"hljs-keyword\">import<\/span> <span class=\"hljs-string\">\".\/App.css\"<\/span>;\n    <span class=\"hljs-keyword\">import<\/span> React, { useState } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"react\"<\/span>;\n    <span class=\"hljs-keyword\">import<\/span> { Image, Transformation } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"cloudinary-react\"<\/span>;\n    \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">PostTitle<\/span>(<span class=\"hljs-params\">{ title, onTitleChange }<\/span>) <\/span>{\n      <span class=\"hljs-keyword\">return<\/span> (\n        <span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">label<\/span> <span class=\"hljs-attr\">htmlFor<\/span>=<span class=\"hljs-string\">\"blog title\"<\/span>&gt;<\/span>Blog Title:<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">label<\/span>&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span>\n            <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">{title}<\/span>\n            <span class=\"hljs-attr\">onChange<\/span>=<span class=\"hljs-string\">{onTitleChange}<\/span>\n            <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"text\"<\/span>\n            <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\">\"Enter a post title\"<\/span>\n          \/&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span><\/span>\n      );\n    }\n    \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">Author<\/span>(<span class=\"hljs-params\">{ authorName, onNameChange }<\/span>) <\/span>{\n      <span class=\"hljs-keyword\">return<\/span> (\n        <span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">label<\/span>&gt;<\/span>Author:<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">label<\/span>&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span>\n            <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">{authorName}<\/span>\n            <span class=\"hljs-attr\">onChange<\/span>=<span class=\"hljs-string\">{onNameChange}<\/span>\n            <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"text\"<\/span>\n            <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\">\"Enter author's name\"<\/span>\n          \/&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span><\/span>\n      );\n    }\n    \n    <span class=\"hljs-keyword\">const<\/span> App = <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> {\n      <span class=\"hljs-keyword\">const<\/span> &#91;blogInput, setBlogInput] = useState(<span class=\"hljs-string\">\"\"<\/span>);\n      <span class=\"hljs-keyword\">const<\/span> &#91;authorName, setAuthorName] = useState(<span class=\"hljs-string\">\"\"<\/span>);\n      <span class=\"hljs-keyword\">return<\/span> (\n        <span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">className<\/span>=<span class=\"hljs-string\">\"wrapper\"<\/span>&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">className<\/span>=<span class=\"hljs-string\">\"container\"<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">className<\/span>=<span class=\"hljs-string\">\"form\"<\/span>&gt;<\/span>\n              <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">form<\/span>&gt;<\/span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">PostTitle<\/span>\n                  <span class=\"hljs-attr\">title<\/span>=<span class=\"hljs-string\">{blogInput}<\/span>\n                  <span class=\"hljs-attr\">onTitleChange<\/span>=<span class=\"hljs-string\">{(e)<\/span> =&gt;<\/span> setBlogInput(e.target.value)}\n                \/&gt;\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Author<\/span>\n                  <span class=\"hljs-attr\">authorName<\/span>=<span class=\"hljs-string\">{authorName}<\/span>\n                  <span class=\"hljs-attr\">onNameChange<\/span>=<span class=\"hljs-string\">{(e)<\/span> =&gt;<\/span> setAuthorName(e.target.value)}\n                \/&gt;\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">className<\/span>=<span class=\"hljs-string\">\"button-wrapper\"<\/span>&gt;<\/span>\n                  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span>&gt;<\/span>Generate Social Image<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n                <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n              <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">form<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span><\/span>\n      );\n    };\n    \n    <span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> App;\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><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<p>In the code above, we\u2019re importing two components, <code>Image<\/code> and <code>Transformation<\/code>, from the <code>cloudinary-react<\/code> library we installed.<\/p>\n<p>We then defined three components. The first two components return a <code>label<\/code> and an <code>input<\/code>. They will render a UI layer for interactively modifying the post title and the author\u2019s name fields, respectively.<\/p>\n<p>We also have our <code>App<\/code> component, where we defined some state variables which manage the states of our <code>PostTitle<\/code> and <code>Author<\/code> components. Our <code>App<\/code> component renders a <code>form<\/code> containing the <code>PostTitle<\/code> and <code>Author<\/code> components, and they both receive as props their states and mechanisms for updating them.<\/p>\n<p>Add the following styles to your <code>App.css<\/code> file:<\/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-class\">.form-control<\/span> {\n      <span class=\"hljs-attribute\">display<\/span>: flex;\n      <span class=\"hljs-attribute\">align-items<\/span>: center;\n    }\n    <span class=\"hljs-selector-tag\">label<\/span> {\n      <span class=\"hljs-attribute\">font-weight<\/span>: <span class=\"hljs-number\">700<\/span>;\n      <span class=\"hljs-attribute\">font-size<\/span>: <span class=\"hljs-number\">18px<\/span>;\n      <span class=\"hljs-attribute\">width<\/span>: <span class=\"hljs-number\">100px<\/span>;\n      <span class=\"hljs-attribute\">display<\/span>: block;\n    }\n    <span class=\"hljs-selector-tag\">input<\/span> {\n      <span class=\"hljs-attribute\">width<\/span>: <span class=\"hljs-number\">70%<\/span>;\n      <span class=\"hljs-attribute\">border<\/span>: <span class=\"hljs-number\">1px<\/span> solid <span class=\"hljs-number\">#ccc<\/span>;\n      <span class=\"hljs-attribute\">border-radius<\/span>: <span class=\"hljs-number\">4px<\/span>;\n      <span class=\"hljs-attribute\">padding<\/span>: <span class=\"hljs-number\">12px<\/span> <span class=\"hljs-number\">20px<\/span>;\n      <span class=\"hljs-attribute\">margin<\/span>: <span class=\"hljs-number\">5px<\/span> <span class=\"hljs-number\">0<\/span>;\n    }\n    <span class=\"hljs-selector-tag\">button<\/span> {\n      <span class=\"hljs-attribute\">width<\/span>: <span class=\"hljs-number\">50%<\/span>;\n      <span class=\"hljs-attribute\">background-color<\/span>: <span class=\"hljs-number\">#38a6d2<\/span>;\n      <span class=\"hljs-attribute\">color<\/span>: white;\n      <span class=\"hljs-attribute\">font-weight<\/span>: <span class=\"hljs-number\">600<\/span>;\n      <span class=\"hljs-attribute\">font-size<\/span>: <span class=\"hljs-number\">20px<\/span>;\n      <span class=\"hljs-attribute\">padding<\/span>: <span class=\"hljs-number\">15px<\/span>;\n      <span class=\"hljs-attribute\">border<\/span>: none;\n      <span class=\"hljs-attribute\">border-radius<\/span>: <span class=\"hljs-number\">4px<\/span>;\n      <span class=\"hljs-attribute\">cursor<\/span>: pointer;\n    }\n    <span class=\"hljs-selector-tag\">button<\/span><span class=\"hljs-selector-pseudo\">:hover<\/span> {\n      <span class=\"hljs-attribute\">background-color<\/span>: <span class=\"hljs-number\">#37963c<\/span>;\n    }\n    <span class=\"hljs-selector-class\">.button-wrapper<\/span> {\n      <span class=\"hljs-attribute\">display<\/span>: flex;\n      <span class=\"hljs-attribute\">justify-content<\/span>: center;\n      <span class=\"hljs-attribute\">margin-top<\/span>: <span class=\"hljs-number\">20px<\/span>;\n    }\n    <span class=\"hljs-selector-class\">.form<\/span> {\n      <span class=\"hljs-attribute\">margin<\/span>: <span class=\"hljs-number\">50px<\/span>;\n      <span class=\"hljs-attribute\">background-color<\/span>: <span class=\"hljs-number\">#e0e6e9<\/span>;\n      <span class=\"hljs-attribute\">padding<\/span>: <span class=\"hljs-number\">30px<\/span>;\n      <span class=\"hljs-attribute\">border-radius<\/span>: <span class=\"hljs-number\">10px<\/span>;\n    }\n    <span class=\"hljs-selector-class\">.container<\/span> {\n      <span class=\"hljs-attribute\">width<\/span>: <span class=\"hljs-number\">100%<\/span>;\n    }\n    <span class=\"hljs-selector-class\">.wrapper<\/span> {\n      <span class=\"hljs-attribute\">display<\/span>: flex;\n      <span class=\"hljs-attribute\">justify-content<\/span>: center;\n    }\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>Navigate to <code>localhost:3000<\/code> in your browser, and you should see the following:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-marketing-res.cloudinary.com\/image\/upload\/c_limit,w_2000\/f_auto\/q_auto\/media_jams\/s_FAF1C10590C0D42926F34DDD863E3D0F9062045AED447D2EC5B0F7E9384D0FD8_1636991653956_CleanShot+2021-11-15+at+19.53.552x.png\" alt=\"\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"2000\" height=\"432\"\/><\/p>\n<p>So far, the idea is that when a user fills out the form and clicks the button, we want to generate an image based on the user\u2019s information. Let\u2019s add the logic for that.<\/p>\n<p>Add the following to your <code>App.js<\/code> file:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">\n    import <span class=\"hljs-string\">\".\/App.css\"<\/span>;\n    import React, { useState } from <span class=\"hljs-string\">\"react\"<\/span>;\n    import { Image, Transformation } from <span class=\"hljs-string\">\"cloudinary-react\"<\/span>;\n    \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">PostTitle<\/span><span class=\"hljs-params\">({ title, onTitleChange })<\/span> <\/span>{\n      <span class=\"hljs-keyword\">return<\/span> (\n         <span class=\"hljs-comment\">\/\/...<\/span>\n      );\n    }\n    \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">Author<\/span><span class=\"hljs-params\">({ authorName, onNameChange })<\/span> <\/span>{\n      <span class=\"hljs-keyword\">return<\/span> (\n        <span class=\"hljs-comment\">\/\/...<\/span>\n      );\n    }\n    \n    <span class=\"hljs-keyword\">const<\/span> App = () =&gt; {\n      <span class=\"hljs-keyword\">const<\/span> &#91;blogInput, setBlogInput] = useState(<span class=\"hljs-string\">\"\"<\/span>);\n      <span class=\"hljs-keyword\">const<\/span> &#91;authorName, setAuthorName] = useState(<span class=\"hljs-string\">\"\"<\/span>);\n      {<span class=\"hljs-comment\">\/* Add the following *\/<\/span>}\n      <span class=\"hljs-keyword\">const<\/span> &#91;showBanner, setShowBanner] = useState(<span class=\"hljs-keyword\">false<\/span>);\n      <span class=\"hljs-keyword\">const<\/span> displayImage = (e) =&gt; {\n        e.preventDefault();\n        <span class=\"hljs-keyword\">if<\/span> (blogInput &amp;&amp; authorName) {\n          setShowBanner(<span class=\"hljs-keyword\">true<\/span>);\n        }\n      };\n    \n      <span class=\"hljs-keyword\">return<\/span> (\n            <span class=\"hljs-comment\">\/\/...<\/span>\n            &lt;div className=<span class=\"hljs-string\">\"form\"<\/span>&gt;\n              {<span class=\"hljs-comment\">\/* Add the onSubmit handler to the form element*\/<\/span>}\n              &lt;form onSubmit={displayImage}&gt;\n                &lt;PostTitle\n                  <span class=\"hljs-comment\">\/\/...<\/span>\n                \/&gt;\n                &lt;Author\n                 <span class=\"hljs-comment\">\/\/...<\/span>\n                \/&gt;\n                &lt;div className=<span class=\"hljs-string\">\"button-wrapper\"<\/span>&gt;\n                  &lt;button&gt;Generate Social Image&lt;\/button&gt;\n                &lt;\/div&gt;\n              &lt;\/form&gt;\n            &lt;\/div&gt;\n            {<span class=\"hljs-comment\">\/* Add the following *\/<\/span>}\n            {showBanner &amp;&amp; (\n              &lt;div className=<span class=\"hljs-string\">\"display\"<\/span>&gt;\n                &lt;Image publicId={<span class=\"hljs-string\">\"social-card\"<\/span>} cloudName=<span class=\"hljs-string\">\"ifeomaimoh\"<\/span>&gt;\n                  &lt;Transformation width=<span class=\"hljs-string\">\"800\"<\/span> height=<span class=\"hljs-string\">\"500\"<\/span> crop=<span class=\"hljs-string\">\"fit\"<\/span> \/&gt;\n                &lt;\/Image&gt;\n              &lt;\/div&gt;\n            )}\n          &lt;\/div&gt;\n        &lt;\/div&gt;\n      );\n    };\n    export <span class=\"hljs-keyword\">default<\/span> App;\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>In the App component, we added a state variable, <code>showBanner<\/code>, which stores a boolean. We can then check the value to determine whether to show the banner or not.<\/p>\n<p>We then created a function called <code>displayImage<\/code> which, when called, flips the value of <code>showBanner<\/code>. The function is also passed as an event handler to the <code>onSubmit<\/code> event for the <code>form<\/code> element.<\/p>\n<p>We\u2019re using the state variable <code>showBanner<\/code> to conditionally render our image with the Cloudinary <code>Image<\/code> component we imported.<\/p>\n<p>To use Cloudinary React components, you need to configure your <code>cloudName<\/code>. We\u2019re specifying that directly to the <code>Image<\/code> component with the <code>publicID<\/code> of the image we uploaded to Cloudinary.<\/p>\n<p>The <code>Image<\/code>  component currently accepts a <code>Transformation<\/code> element that allows us to define the width and height of our image. We defined a maximum width of 500 pixels for our image template using the <code>fit<\/code> crop mode in the <code>Transformation<\/code> element.<\/p>\n<h2>Add Text Overlay<\/h2>\n<p>Next, we need to add <code>Transformation<\/code>  elements to the <code>Image<\/code> component that adds and positions text overlays on our image when a user fills the form.<\/p>\n<p>Add the following to the <code>Image<\/code> component in your <code>App.js<\/code> file:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">\n      &lt;Transformation\n        overlay={{\n          <span class=\"hljs-attr\">fontFamily<\/span>: <span class=\"hljs-string\">\"Arial\"<\/span>,\n          <span class=\"hljs-attr\">fontSize<\/span>: <span class=\"hljs-number\">40<\/span>,\n          <span class=\"hljs-attr\">fontWeight<\/span>: <span class=\"hljs-string\">\"bold\"<\/span>,\n          <span class=\"hljs-attr\">letter_spacing<\/span>: <span class=\"hljs-number\">4<\/span>,\n          <span class=\"hljs-attr\">text<\/span>: <span class=\"hljs-string\">`<span class=\"hljs-subst\">${blogInput}<\/span>`<\/span>,\n        }}\n        color=<span class=\"hljs-string\">\"#FFFFFF\"<\/span>\n        width=<span class=\"hljs-string\">\"500\"<\/span>\n        height=<span class=\"hljs-string\">\"200\"<\/span>\n        crop=<span class=\"hljs-string\">\"fit\"<\/span>\n      \/&gt;\n      <span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Transformation<\/span> <span class=\"hljs-attr\">flags<\/span>=<span class=\"hljs-string\">\"layer_apply\"<\/span> <span class=\"hljs-attr\">gravity<\/span>=<span class=\"hljs-string\">\"west\"<\/span> <span class=\"hljs-attr\">x<\/span>=<span class=\"hljs-string\">\"40\"<\/span> \/&gt;<\/span><\/span>\n      <span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Transformation<\/span>\n        <span class=\"hljs-attr\">overlay<\/span>=<span class=\"hljs-string\">{{<\/span>\n          <span class=\"hljs-attr\">fontFamily:<\/span> \"<span class=\"hljs-attr\">Arial<\/span>\",\n          <span class=\"hljs-attr\">fontSize:<\/span> <span class=\"hljs-attr\">25<\/span>,\n          <span class=\"hljs-attr\">text:<\/span> `<span class=\"hljs-attr\">Author:<\/span> ${<span class=\"hljs-attr\">authorName<\/span>}`,\n          <span class=\"hljs-attr\">textAlign:<\/span> \"\",\n          <span class=\"hljs-attr\">fontWeight:<\/span> \"<span class=\"hljs-attr\">bold<\/span>\",\n        }}\n        <span class=\"hljs-attr\">color<\/span>=<span class=\"hljs-string\">\"#FFFFFF\"<\/span>\n        <span class=\"hljs-attr\">width<\/span>=<span class=\"hljs-string\">\"100\"<\/span>\n        <span class=\"hljs-attr\">height<\/span>=<span class=\"hljs-string\">\"100\"<\/span>\n        <span class=\"hljs-attr\">crop<\/span>=<span class=\"hljs-string\">\"fit\"<\/span>\n      \/&gt;<\/span><\/span>\n      <span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Transformation<\/span> <span class=\"hljs-attr\">flags<\/span>=<span class=\"hljs-string\">\"layer_apply\"<\/span> <span class=\"hljs-attr\">gravity<\/span>=<span class=\"hljs-string\">\"south_west\"<\/span> <span class=\"hljs-attr\">x<\/span>=<span class=\"hljs-string\">\"40\"<\/span> <span class=\"hljs-attr\">y<\/span>=<span class=\"hljs-string\">\"50\"<\/span> \/&gt;<\/span><\/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\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>We are adding two text overlays to our image template for the post title and the author name. We\u2019re using the <code>text<\/code> property of the <code>overlay<\/code> transformation prop to dynamically add the post title and the author name to the image, depending on the information provided by the user.<\/p>\n<p>For the post title, we defined a maximum width of 500px  and added the <code>fit<\/code> crop mode so that if we have a multiline text, Cloudinary automatically wraps the text <a href=\"https:\/\/cloudinary.com\/glossary\/content-scraping\">content<\/a> to the new line.<\/p>\n<p>The default text position when using the gravity parameter is <code>center<\/code>. For both overlays, we\u2019re controlling the positions of the text overlays the base image by combining the <code>gravity<\/code> parameter with the X and Y coordinates.<\/p>\n<p>Now you can head over to your browser and fill in the form, then click the <strong>Generate social image<\/strong> button to create an image with the text overlay you entered in the form.<\/p>\n<p>Here\u2019s what mine looks like:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-marketing-res.cloudinary.com\/image\/upload\/c_limit,w_2000\/f_auto\/q_auto\/media_jams\/s_FAF1C10590C0D42926F34DDD863E3D0F9062045AED447D2EC5B0F7E9384D0FD8_1636991579436_CleanShot+2021-11-15+at+19.52.442x.png\" alt=\"\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"2000\" height=\"885\"\/><\/p>\n<p>Find the project here on <a href=\"https:\/\/github.com\/ifeoma-imoh\/social-media-image-template\">GitHub<\/a>.<\/p>\n<h2>Summary<\/h2>\n<p>In this post, we saw how to generate social images for blog posts using Cloudinary\u2019s cloud-based media-management solution to layer texts on an image dynamically. You can further customize this image by adding your logo or a picture of yourself.<\/p>\n<!--- Perfect, flawless build! The only note I would suggest is to add your additional styles from your App.css file for the reader's product to mirror the one shown in the blog! Thank you so much for your content! -->\n<p><strong>Resources you may find useful:<\/strong><\/p>\n<ul>\n<li>\n<a href=\"https:\/\/cloudinary.com\/documentation\/layers\">Cloudinary documentation on layer placement<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/documentation\/image_upload_api_reference\">Cloudinary upload API reference<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/documentation\/react_integration\">Cloudinary React SDK<\/a>\n<\/li>\n<\/ul>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":41,"featured_media":28436,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[134,370,246,371],"class_list":["post-28435","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-guest-post","tag-image","tag-react","tag-under-review"],"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>Generate Social Images for Blog Posts<\/title>\n<meta name=\"description\" content=\"In this article, we will build an application that dynamically generates social images. Using Cloudinary, we will dynamically layer texts on a base image or a banner that suits your brand to generate custom social images for your blog posts.\" \/>\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\/guest_post\/automatically-generate-social-images-for-blog-posts\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Generate Social Images for Blog Posts\" \/>\n<meta property=\"og:description\" content=\"In this article, we will build an application that dynamically generates social images. Using Cloudinary, we will dynamically layer texts on a base image or a banner that suits your brand to generate custom social images for your blog posts.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/guest_post\/automatically-generate-social-images-for-blog-posts\/\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2022-03-24T19:42:39+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-07-09T10:24:46+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1681924434\/Web_Assets\/blog\/5634b31ff3608b03d0f57891e254302a58448b33-1280x720-1_2843660c9d\/5634b31ff3608b03d0f57891e254302a58448b33-1280x720-1_2843660c9d-png?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"1280\" \/>\n\t<meta property=\"og:image:height\" content=\"720\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\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\/guest_post\/automatically-generate-social-images-for-blog-posts\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/automatically-generate-social-images-for-blog-posts\/\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Generate Social Images for Blog Posts\",\"datePublished\":\"2022-03-24T19:42:39+00:00\",\"dateModified\":\"2023-07-09T10:24:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/automatically-generate-social-images-for-blog-posts\/\"},\"wordCount\":6,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/automatically-generate-social-images-for-blog-posts\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681924434\/Web_Assets\/blog\/5634b31ff3608b03d0f57891e254302a58448b33-1280x720-1_2843660c9d\/5634b31ff3608b03d0f57891e254302a58448b33-1280x720-1_2843660c9d.png?_i=AA\",\"keywords\":[\"Guest Post\",\"Image\",\"React\",\"Under Review\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2022\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/automatically-generate-social-images-for-blog-posts\/\",\"url\":\"https:\/\/cloudinary.com\/blog\/guest_post\/automatically-generate-social-images-for-blog-posts\/\",\"name\":\"Generate Social Images for Blog Posts\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/automatically-generate-social-images-for-blog-posts\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/automatically-generate-social-images-for-blog-posts\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681924434\/Web_Assets\/blog\/5634b31ff3608b03d0f57891e254302a58448b33-1280x720-1_2843660c9d\/5634b31ff3608b03d0f57891e254302a58448b33-1280x720-1_2843660c9d.png?_i=AA\",\"datePublished\":\"2022-03-24T19:42:39+00:00\",\"dateModified\":\"2023-07-09T10:24:46+00:00\",\"description\":\"In this article, we will build an application that dynamically generates social images. Using Cloudinary, we will dynamically layer texts on a base image or a banner that suits your brand to generate custom social images for your blog posts.\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/automatically-generate-social-images-for-blog-posts\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/guest_post\/automatically-generate-social-images-for-blog-posts\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/automatically-generate-social-images-for-blog-posts\/#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681924434\/Web_Assets\/blog\/5634b31ff3608b03d0f57891e254302a58448b33-1280x720-1_2843660c9d\/5634b31ff3608b03d0f57891e254302a58448b33-1280x720-1_2843660c9d.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681924434\/Web_Assets\/blog\/5634b31ff3608b03d0f57891e254302a58448b33-1280x720-1_2843660c9d\/5634b31ff3608b03d0f57891e254302a58448b33-1280x720-1_2843660c9d.png?_i=AA\",\"width\":1280,\"height\":720},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/automatically-generate-social-images-for-blog-posts\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Generate Social Images for Blog Posts\"}]},{\"@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":"Generate Social Images for Blog Posts","description":"In this article, we will build an application that dynamically generates social images. Using Cloudinary, we will dynamically layer texts on a base image or a banner that suits your brand to generate custom social images for your blog posts.","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\/guest_post\/automatically-generate-social-images-for-blog-posts\/","og_locale":"en_US","og_type":"article","og_title":"Generate Social Images for Blog Posts","og_description":"In this article, we will build an application that dynamically generates social images. Using Cloudinary, we will dynamically layer texts on a base image or a banner that suits your brand to generate custom social images for your blog posts.","og_url":"https:\/\/cloudinary.com\/blog\/guest_post\/automatically-generate-social-images-for-blog-posts\/","og_site_name":"Cloudinary Blog","article_published_time":"2022-03-24T19:42:39+00:00","article_modified_time":"2023-07-09T10:24:46+00:00","og_image":[{"width":1280,"height":720,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1681924434\/Web_Assets\/blog\/5634b31ff3608b03d0f57891e254302a58448b33-1280x720-1_2843660c9d\/5634b31ff3608b03d0f57891e254302a58448b33-1280x720-1_2843660c9d-png?_i=AA","type":"image\/png"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/automatically-generate-social-images-for-blog-posts\/#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/automatically-generate-social-images-for-blog-posts\/"},"author":{"name":"","@id":""},"headline":"Generate Social Images for Blog Posts","datePublished":"2022-03-24T19:42:39+00:00","dateModified":"2023-07-09T10:24:46+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/automatically-generate-social-images-for-blog-posts\/"},"wordCount":6,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/automatically-generate-social-images-for-blog-posts\/#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681924434\/Web_Assets\/blog\/5634b31ff3608b03d0f57891e254302a58448b33-1280x720-1_2843660c9d\/5634b31ff3608b03d0f57891e254302a58448b33-1280x720-1_2843660c9d.png?_i=AA","keywords":["Guest Post","Image","React","Under Review"],"inLanguage":"en-US","copyrightYear":"2022","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/automatically-generate-social-images-for-blog-posts\/","url":"https:\/\/cloudinary.com\/blog\/guest_post\/automatically-generate-social-images-for-blog-posts\/","name":"Generate Social Images for Blog Posts","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/automatically-generate-social-images-for-blog-posts\/#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/automatically-generate-social-images-for-blog-posts\/#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681924434\/Web_Assets\/blog\/5634b31ff3608b03d0f57891e254302a58448b33-1280x720-1_2843660c9d\/5634b31ff3608b03d0f57891e254302a58448b33-1280x720-1_2843660c9d.png?_i=AA","datePublished":"2022-03-24T19:42:39+00:00","dateModified":"2023-07-09T10:24:46+00:00","description":"In this article, we will build an application that dynamically generates social images. Using Cloudinary, we will dynamically layer texts on a base image or a banner that suits your brand to generate custom social images for your blog posts.","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/automatically-generate-social-images-for-blog-posts\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/guest_post\/automatically-generate-social-images-for-blog-posts\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/automatically-generate-social-images-for-blog-posts\/#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681924434\/Web_Assets\/blog\/5634b31ff3608b03d0f57891e254302a58448b33-1280x720-1_2843660c9d\/5634b31ff3608b03d0f57891e254302a58448b33-1280x720-1_2843660c9d.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681924434\/Web_Assets\/blog\/5634b31ff3608b03d0f57891e254302a58448b33-1280x720-1_2843660c9d\/5634b31ff3608b03d0f57891e254302a58448b33-1280x720-1_2843660c9d.png?_i=AA","width":1280,"height":720},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/automatically-generate-social-images-for-blog-posts\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Generate Social Images for Blog Posts"}]},{"@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\/v1681924434\/Web_Assets\/blog\/5634b31ff3608b03d0f57891e254302a58448b33-1280x720-1_2843660c9d\/5634b31ff3608b03d0f57891e254302a58448b33-1280x720-1_2843660c9d.png?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/28435","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=28435"}],"version-history":[{"count":4,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/28435\/revisions"}],"predecessor-version":[{"id":30286,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/28435\/revisions\/30286"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/28436"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=28435"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=28435"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=28435"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}