> ## Documentation Index
> Fetch the complete documentation index at: https://cloudinary.com/documentation/llms.txt
> Use this file to discover all available pages before exploring further.

# VIESUS™ Automatic Image Enhancement


[Cloudinary](https://cloudinary.com) is a cloud-based service that provides an end-to-end image management solution including uploads, storage, transformations, optimizations and delivery.

VIESUS™ is a software application developed by Imaging Solutions AG that takes everyday digital camera images and enhances them to look more visually attractive. VIESUS™ first analyses the image data then automatically applies any processing steps as needed: adjusting brightness and color, restoring sharpness, removing noise, correcting for overexposure or underexposure, and more. 
Cloudinary provides an add-on for using VIESUS™'s image enhancement capabilities, fully integrated into Cloudinary's image management and transformation pipeline. With VIESUS™'s image enhancement add-on, you can extend Cloudinary's powerful image transformation and optimization capabilities by automatically enhancing images to their best visual quality.
> **INFO**:
>
> By default, delivery URLs that use this add-on either need to be [signed](#signed_urls) or [eagerly generated](eager_and_incoming_transformations#eager_transformations). You can optionally remove this requirement by selecting this add-on in the **Allow unsigned add-on transformations** section of the **Security** page in the Console Settings.
> (For simplicity, most of the examples on this page show eagerly generated URLs without signatures.)#### Getting started

Before you can use the VIESUS™ Automatic Image Enhancement add-on:

* You must have a Cloudinary account. If you don't already have one, you can [sign up](https://cloudinary.com/users/register_free) for a free account. 

* Register for the add-on: make sure you're logged in to your account and then go to the [Add-ons](https://console.cloudinary.com/app/settings/addons) page. For more information about add-on registrations, see [Registering for add-ons](cloudinary_add_ons#registering_for_add_ons).

* Keep in mind that many of the examples on this page use our SDKs. For SDK installation and configuration details, see the relevant [SDK](cloudinary_sdks) guide.
  
* If you're new to Cloudinary, you may want to take a look at the [Developer Kickstart](dev_kickstart) for a hands-on, step-by-step introduction to a variety of features.

## Enhancing images

Take a look at the following photo of a beach that was uploaded to Cloudinary's `demo` product environment. The original photo has dark coloring and looks like it was taken on an overcast day, in contrast to the minimal cloud covering visible in the image.

![Original beach image](https://res.cloudinary.com/demo/image/upload/beach.jpg "thumb: w_500,c_scale")

```nodejs
cloudinary.image("beach.jpg")
```

```react
new CloudinaryImage("beach.jpg");
```

```vue
new CloudinaryImage("beach.jpg");
```

```angular
new CloudinaryImage("beach.jpg");
```

```js
new CloudinaryImage("beach.jpg");
```

```python
CloudinaryImage("beach.jpg").image()
```

```php
(new ImageTag('beach.jpg'));
```

```java
cloudinary.url().transformation(new Transformation().imageTag("beach.jpg");
```

```ruby
cl_image_tag("beach.jpg")
```

```csharp
cloudinary.Api.UrlImgUp.BuildImageTag("beach.jpg")
```

```dart
cloudinary.image('beach.jpg').transformation(Transformation());
```

```swift
imageView.cldSetImage(cloudinary.createUrl().generate("beach.jpg")!, cloudinary: cloudinary)
```

```android
MediaManager.get().url().transformation(new Transformation().generate("beach.jpg");
```

```flutter
cloudinary.image('beach.jpg').transformation(Transformation());
```

```kotlin
cloudinary.image {
	publicId("beach.jpg") 
}.generate()
```

```jquery
$.cloudinary.image("beach.jpg")
```

```react_native
new CloudinaryImage("beach.jpg");
```

Setting the `effect` transformation parameter to `viesus_correct` (or `e_viesus_correct` for URLs) tells Cloudinary to dynamically enhance the image to the best visual quality using the VIESUS™ add-on. The brightness is increased and the colors appear more vivid, while the photo now looks like it was taken on a bright sunny day. The generated image is stored in the cloud and delivered optimized via a fast CDN.

![Auto corrected beach image](https://res.cloudinary.com/demo/image/upload/e_viesus_correct/beach.jpg "thumb: w_500,c_scale,")

```nodejs
cloudinary.image("beach.jpg", {effect: "viesus_correct"})
```

```react
new CloudinaryImage("beach.jpg").adjust(viesusCorrect());
```

```vue
new CloudinaryImage("beach.jpg").adjust(viesusCorrect());
```

```angular
new CloudinaryImage("beach.jpg").adjust(viesusCorrect());
```

```js
new CloudinaryImage("beach.jpg").adjust(viesusCorrect());
```

```python
CloudinaryImage("beach.jpg").image(effect="viesus_correct")
```

```php
(new ImageTag('beach.jpg'))
	->adjust(Adjust::viesusCorrect());
```

```java
cloudinary.url().transformation(new Transformation().effect("viesus_correct")).imageTag("beach.jpg");
```

```ruby
cl_image_tag("beach.jpg", effect: "viesus_correct")
```

```csharp
cloudinary.Api.UrlImgUp.Transform(new Transformation().Effect("viesus_correct")).BuildImageTag("beach.jpg")
```

```dart
cloudinary.image('beach.jpg').transformation(Transformation()
	.adjust(Adjust.viesusCorrect()));
```

```swift
imageView.cldSetImage(cloudinary.createUrl().setTransformation(CLDTransformation().setEffect("viesus_correct")).generate("beach.jpg")!, cloudinary: cloudinary)
```

```android
MediaManager.get().url().transformation(new Transformation().effect("viesus_correct")).generate("beach.jpg");
```

```flutter
cloudinary.image('beach.jpg').transformation(Transformation()
	.adjust(Adjust.viesusCorrect()));
```

```kotlin
cloudinary.image {
	publicId("beach.jpg")
	 adjust(Adjust.viesusCorrect()) 
}.generate()
```

```jquery
$.cloudinary.image("beach.jpg", {effect: "viesus_correct"})
```

```react_native
new CloudinaryImage("beach.jpg").adjust(viesusCorrect());
```

Furthermore, you can include an additional value to configure the enhancement as follows:

* `e_viesus_correct:no_redeye` - enhances the image without correcting for red eye.
* `e_viesus_correct:skin_saturation` - enhances the image and also applies saturation to the skin tones in the image. You can define a value for the saturation by appending an underscore and then the value (e.g., `e_viesus_correct:skin_saturation_20` to boost saturation of skin tones by 20). A positive value boosts saturation and a negative value reduces the saturation. Default value: 50. Range: -100 to 100

## Signed URLs

Cloudinary's dynamic image transformation URLs are powerful tools for agile web and mobile development. However, due to the potential costs of end users accessing dynamic URLs including the `viesus_correct` parameter, image transformation add-on URLs are required (by default) to be signed using Cloudinary's authenticated API or alternatively, you can [eagerly generate](#eager_transformations) the required derived images. 

A signed Cloudinary image URL is a dynamic URL that will have its signature validated before making it available for view. To create a signed Cloudinary URL using an SDK, set the `sign_url` parameter to true when building a URL or creating an image tag. 
The following code example generates an image tag for the `beach.jpg` image with a signed Cloudinary URL, while visually enhancing the image by setting the `effect` transformation to `viesus_correct` and scaling the size to a width of 400 pixels:

![Code for generating viesus enhanced signed URL](https://res.cloudinary.com/demo/image/upload/s--58dQFhjW--/c_scale,e_viesus_correct,w_400/beach.jpg "with_url: false")

```nodejs
cloudinary.image("beach.jpg", {effect: "viesus_correct", width: 400, crop: "scale", sign_url: true})
```

```react
new CloudinaryImage("beach.jpg")
  .resize(scale().width(400))
  .adjust(viesusCorrect())
  .setSignature("58dQFhjW");
```

```vue
new CloudinaryImage("beach.jpg")
  .resize(scale().width(400))
  .adjust(viesusCorrect())
  .setSignature("58dQFhjW");
```

```angular
new CloudinaryImage("beach.jpg")
  .resize(scale().width(400))
  .adjust(viesusCorrect())
  .setSignature("58dQFhjW");
```

```js
new CloudinaryImage("beach.jpg")
  .resize(scale().width(400))
  .adjust(viesusCorrect())
  .setSignature("58dQFhjW");
```

```python
CloudinaryImage("beach.jpg").image(effect="viesus_correct", width=400, crop="scale", sign_url=True)
```

```php
(new ImageTag('beach.jpg'))
	->resize(Resize::scale()->width(400))
	->adjust(Adjust::viesusCorrect())
	->sign();
```

```java
cloudinary.url().transformation(new Transformation().effect("viesus_correct").width(400).crop("scale")).signed(true).imageTag("beach.jpg");
```

```ruby
cl_image_tag("beach.jpg", effect: "viesus_correct", width: 400, crop: "scale", sign_url: true)
```

```csharp
cloudinary.Api.UrlImgUp.Transform(new Transformation().Effect("viesus_correct").Width(400).Crop("scale")).Signed(true).BuildImageTag("beach.jpg")
```

```dart
cloudinary.image('beach.jpg').transformation(Transformation()
	.resize(Resize.scale().width(400))
	.adjust(Adjust.viesusCorrect())
	.setSignature("58dQFhjW"));
```

```swift
imageView.cldSetImage(cloudinary.createUrl().setTransformation(CLDTransformation().setEffect("viesus_correct").setWidth(400).setCrop("scale")).generate("beach.jpg", signUrl: true)!, cloudinary: cloudinary)
```

```android
MediaManager.get().url().transformation(new Transformation().effect("viesus_correct").width(400).crop("scale")).signed(true).generate("beach.jpg");
```

```flutter
cloudinary.image('beach.jpg').transformation(Transformation()
	.resize(Resize.scale().width(400))
	.adjust(Adjust.viesusCorrect())
	.setSignature("58dQFhjW"));
```

```kotlin
cloudinary.image {
	publicId("beach.jpg")
	 resize(Resize.scale() { width(400) })
	 adjust(Adjust.viesusCorrect())
	 signature() 
}.generate()
```

```jquery
$.cloudinary.image("beach.jpg", {effect: "viesus_correct", width: 400, crop: "scale"})
```

```react_native
new CloudinaryImage("beach.jpg")
  .resize(scale().width(400))
  .adjust(viesusCorrect())
  .setSignature("58dQFhjW");
```

The generated Cloudinary URL shown below includes a signature component (`s--58dQFhjW--`). Only URLs with a valid signature that matches the requested image transformation will be approved for on-the-fly image transformation and delivery.

[Sign URL of corrected image](https://res.cloudinary.com/demo/image/upload/s--58dQFhjW--/c_scale,e_viesus_correct,w_400/beach.jpg "with_code: false")

For more details on signed URLs, see [Signed delivery URLs](control_access_to_media#enforcement_mechanism_signed_delivery_urls).

> **NOTE**:
>
> You can optionally remove the signed URL default requirement for a particular add-on by selecting it in the **Allow unsigned add-on transformations** section of the **Security** page in the Console Settings.

## Eager transformations

As an alternative to signed URLs, you can eagerly generate all converted images during upload. By using Cloudinary's authenticated API for requesting VIESUS™ image enhancement, accessing the generated images thereafter can be done using regular unsigned Cloudinary URLs.

The following code sample uploads a local JPG file to Cloudinary, assigns a public ID of "beach" and eagerly generates a 400 pixel wide image that is visually enhanced using the VIESUS™ add-on (as in the signed-URL example above):

```multi
|ruby
Cloudinary::Uploader.upload("local_file.jpg", 
  public_id: "beach",
  eager: { effect: "viesus_correct", crop: "scale", width: 400 })
  
|php_2
$cloudinary->uploadApi()->upload("local_file.jpg", [
    "public_id" = "beach",
    "eager" => 
      ["effect" => "viesus_correct", "crop" => "scale", "width" => 400]]);

|python
cloudinary.uploader.upload("local_file.jpg",
  public_id = "beach",  
  eager = { "effect": "viesus_correct", "crop": "scale", "width": 400 })
      
|nodejs
cloudinary.v2.uploader
.upload("local_file.jpg", 
  { public_id: "beach", 
    eager: { effect: "viesus_correct", crop: "scale", width: 400 }})
.then(result=>console.log(result)); 

|java
cloudinary.uploader().upload("local_file.jpg", 
  ObjectUtils.asMap(
    "public_id", "beach", 
    "eager", Arrays.asList(
      new EagerTransformation().effect("viesus_correct").crop("scale").width(400))));

|csharp
var uploadParams = new ImageUploadParams(){
  File = new FileDescription(@"local_file.jpg"),
  PublicId = "beach",
  EagerTransforms = new List<Transformation>(){
   new EagerTransformation().Effect("viesus_correct").Crop("scale").Width(400)}};
var uploadResult = cloudinary.Upload(uploadParams); 

|go
resp, err := cld.Upload.Upload(ctx, "local_file.jpg", uploader.UploadParams{
		PublicID: "beach",
		Eager:    "e_viesus_correct/c_scale,w_400"})

|android
MediaManager.get().upload("local_file.jpg")
  .option("public_id", "beach")
  .option("eager", Arrays.asList(
      new EagerTransformation().effect("viesus_correct").crop("scale").width(400))).dispatch(); 

|swift
let eager = CLDEagerTransformation()
  .setWidth(400)
  .setEffect("viesus_correct")
  .setCrop("scale")
let params = CLDUploadRequestParams()
  .setEager([eager])
  .setPublicId("beach")
var mySig = MyFunction(params)  // your own function that returns a signature generated on your backend
params.setSignature(CLDSignature(signature: mySig.signature, timestamp: mySig.timestamp))
let request = cloudinary.createUploader().signedUpload(url: "local_file.jpg", params: params)

|curl
curl https://api.cloudinary.com/v1_1/demo/image/upload -X POST -F 'file=@/path/to/local_file.jpg' -F 'public_id=beach' -F 'eager=e_viesus_correct,c_scale,w_400' -F 'timestamp=173719931' -F 'api_key=436464676' -F 'signature=a781d61f86a6f818af'

|cli
cld uploader upload "local_file.jpg" public_id="beach" eager='{"effect": "viesus_correct", "crop": "scale", "width": 400}'
```

> **TIP**:
>
> You can use **upload presets** to centrally define a set of upload options including add-on operations to apply, instead of specifying them in each upload call. You can define multiple upload presets, and apply different presets in different upload scenarios. You can create new upload presets in the **Upload Presets** page of the [Console Settings](https://console.cloudinary.com/app/settings/upload/presets) or using the [upload_presets](admin_api#upload_presets) Admin API method. From the **Upload** page of the Console Settings, you can also select default upload presets to use for image, video, and raw API uploads (respectively) as well as default presets for image, video, and raw uploads performed via the Media Library UI. 
> **Learn more**: [Upload presets](upload_presets)

The resized and visually enhanced image is available for delivery immediately when the upload request completes. Therefore, the visually enhanced version can be accessed using an unsigned URL as in the example below:

![Correct beach photo](https://res.cloudinary.com/demo/image/upload/c_scale,e_viesus_correct,w_400/beach.jpg)

```nodejs
cloudinary.image("beach.jpg", {effect: "viesus_correct", width: 400, crop: "scale"})
```

```react
new CloudinaryImage("beach.jpg")
  .resize(scale().width(400))
  .adjust(viesusCorrect());
```

```vue
new CloudinaryImage("beach.jpg")
  .resize(scale().width(400))
  .adjust(viesusCorrect());
```

```angular
new CloudinaryImage("beach.jpg")
  .resize(scale().width(400))
  .adjust(viesusCorrect());
```

```js
new CloudinaryImage("beach.jpg")
  .resize(scale().width(400))
  .adjust(viesusCorrect());
```

```python
CloudinaryImage("beach.jpg").image(effect="viesus_correct", width=400, crop="scale")
```

```php
(new ImageTag('beach.jpg'))
	->resize(Resize::scale()->width(400))
	->adjust(Adjust::viesusCorrect());
```

```java
cloudinary.url().transformation(new Transformation().effect("viesus_correct").width(400).crop("scale")).imageTag("beach.jpg");
```

```ruby
cl_image_tag("beach.jpg", effect: "viesus_correct", width: 400, crop: "scale")
```

```csharp
cloudinary.Api.UrlImgUp.Transform(new Transformation().Effect("viesus_correct").Width(400).Crop("scale")).BuildImageTag("beach.jpg")
```

```dart
cloudinary.image('beach.jpg').transformation(Transformation()
	.resize(Resize.scale().width(400))
	.adjust(Adjust.viesusCorrect()));
```

```swift
imageView.cldSetImage(cloudinary.createUrl().setTransformation(CLDTransformation().setEffect("viesus_correct").setWidth(400).setCrop("scale")).generate("beach.jpg")!, cloudinary: cloudinary)
```

```android
MediaManager.get().url().transformation(new Transformation().effect("viesus_correct").width(400).crop("scale")).generate("beach.jpg");
```

```flutter
cloudinary.image('beach.jpg').transformation(Transformation()
	.resize(Resize.scale().width(400))
	.adjust(Adjust.viesusCorrect()));
```

```kotlin
cloudinary.image {
	publicId("beach.jpg")
	 resize(Resize.scale() { width(400) })
	 adjust(Adjust.viesusCorrect()) 
}.generate()
```

```jquery
$.cloudinary.image("beach.jpg", {effect: "viesus_correct", width: 400, crop: "scale"})
```

```react_native
new CloudinaryImage("beach.jpg")
  .resize(scale().width(400))
  .adjust(viesusCorrect());
```

## Further image transformations

Visual enhancement using the VIESUS™ add-on can be mixed with any of Cloudinary's rich set of image transformation capabilities.
For example, the following code first crops the uploaded `beach` image to a width of 1000 pixels with south gravity, while visually enhancing the derived image with VIESUS™ and rounding its corners. Then another uploaded image named viesus_logo is added as an overlay. The overlay is resized to a width of 100 pixels, positioned 10 pixels from the top right corner of the containing image and is made 50% semi transparent. Finally, the image is scaled down to a width of 600 pixels:

![beach.jpg cropped to 1000 pixels with rounded corners, enhanced with viesus and a logo overlay](https://res.cloudinary.com/demo/image/upload/s--pVcU_PBg--/c_crop,g_south,w_1000/r_20/e_viesus_correct/l_viesus_logo/c_scale,w_100/o_50/fl_layer_apply,g_north_east,x_10,y_10/c_scale,w_600/beach.jpg)

```nodejs
cloudinary.image("beach.jpg", {sign_url: true, transformation: [
  {gravity: "south", width: 1000, crop: "crop"},
  {radius: 20},
  {effect: "viesus_correct"},
  {overlay: "viesus_logo"},
  {width: 100, crop: "scale"},
  {opacity: 50},
  {flags: "layer_apply", gravity: "north_east", x: 10, y: 10},
  {width: 600, crop: "scale"}
  ]})
```

```react
new CloudinaryImage("beach.jpg")
  .resize(
    crop()
      .width(1000)
      .gravity(compass("south"))
  )
  .roundCorners(byRadius(20))
  .adjust(viesusCorrect())
  .overlay(
    source(
      image("viesus_logo").transformation(
        new Transformation().resize(scale().width(100)).adjust(opacity(50))
      )
    ).position(
      new Position()
        .gravity(compass("north_east"))
        .offsetX(10)
        .offsetY(10)
    )
  )
  .resize(scale().width(600))
  .setSignature("pVcU_PBg");
```

```vue
new CloudinaryImage("beach.jpg")
  .resize(
    crop()
      .width(1000)
      .gravity(compass("south"))
  )
  .roundCorners(byRadius(20))
  .adjust(viesusCorrect())
  .overlay(
    source(
      image("viesus_logo").transformation(
        new Transformation().resize(scale().width(100)).adjust(opacity(50))
      )
    ).position(
      new Position()
        .gravity(compass("north_east"))
        .offsetX(10)
        .offsetY(10)
    )
  )
  .resize(scale().width(600))
  .setSignature("pVcU_PBg");
```

```angular
new CloudinaryImage("beach.jpg")
  .resize(
    crop()
      .width(1000)
      .gravity(compass("south"))
  )
  .roundCorners(byRadius(20))
  .adjust(viesusCorrect())
  .overlay(
    source(
      image("viesus_logo").transformation(
        new Transformation().resize(scale().width(100)).adjust(opacity(50))
      )
    ).position(
      new Position()
        .gravity(compass("north_east"))
        .offsetX(10)
        .offsetY(10)
    )
  )
  .resize(scale().width(600))
  .setSignature("pVcU_PBg");
```

```js
new CloudinaryImage("beach.jpg")
  .resize(
    crop()
      .width(1000)
      .gravity(compass("south"))
  )
  .roundCorners(byRadius(20))
  .adjust(viesusCorrect())
  .overlay(
    source(
      image("viesus_logo").transformation(
        new Transformation().resize(scale().width(100)).adjust(opacity(50))
      )
    ).position(
      new Position()
        .gravity(compass("north_east"))
        .offsetX(10)
        .offsetY(10)
    )
  )
  .resize(scale().width(600))
  .setSignature("pVcU_PBg");
```

```python
CloudinaryImage("beach.jpg").image(sign_url=True, transformation=[
  {'gravity': "south", 'width': 1000, 'crop': "crop"},
  {'radius': 20},
  {'effect': "viesus_correct"},
  {'overlay': "viesus_logo"},
  {'width': 100, 'crop': "scale"},
  {'opacity': 50},
  {'flags': "layer_apply", 'gravity': "north_east", 'x': 10, 'y': 10},
  {'width': 600, 'crop': "scale"}
  ])
```

```php
(new ImageTag('beach.jpg'))
	->resize(Resize::crop()->width(1000)
	->gravity(
	Gravity::compass(
	Compass::south()))
	)
	->roundCorners(RoundCorners::byRadius(20))
	->adjust(Adjust::viesusCorrect())
	->overlay(Overlay::source(
	Source::image("viesus_logo")
	->transformation((new Transformation())
	->resize(Resize::scale()->width(100))
	->adjust(Adjust::opacity(50)))
	)
	->position((new Position())
	->gravity(
	Gravity::compass(
	Compass::northEast()))
->offsetX(10)
->offsetY(10))
	)
	->resize(Resize::scale()->width(600))
	->sign();
```

```java
cloudinary.url().transformation(new Transformation()
  .gravity("south").width(1000).crop("crop").chain()
  .radius(20).chain()
  .effect("viesus_correct").chain()
  .overlay(new Layer().publicId("viesus_logo")).chain()
  .width(100).crop("scale").chain()
  .opacity(50).chain()
  .flags("layer_apply").gravity("north_east").x(10).y(10).chain()
  .width(600).crop("scale")).signed(true).imageTag("beach.jpg");
```

```ruby
cl_image_tag("beach.jpg", sign_url: true, transformation: [
  {gravity: "south", width: 1000, crop: "crop"},
  {radius: 20},
  {effect: "viesus_correct"},
  {overlay: "viesus_logo"},
  {width: 100, crop: "scale"},
  {opacity: 50},
  {flags: "layer_apply", gravity: "north_east", x: 10, y: 10},
  {width: 600, crop: "scale"}
  ])
```

```csharp
cloudinary.Api.UrlImgUp.Transform(new Transformation()
  .Gravity("south").Width(1000).Crop("crop").Chain()
  .Radius(20).Chain()
  .Effect("viesus_correct").Chain()
  .Overlay(new Layer().PublicId("viesus_logo")).Chain()
  .Width(100).Crop("scale").Chain()
  .Opacity(50).Chain()
  .Flags("layer_apply").Gravity("north_east").X(10).Y(10).Chain()
  .Width(600).Crop("scale")).Signed(true).BuildImageTag("beach.jpg")
```

```dart
cloudinary.image('beach.jpg').transformation(Transformation()
	.resize(Resize.crop().width(1000)
	.gravity(
	Gravity.compass(
	Compass.south()))
	)
	.roundCorners(RoundCorners.byRadius(20))
	.adjust(Adjust.viesusCorrect())
	.overlay(Overlay.source(
	Source.image("viesus_logo")
	.transformation(new Transformation()
	.resize(Resize.scale().width(100))
	.adjust(Adjust.opacity(50)))
	)
	.position(Position()
	.gravity(
	Gravity.compass(
	Compass.northEast()))
.offsetX(10)
.offsetY(10))
	)
	.resize(Resize.scale().width(600))
	.setSignature("pVcU_PBg"));
```

```swift
imageView.cldSetImage(cloudinary.createUrl().setTransformation(CLDTransformation()
  .setGravity("south").setWidth(1000).setCrop("crop").chain()
  .setRadius(20).chain()
  .setEffect("viesus_correct").chain()
  .setOverlay("viesus_logo").chain()
  .setWidth(100).setCrop("scale").chain()
  .setOpacity(50).chain()
  .setFlags("layer_apply").setGravity("north_east").setX(10).setY(10).chain()
  .setWidth(600).setCrop("scale")).generate("beach.jpg", signUrl: true)!, cloudinary: cloudinary)
```

```android
MediaManager.get().url().transformation(new Transformation()
  .gravity("south").width(1000).crop("crop").chain()
  .radius(20).chain()
  .effect("viesus_correct").chain()
  .overlay(new Layer().publicId("viesus_logo")).chain()
  .width(100).crop("scale").chain()
  .opacity(50).chain()
  .flags("layer_apply").gravity("north_east").x(10).y(10).chain()
  .width(600).crop("scale")).signed(true).generate("beach.jpg");
```

```flutter
cloudinary.image('beach.jpg').transformation(Transformation()
	.addTransformation("c_crop,g_south,w_1000/r_20/e_viesus_correct/l_viesus_logo/c_scale,w_100/o_50/fl_layer_apply,g_north_east,x_10,y_10/c_scale,w_600")
	.setSignature("pVcU_PBg"));
```

```kotlin
cloudinary.image {
	publicId("beach.jpg")
	 resize(Resize.crop() { width(1000)
	 gravity(
	Gravity.compass(
	Compass.south()))
	 })
	 roundCorners(RoundCorners.byRadius(20))
	 adjust(Adjust.viesusCorrect())
	 overlay(Overlay.source(
	Source.image("viesus_logo") {
	 transformation(Transformation {
	 resize(Resize.scale() { width(100) })
	 adjust(Adjust.opacity(50)) })
	 }) {
	 position(Position() {
	 gravity(
	Gravity.compass(
	Compass.northEast()))
 offsetX(10)
 offsetY(10) })
	 })
	 resize(Resize.scale() { width(600) })
	 signature() 
}.generate()
```

```jquery
$.cloudinary.image("beach.jpg", {transformation: [
  {gravity: "south", width: 1000, crop: "crop"},
  {radius: 20},
  {effect: "viesus_correct"},
  {overlay: new cloudinary.Layer().publicId("viesus_logo")},
  {width: 100, crop: "scale"},
  {opacity: 50},
  {flags: "layer_apply", gravity: "north_east", x: 10, y: 10},
  {width: 600, crop: "scale"}
  ]})
```

```react_native
new CloudinaryImage("beach.jpg")
  .resize(
    crop()
      .width(1000)
      .gravity(compass("south"))
  )
  .roundCorners(byRadius(20))
  .adjust(viesusCorrect())
  .overlay(
    source(
      image("viesus_logo").transformation(
        new Transformation().resize(scale().width(100)).adjust(opacity(50))
      )
    ).position(
      new Position()
        .gravity(compass("north_east"))
        .offsetX(10)
        .offsetY(10)
    )
  )
  .resize(scale().width(600))
  .setSignature("pVcU_PBg");
```

For a full list of additional Cloudinary's image transformation options, see the [Image transformations](image_transformations) documentation.
