From 9c75c4ee367c8b4067874e1d7940f49bb4834a32 Mon Sep 17 00:00:00 2001 From: Lisa Date: Mon, 8 Jul 2024 11:24:59 +0200 Subject: [PATCH] add support for generative background replace --- .gitignore | 3 ++ __TESTS__/unit/actions/Effect.test.ts | 6 ++- .../unit/fromJson/effect.fromJson.test.ts | 8 +++- __TESTS__/unit/toJson/effect.toJson.test.ts | 18 ++++++++ src/actions/effect.ts | 16 +++++++ .../effect/GenerativeBackgroundReplace.ts | 46 +++++++++++++++++++ src/internal/fromJson.ts | 8 ++-- src/internal/models/IEffectActionModel.ts | 5 ++ 8 files changed, 104 insertions(+), 6 deletions(-) create mode 100644 src/actions/effect/GenerativeBackgroundReplace.ts diff --git a/.gitignore b/.gitignore index 5e4492d..057fadd 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,6 @@ pcakage-lock.json __DOCS__/JSDocTemplate/examples devTools/sanity/results.json .DS_Store + +# Prettier +.prettierignore diff --git a/__TESTS__/unit/actions/Effect.test.ts b/__TESTS__/unit/actions/Effect.test.ts index d91cbed..f9ef9a5 100644 --- a/__TESTS__/unit/actions/Effect.test.ts +++ b/__TESTS__/unit/actions/Effect.test.ts @@ -52,6 +52,8 @@ describe('Tests for Transformation Action -- Effect', () => { .effect(Effect.generativeRestore()) .effect(Effect.upscale()) .effect(Effect.enhance()) + .effect(Effect.generativeBackgroundReplace().prompt("dog")) + .effect(Effect.generativeBackgroundReplace()) .toString(); const expectedToContain = [ @@ -92,7 +94,9 @@ describe('Tests for Transformation Action -- Effect', () => { 'e_deshake:16', 'e_gen_restore', 'e_upscale', - 'e_enhance' + 'e_enhance', + 'e_gen_background_replace:prompt_dog', + 'e_gen_background_replace' ].join('/'); expect(tx).toBe(`${expectedToContain}`); diff --git a/__TESTS__/unit/fromJson/effect.fromJson.test.ts b/__TESTS__/unit/fromJson/effect.fromJson.test.ts index 96c31be..d4131f8 100644 --- a/__TESTS__/unit/fromJson/effect.fromJson.test.ts +++ b/__TESTS__/unit/fromJson/effect.fromJson.test.ts @@ -48,7 +48,9 @@ describe('effect.fromJson', () => { { actionType: 'generativeRecolor', prompts: ['something', 'else'], toColor: 'blue', detectMultiple: false }, { actionType: 'generativeRestore' }, { actionType: 'upscale' }, - { actionType: 'enhance' } + { actionType: 'enhance' }, + { actionType: 'generativeBackgroundReplace', prompt: 'dog' }, + { actionType: 'generativeBackgroundReplace'}, ]}); expect(transformation.toString().split('/')).toStrictEqual([ @@ -97,7 +99,9 @@ describe('effect.fromJson', () => { 'e_gen_recolor:prompt_(something;else);to-color_blue', 'e_gen_restore', 'e_upscale', - 'e_enhance' + 'e_enhance', + 'e_gen_background_replace:prompt_dog', + 'e_gen_background_replace' ]); }); }); diff --git a/__TESTS__/unit/toJson/effect.toJson.test.ts b/__TESTS__/unit/toJson/effect.toJson.test.ts index 71e2993..916bfee 100644 --- a/__TESTS__/unit/toJson/effect.toJson.test.ts +++ b/__TESTS__/unit/toJson/effect.toJson.test.ts @@ -486,6 +486,24 @@ describe('Effect toJson()', () => { }); }); + it('effect.GenerativeBackgroundReplace', () => { + const transformation = new Transformation() + .addAction(Effect.generativeBackgroundReplace().prompt('dog')) + .addAction(Effect.generativeBackgroundReplace()); + + expect(transformation.toJson()).toStrictEqual({ + actions: [ + { + actionType: 'generativeBackgroundReplace', + prompt: 'dog', + }, + { + actionType: 'generativeBackgroundReplace', + }, + ] + }); + }); + it('effect.GenerativeRecolor', () => { const transformation = new Transformation() .addAction(Effect.generativeRecolor('something', 'red')) diff --git a/src/actions/effect.ts b/src/actions/effect.ts index 2162fe0..5279be3 100644 --- a/src/actions/effect.ts +++ b/src/actions/effect.ts @@ -30,6 +30,7 @@ import { DropShadow } from "./effect/DropShadow.js"; import { GenerativeRemove } from "./effect/GenerativeRemove.js"; import { GenerativeReplace } from "./effect/GenerativeReplace.js"; import { GenerativeRecolor } from "./effect/GenerativeRecolor.js"; +import { GenerativeBackgroundReplace } from "./effect/GenerativeBackgroundReplace.js"; /** * @summary action @@ -460,6 +461,18 @@ function generativeReplace(): GenerativeReplace { return new GenerativeReplace(); } +/** + * @summary action + * @description Uses generative AI to replace background of your image with something else. + * {@link https://cloudinary.com/documentation/transformation_reference#e_gen_background_replace|Generative Background Replace} + * + * @memberOf Actions.Effect + * @return {Actions.Effect.GenerativeBackgroundReplace} + */ +function generativeBackgroundReplace(): GenerativeBackgroundReplace { + return new GenerativeBackgroundReplace(); +} + /** * @summary action * @description Uses generative AI to recolor objects from your image. @@ -610,6 +623,7 @@ const Effect = { dropShadow, generativeRemove, generativeReplace, + generativeBackgroundReplace, generativeRecolor, generativeRestore, upscale, @@ -637,6 +651,7 @@ export declare type EffectActions = | DropShadow | GenerativeRemove | GenerativeReplace + | GenerativeBackgroundReplace | GenerativeRecolor; export { @@ -677,6 +692,7 @@ export { dropShadow, generativeRemove, generativeReplace, + generativeBackgroundReplace, generativeRecolor, generativeRestore, upscale, diff --git a/src/actions/effect/GenerativeBackgroundReplace.ts b/src/actions/effect/GenerativeBackgroundReplace.ts new file mode 100644 index 0000000..e7a0b49 --- /dev/null +++ b/src/actions/effect/GenerativeBackgroundReplace.ts @@ -0,0 +1,46 @@ +import { Action } from "../../internal/Action.js"; +import { Qualifier } from "../../internal/qualifier/Qualifier.js"; +import { IGenerativeBackgroundReplaceModel } from "../../internal/models/IEffectActionModel.js"; + +/** + * @description Uses generative AI to replace background of your image with something else. + * @extends SDK.Action + * @memberOf Actions.Effect + * @see Visit {@link Actions.Effect|Effect} for an example + */ +class GenerativeBackgroundReplace extends Action { + private _prompt: string; + + constructor() { + super(); + this._actionModel.actionType = "generativeBackgroundReplace"; + } + + prompt(value: string): GenerativeBackgroundReplace { + this._prompt = value; + this._actionModel.prompt = value; + + return this; + } + + protected prepareQualifiers(): void { + if (!this._prompt) { + this.addQualifier(new Qualifier("e", "gen_background_replace")); + } else { + this.addQualifier( + new Qualifier("e", `gen_background_replace:prompt_${this._prompt}`) + ); + } + } + + static fromJson( + actionModel: IGenerativeBackgroundReplaceModel + ): GenerativeBackgroundReplace { + const { prompt } = actionModel; + const result = new this(); + + return result.prompt(prompt); + } +} + +export { GenerativeBackgroundReplace }; diff --git a/src/internal/fromJson.ts b/src/internal/fromJson.ts index 6421b64..0bb2f24 100644 --- a/src/internal/fromJson.ts +++ b/src/internal/fromJson.ts @@ -69,9 +69,10 @@ import { BorderAction } from "../actions/border.js"; import { GenerativeRemove } from "../actions/effect/GenerativeRemove.js"; import { GenerativeReplace } from "../actions/effect/GenerativeReplace.js"; import { GenerativeRecolor } from "../actions/effect/GenerativeRecolor.js"; -import {ResizeAdvancedAction} from "../actions/resize/ResizeAdvancedAction.js"; -import {BackgroundColor} from "../actions/background/actions/BackgroundColor.js"; -import {ResizeAutoPadAction} from "../actions/resize/ResizeAutoPadAction.js"; +import { ResizeAdvancedAction } from "../actions/resize/ResizeAdvancedAction.js"; +import { BackgroundColor } from "../actions/background/actions/BackgroundColor.js"; +import { ResizeAutoPadAction } from "../actions/resize/ResizeAutoPadAction.js"; +import { GenerativeBackgroundReplace } from "actions/effect/GenerativeBackgroundReplace.js"; const ActionModelMap: Record = { scale: ResizeScaleAction, @@ -149,6 +150,7 @@ const ActionModelMap: Record = { border: BorderAction, generativeRemove: GenerativeRemove, generativeReplace: GenerativeReplace, + generativeBackgroundReplace: GenerativeBackgroundReplace, generativeRecolor: GenerativeRecolor, generativeRestore: SimpleEffectAction, upscale: SimpleEffectAction, diff --git a/src/internal/models/IEffectActionModel.ts b/src/internal/models/IEffectActionModel.ts index 5f120dc..18ae4c0 100644 --- a/src/internal/models/IEffectActionModel.ts +++ b/src/internal/models/IEffectActionModel.ts @@ -135,6 +135,10 @@ interface IGenerativeReplaceModel extends IActionModel { detectMultiple?: boolean; } +interface IGenerativeBackgroundReplaceModel extends IActionModel { + prompt?: string; +} + interface IBackgroundColorModel extends IActionModel { color?: SystemColors | string; } @@ -163,5 +167,6 @@ export { IGenerativeRemoveModel, IGenerativeReplaceModel, IGenerativeRecolorModel, + IGenerativeBackgroundReplaceModel, IBackgroundColorModel, };