{"id":21172,"date":"2012-12-20T12:39:33","date_gmt":"2012-12-20T12:39:33","guid":{"rendered":"http:\/\/advanced_image_transformations_in_the_cloud_with_carrierwave_cloudinary"},"modified":"2024-09-07T12:01:15","modified_gmt":"2024-09-07T19:01:15","slug":"advanced_image_transformations_in_the_cloud_with_carrierwave_cloudinary","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/advanced_image_transformations_in_the_cloud_with_carrierwave_cloudinary","title":{"rendered":"Advanced image transformations in the cloud with CarrierWave &amp; Cloudinary"},"content":{"rendered":"<div>In <a href=\"https:\/\/cloudinary.com\/blog\/ruby_on_rails_image_uploads_with_carrierwave_and_cloudinary\" target=\"_blank\" rel=\"noopener\">a previous post<\/a> we&#8217;ve shown how you can easily manage your <strong>Ruby on Rails<\/strong> image uploads with <strong>CarrierWave<\/strong> and <strong>Cloudinary<\/strong>. Many of our Rails readers found this very useful, as it depicted a powerful image management solution that is trivial to integrate &#8211; use the popular CarrierWave GEM together with the Cloudinary GEM, add a single &#8216;include&#8217; line to your code and that&#8217;s it. All your images are automatically uploaded to the cloud and delivered through a fast CDN. Better yet, all image transformations defined in your CarrierWave uploader class are generated in the cloud by Cloudinary. No need to install and setup any image processing library (goodbye RMagick, ImageMagick, GraphicsMagick, MiniMagick, etc.). You also don&#8217;t need to worry any more about CPU power, storage space, image syncing between multiple servers, backup and scale.<\/div>\n<div><\/div>\n<div>In this post, we wanted to show how you can use all of Cloudinary&#8217;s additional cool image management and transformation\u00a0features together with CarrierWave &#8211; apply effects and filters, face detection based cropping, <a href=\"https:\/\/cloudinary.com\/tools\/compress-jpg\">JPG<\/a> quality modification, adding watermarks and more.<\/div>\n<div><\/div>\n<h3>Custom and dynamic transformations<\/h3>\n<div>Cloudinary&#8217;s plugin for CarrierWave supports all of CarrierWave&#8217;s standard resize and cropping capabilities. In addition, you can apply any custom transformation supported by Cloudinary by using the <span style=\"color: #bb0000;\"><strong>cloudinary_transformation<\/strong><\/span> method. You can call <strong><span style=\"color: #bb0000;\">cloudinary_transformation<\/span><\/strong> in conjunction with the standard resize and crop methods.<\/div>\n<div><\/div>\n<div>The following uploader class shows a common usage example with custom transformations:<\/div>\n<pre>class PictureUploader &lt; CarrierWave::Uploader::Base\n  include Cloudinary::CarrierWave\n\n  # Generate a 164x164 JPG of 80% quality\u00a0\n  version :simple do\n    process :resize_to_fill =&gt; [164, 164, :fill]\n    process :convert =&gt; 'jpg'\n    cloudinary_transformation :quality =&gt; 80\n  end\n\n  # Generate a 100x150 face-detection based thumbnail,\n  # round corners with a 20-pixel radius and increase brightness by 30%.\n  version :bright_face do\n    cloudinary_transformation :effect =&gt; \"brightness:30\", :radius =&gt; 20,\n        :width =&gt; 100, :height =&gt; 150, :crop =&gt; :thumb, :gravity =&gt; :face\n  end\n\nend\n<\/pre>\n<div><\/div>\n<h3>Chained Transformations<\/h3>\n<div>You can take this further by applying <strong>chained transformations<\/strong>. Any set of transformations can be applied as an incoming transformation while uploading or as part of the different versions that are generated lazily or eagerly during upload.<\/div>\n<div><\/div>\n<div>The following uploader class includes chained transformations applied using the transformation parameter of the <span style=\"color: #bb0000;\"><strong>cloudinary_transformation<\/strong><\/span> method.<\/div>\n<pre>class PictureUploader &lt; CarrierWave::Uploader::Base      \n  include Cloudinary::CarrierWave\n \n  # Apply an incoming chained transformation: limit image to 1000x1200 and \n  # add a 30-pixel watermark 5 pixels from the south east corner.   \n  cloudinary_transformation :transformation =&gt; [\n      {:width =&gt; 1000, :height =&gt; 1200, :crop =&gt; :limit}, \n      {:overlay =&gt; \"my_watermark\", :width =&gt; 30, :gravity =&gt; :south_east, \n       :x =&gt; 5, :y =&gt; 5}\n    ]        \n  \n  # Eagerly transform image to 150x200 with a sepia effect applied and then\n  # rotate the resulting image by 10 degrees. \n  version :rotated do\n    eager\n    cloudinary_transformation :transformation =&gt; [\n        {:width =&gt; 150, :height =&gt; 200, :crop =&gt; :fill, :effect =&gt; \"sepia\"}, \n        {:angle =&gt; 10}\n      ]\n  end\nend\n<\/pre>\n<div>Some websites have a graphic design that forces them to display the same images in many different dimensions. Formally defining multiple uploader&#8217;s versions might become cumbersome. In this case, you can still utilize CarrierWave while leveraging Cloudinary&#8217;s dynamic transformations by applying any desired transformation while building your view.<\/div>\n<div><\/div>\n<div>Any version can be generated dynamically from your view without depending on CarrierWave versions. Simply use the <span style=\"color: #bb0000;\"><strong>full_public_id<\/strong><\/span> attribute with <span style=\"color: #bb0000;\"><strong>cl_image_tag<\/strong><\/span> to build cloud-based transformation URLs for the uploaded images attached to your model.<\/div>\n<pre>cl_image_tag(post.picture.full_public_id, :format =&gt; \"jpg\", \n             :width =&gt; 100, :height =&gt; 200,\u00a0 :crop =&gt; :crop, \n             :x =&gt; 20, :y =&gt; 30, :radius =&gt; 10)\n<\/pre>\n<h3>Custom coordinates based cropping<\/h3>\n<div>If you allow your users to manually select their images cropping areas, we recommend you keep these crop coordinates persistently in your model. This way you&#8217;ll be able to crop the original images differently in the future.<\/div>\n<div><\/div>\n<div>The following uploader class fetches the custom coordinates from attributes of the model object. The <strong>custom_crop<\/strong> method in this example simply returns a Hash of additional Cloudinary transformation parameters to apply.<\/div>\n<pre>class PictureUploader &lt; CarrierWave::Uploader::Base  \n  include Cloudinary::CarrierWave  \n \n  version :full do    \n    process :convert =&gt; 'jpg'\n    process :custom_crop\n  end    \n  \n  def custom_crop      \n    return :x =&gt; model.crop_x, :y =&gt; model.crop_y, \n      :width =&gt; model.crop_width, :height =&gt; model.crop_height, :crop =&gt; :crop      \n  end\nend\n<\/pre>\n<div>If you want to store only the cropped version of the image, you can use the <strong>incoming transformation<\/strong> of Cloudinary&#8217;s upload API. This way only the cropped image is stored in the cloud. You can then use additional transformations to resize the cropped image.<\/div>\n<div><\/div>\n<div>The following example calls process <strong>:custom_crop<\/strong> in the class itself, instead of in a &#8216;version&#8217;, while the custom-coordinates are kept as transient attributes on the model (defined with <em>attr<\/em>) instead of storing them persistently.<\/div>\n<pre>class PictureUploader &lt; CarrierWave::Uploader::Base  \n  include Cloudinary::CarrierWave  \n \n  process :custom_crop\n \n  version :thumbnail do    \n    process :convert =&gt; 'jpg'\n    resize_to_fill(120, 150, 'North')\n  end    \n  \n  def custom_crop      \n    return :x =&gt; model.crop_x, :y =&gt; model.crop_y, \n      :width =&gt; model.crop_width, :height =&gt; model.crop_height, :crop =&gt; :crop      \n  end\nend\n<\/pre>\n<h3>Private images and eager transformations<\/h3>\n<div>Cloudinary supports uploading private images to the cloud. These images won&#8217;t be accessible to your users. See <a href=\"https:\/\/cloudinary.com\/blog\/how_to_quickly_build_a_stock_photo_site_using_cloudinary\" target=\"_blank\" rel=\"noopener\">our blog post<\/a> for more details. Together with the <strong>Strict Transformations<\/strong> feature, you can specify that only certain transformations (e.g., low resolution thumbnails, watermarked images) are available for your users.<\/div>\n<div><\/div>\n<div>For uploading images as private, simply add &#8216;<span style=\"color: #bb0000;\"><strong>make_private<\/strong><\/span>&#8216; to your uploader class. This will also make all generated delivery URLs to access the private images correctly.<\/div>\n<div><\/div>\n<div>The versions you define in your uploader class should use only named or dynamic transformations marked as Allowed. Alternatively, you can tell Cloudinary to eagerly generate all transformed versions while uploading. This way you can keep all your transformations as strict (disallowed).<\/div>\n<div><\/div>\n<div>The following uploader class shows how to use private images and eager transformations:<\/div>\n<pre>class PictureUploader &lt; CarrierWave::Uploader::Base      \n  include Cloudinary::CarrierWave\n  make_private\n  \n  # Generate a 164x164 JPG of 80% quality \n  version :simple do\n    process :resize_to_fill =&gt; [164, 164, :fill]\n    process :convert =&gt; 'jpg'\n    cloudinary_transformation :quality =&gt; 80\n    eager\n  end\n  \n  version :thumbnail do\n    resize_to_fit(50, 50)\n    eager\n  end\n \nend\n<\/pre>\n<h3>Summary<\/h3>\n<div>If you are a Ruby on Rails developer, you should definitely consider using CarrierWave (if you haven&#8217;t done so already). Together with Cloudinary you can reach a powerful image management, transformation\u00a0and delivery solution with almost zero efforts and code changes.<\/div>\n<div><\/div>\n<div>If you&#8217;re looking for a CarrierWave alternative, make sure you check out the brand new <strong>Attachinary<\/strong> Ruby GEM. Attachinary provides a modern image attachment solution to your Rails application while employing Cloudinary for cloud-based storage, image transformations and delivery. <a href=\"https:\/\/cloudinary.com\/blog\/attachinary_a_modern_attachments_solution_for_ruby_on_rails\" target=\"_blank\" rel=\"noopener\">Read more about it here<\/a>.<\/div>\n<div><\/div>\n<div>We&#8217;ve mentioned &#8216;Ruby on Rails&#8217; quite a lot, though both CarrierWave and the Cloudinary plugin support a standard <strong>ActiveRecord<\/strong> model as well as a <strong>Mongoid<\/strong> model. In addition, some of our customers use this solution for their non-Rails frameworks, such as <strong>Sinatra<\/strong>.<\/div>\n<div><\/div>\n<div>For more details, <a href=\"https:\/\/cloudinary.com\/documentation\/rails_integration\" target=\"_blank\" rel=\"noopener\">see our documentation<\/a>.<\/div>\n<div><\/div>\n<div>If you have additional thoughts on how we can make your life easier when managing images and attachments in your Rails applications, make sure you <a href=\"https:\/\/cloudinary.com\/contact\" target=\"_blank\" rel=\"noopener\">tell us about them<\/a>. If you don&#8217;t have a Cloudinary account already, you can <a href=\"https:\/\/cloudinary.com\/users\/register\/free\" target=\"_blank\" rel=\"noopener\">sign up<\/a> for a free account in seconds.<\/div>\n","protected":false},"excerpt":{"rendered":"<p>In a previous post we&#8217;ve shown how you can easily manage your Ruby on Rails image uploads with CarrierWave and Cloudinary. Many of our Rails readers found this very useful, as it depicted a powerful image management solution that is trivial to integrate &#8211; use the popular CarrierWave GEM together with the Cloudinary GEM, add [&hellip;]<\/p>\n","protected":false},"author":41,"featured_media":24075,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[257],"class_list":["post-21172","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-ruby-on-rails"],"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>Advanced image transformations in the cloud with CarrierWave &amp; Cloudinary<\/title>\n<meta name=\"description\" content=\"In a previous post we&#039;ve shown how you can easily manage your Ruby on Rails image uploads with CarrierWave and Cloudinary. Many of our Rails readers found\" \/>\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\/advanced_image_transformations_in_the_cloud_with_carrierwave_cloudinary\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Advanced image transformations in the cloud with CarrierWave &amp; Cloudinary\" \/>\n<meta property=\"og:description\" content=\"In a previous post we&#039;ve shown how you can easily manage your Ruby on Rails image uploads with CarrierWave and Cloudinary. Many of our Rails readers found\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/advanced_image_transformations_in_the_cloud_with_carrierwave_cloudinary\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2012-12-20T12:39:33+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-09-07T19:01:15+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1650586081\/82_advanced-image-transformations-carrierwave\/82_advanced-image-transformations-carrierwave-png?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"2000\" \/>\n\t<meta property=\"og:image:height\" content=\"1100\" \/>\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\/advanced_image_transformations_in_the_cloud_with_carrierwave_cloudinary#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/advanced_image_transformations_in_the_cloud_with_carrierwave_cloudinary\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Advanced image transformations in the cloud with CarrierWave &amp; Cloudinary\",\"datePublished\":\"2012-12-20T12:39:33+00:00\",\"dateModified\":\"2024-09-07T19:01:15+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/advanced_image_transformations_in_the_cloud_with_carrierwave_cloudinary\"},\"wordCount\":870,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/advanced_image_transformations_in_the_cloud_with_carrierwave_cloudinary#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1650586081\/82_advanced-image-transformations-carrierwave\/82_advanced-image-transformations-carrierwave.png?_i=AA\",\"keywords\":[\"Ruby on Rails\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2012\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/advanced_image_transformations_in_the_cloud_with_carrierwave_cloudinary\",\"url\":\"https:\/\/cloudinary.com\/blog\/advanced_image_transformations_in_the_cloud_with_carrierwave_cloudinary\",\"name\":\"Advanced image transformations in the cloud with CarrierWave &amp; Cloudinary\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/advanced_image_transformations_in_the_cloud_with_carrierwave_cloudinary#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/advanced_image_transformations_in_the_cloud_with_carrierwave_cloudinary#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1650586081\/82_advanced-image-transformations-carrierwave\/82_advanced-image-transformations-carrierwave.png?_i=AA\",\"datePublished\":\"2012-12-20T12:39:33+00:00\",\"dateModified\":\"2024-09-07T19:01:15+00:00\",\"description\":\"In a previous post we've shown how you can easily manage your Ruby on Rails image uploads with CarrierWave and Cloudinary. Many of our Rails readers found\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/advanced_image_transformations_in_the_cloud_with_carrierwave_cloudinary#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/advanced_image_transformations_in_the_cloud_with_carrierwave_cloudinary\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/advanced_image_transformations_in_the_cloud_with_carrierwave_cloudinary#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1650586081\/82_advanced-image-transformations-carrierwave\/82_advanced-image-transformations-carrierwave.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1650586081\/82_advanced-image-transformations-carrierwave\/82_advanced-image-transformations-carrierwave.png?_i=AA\",\"width\":2000,\"height\":1100},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/advanced_image_transformations_in_the_cloud_with_carrierwave_cloudinary#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Advanced image transformations in the cloud with CarrierWave &amp; Cloudinary\"}]},{\"@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":"Advanced image transformations in the cloud with CarrierWave &amp; Cloudinary","description":"In a previous post we've shown how you can easily manage your Ruby on Rails image uploads with CarrierWave and Cloudinary. Many of our Rails readers found","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\/advanced_image_transformations_in_the_cloud_with_carrierwave_cloudinary","og_locale":"en_US","og_type":"article","og_title":"Advanced image transformations in the cloud with CarrierWave &amp; Cloudinary","og_description":"In a previous post we've shown how you can easily manage your Ruby on Rails image uploads with CarrierWave and Cloudinary. Many of our Rails readers found","og_url":"https:\/\/cloudinary.com\/blog\/advanced_image_transformations_in_the_cloud_with_carrierwave_cloudinary","og_site_name":"Cloudinary Blog","article_published_time":"2012-12-20T12:39:33+00:00","article_modified_time":"2024-09-07T19:01:15+00:00","og_image":[{"width":2000,"height":1100,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1650586081\/82_advanced-image-transformations-carrierwave\/82_advanced-image-transformations-carrierwave-png?_i=AA","type":"image\/png"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/advanced_image_transformations_in_the_cloud_with_carrierwave_cloudinary#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/advanced_image_transformations_in_the_cloud_with_carrierwave_cloudinary"},"author":{"name":"","@id":""},"headline":"Advanced image transformations in the cloud with CarrierWave &amp; Cloudinary","datePublished":"2012-12-20T12:39:33+00:00","dateModified":"2024-09-07T19:01:15+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/advanced_image_transformations_in_the_cloud_with_carrierwave_cloudinary"},"wordCount":870,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/advanced_image_transformations_in_the_cloud_with_carrierwave_cloudinary#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1650586081\/82_advanced-image-transformations-carrierwave\/82_advanced-image-transformations-carrierwave.png?_i=AA","keywords":["Ruby on Rails"],"inLanguage":"en-US","copyrightYear":"2012","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/advanced_image_transformations_in_the_cloud_with_carrierwave_cloudinary","url":"https:\/\/cloudinary.com\/blog\/advanced_image_transformations_in_the_cloud_with_carrierwave_cloudinary","name":"Advanced image transformations in the cloud with CarrierWave &amp; Cloudinary","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/advanced_image_transformations_in_the_cloud_with_carrierwave_cloudinary#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/advanced_image_transformations_in_the_cloud_with_carrierwave_cloudinary#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1650586081\/82_advanced-image-transformations-carrierwave\/82_advanced-image-transformations-carrierwave.png?_i=AA","datePublished":"2012-12-20T12:39:33+00:00","dateModified":"2024-09-07T19:01:15+00:00","description":"In a previous post we've shown how you can easily manage your Ruby on Rails image uploads with CarrierWave and Cloudinary. Many of our Rails readers found","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/advanced_image_transformations_in_the_cloud_with_carrierwave_cloudinary#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/advanced_image_transformations_in_the_cloud_with_carrierwave_cloudinary"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/advanced_image_transformations_in_the_cloud_with_carrierwave_cloudinary#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1650586081\/82_advanced-image-transformations-carrierwave\/82_advanced-image-transformations-carrierwave.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1650586081\/82_advanced-image-transformations-carrierwave\/82_advanced-image-transformations-carrierwave.png?_i=AA","width":2000,"height":1100},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/advanced_image_transformations_in_the_cloud_with_carrierwave_cloudinary#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Advanced image transformations in the cloud with CarrierWave &amp; Cloudinary"}]},{"@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\/v1650586081\/82_advanced-image-transformations-carrierwave\/82_advanced-image-transformations-carrierwave.png?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21172","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=21172"}],"version-history":[{"count":2,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21172\/revisions"}],"predecessor-version":[{"id":35574,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21172\/revisions\/35574"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/24075"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=21172"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=21172"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=21172"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}