Skip to content

Commit 5522c30

Browse files
authored
add support for generative background replace (#55)
1 parent 8c36dd2 commit 5522c30

File tree

8 files changed

+104
-6
lines changed

8 files changed

+104
-6
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,6 @@ pcakage-lock.json
1414
__DOCS__/JSDocTemplate/examples
1515
devTools/sanity/results.json
1616
.DS_Store
17+
18+
# Prettier
19+
.prettierignore

__TESTS__/unit/actions/Effect.test.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ describe('Tests for Transformation Action -- Effect', () => {
5252
.effect(Effect.generativeRestore())
5353
.effect(Effect.upscale())
5454
.effect(Effect.enhance())
55+
.effect(Effect.generativeBackgroundReplace().prompt("dog"))
56+
.effect(Effect.generativeBackgroundReplace())
5557
.toString();
5658

5759
const expectedToContain = [
@@ -92,7 +94,9 @@ describe('Tests for Transformation Action -- Effect', () => {
9294
'e_deshake:16',
9395
'e_gen_restore',
9496
'e_upscale',
95-
'e_enhance'
97+
'e_enhance',
98+
'e_gen_background_replace:prompt_dog',
99+
'e_gen_background_replace'
96100
].join('/');
97101

98102
expect(tx).toBe(`${expectedToContain}`);

__TESTS__/unit/fromJson/effect.fromJson.test.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,9 @@ describe('effect.fromJson', () => {
4848
{ actionType: 'generativeRecolor', prompts: ['something', 'else'], toColor: 'blue', detectMultiple: false },
4949
{ actionType: 'generativeRestore' },
5050
{ actionType: 'upscale' },
51-
{ actionType: 'enhance' }
51+
{ actionType: 'enhance' },
52+
{ actionType: 'generativeBackgroundReplace', prompt: 'dog' },
53+
{ actionType: 'generativeBackgroundReplace'},
5254
]});
5355

5456
expect(transformation.toString().split('/')).toStrictEqual([
@@ -97,7 +99,9 @@ describe('effect.fromJson', () => {
9799
'e_gen_recolor:prompt_(something;else);to-color_blue',
98100
'e_gen_restore',
99101
'e_upscale',
100-
'e_enhance'
102+
'e_enhance',
103+
'e_gen_background_replace:prompt_dog',
104+
'e_gen_background_replace'
101105
]);
102106
});
103107
});

__TESTS__/unit/toJson/effect.toJson.test.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,24 @@ describe('Effect toJson()', () => {
486486
});
487487
});
488488

489+
it('effect.GenerativeBackgroundReplace', () => {
490+
const transformation = new Transformation()
491+
.addAction(Effect.generativeBackgroundReplace().prompt('dog'))
492+
.addAction(Effect.generativeBackgroundReplace());
493+
494+
expect(transformation.toJson()).toStrictEqual({
495+
actions: [
496+
{
497+
actionType: 'generativeBackgroundReplace',
498+
prompt: 'dog',
499+
},
500+
{
501+
actionType: 'generativeBackgroundReplace',
502+
},
503+
]
504+
});
505+
});
506+
489507
it('effect.GenerativeRecolor', () => {
490508
const transformation = new Transformation()
491509
.addAction(Effect.generativeRecolor('something', 'red'))

src/actions/effect.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import { DropShadow } from "./effect/DropShadow.js";
3030
import { GenerativeRemove } from "./effect/GenerativeRemove.js";
3131
import { GenerativeReplace } from "./effect/GenerativeReplace.js";
3232
import { GenerativeRecolor } from "./effect/GenerativeRecolor.js";
33+
import { GenerativeBackgroundReplace } from "./effect/GenerativeBackgroundReplace.js";
3334

3435
/**
3536
* @summary action
@@ -460,6 +461,18 @@ function generativeReplace(): GenerativeReplace {
460461
return new GenerativeReplace();
461462
}
462463

464+
/**
465+
* @summary action
466+
* @description Uses generative AI to replace background of your image with something else.
467+
* {@link https://cloudinary.com/documentation/transformation_reference#e_gen_background_replace|Generative Background Replace}
468+
*
469+
* @memberOf Actions.Effect
470+
* @return {Actions.Effect.GenerativeBackgroundReplace}
471+
*/
472+
function generativeBackgroundReplace(): GenerativeBackgroundReplace {
473+
return new GenerativeBackgroundReplace();
474+
}
475+
463476
/**
464477
* @summary action
465478
* @description Uses generative AI to recolor objects from your image.
@@ -610,6 +623,7 @@ const Effect = {
610623
dropShadow,
611624
generativeRemove,
612625
generativeReplace,
626+
generativeBackgroundReplace,
613627
generativeRecolor,
614628
generativeRestore,
615629
upscale,
@@ -637,6 +651,7 @@ export declare type EffectActions =
637651
| DropShadow
638652
| GenerativeRemove
639653
| GenerativeReplace
654+
| GenerativeBackgroundReplace
640655
| GenerativeRecolor;
641656

642657
export {
@@ -677,6 +692,7 @@ export {
677692
dropShadow,
678693
generativeRemove,
679694
generativeReplace,
695+
generativeBackgroundReplace,
680696
generativeRecolor,
681697
generativeRestore,
682698
upscale,
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { Action } from "../../internal/Action.js";
2+
import { Qualifier } from "../../internal/qualifier/Qualifier.js";
3+
import { IGenerativeBackgroundReplaceModel } from "../../internal/models/IEffectActionModel.js";
4+
5+
/**
6+
* @description Uses generative AI to replace background of your image with something else.
7+
* @extends SDK.Action
8+
* @memberOf Actions.Effect
9+
* @see Visit {@link Actions.Effect|Effect} for an example
10+
*/
11+
class GenerativeBackgroundReplace extends Action {
12+
private _prompt: string;
13+
14+
constructor() {
15+
super();
16+
this._actionModel.actionType = "generativeBackgroundReplace";
17+
}
18+
19+
prompt(value: string): GenerativeBackgroundReplace {
20+
this._prompt = value;
21+
this._actionModel.prompt = value;
22+
23+
return this;
24+
}
25+
26+
protected prepareQualifiers(): void {
27+
if (!this._prompt) {
28+
this.addQualifier(new Qualifier("e", "gen_background_replace"));
29+
} else {
30+
this.addQualifier(
31+
new Qualifier("e", `gen_background_replace:prompt_${this._prompt}`)
32+
);
33+
}
34+
}
35+
36+
static fromJson(
37+
actionModel: IGenerativeBackgroundReplaceModel
38+
): GenerativeBackgroundReplace {
39+
const { prompt } = actionModel;
40+
const result = new this();
41+
42+
return result.prompt(prompt);
43+
}
44+
}
45+
46+
export { GenerativeBackgroundReplace };

src/internal/fromJson.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,10 @@ import { BorderAction } from "../actions/border.js";
6969
import { GenerativeRemove } from "../actions/effect/GenerativeRemove.js";
7070
import { GenerativeReplace } from "../actions/effect/GenerativeReplace.js";
7171
import { GenerativeRecolor } from "../actions/effect/GenerativeRecolor.js";
72-
import {ResizeAdvancedAction} from "../actions/resize/ResizeAdvancedAction.js";
73-
import {BackgroundColor} from "../actions/background/actions/BackgroundColor.js";
74-
import {ResizeAutoPadAction} from "../actions/resize/ResizeAutoPadAction.js";
72+
import { ResizeAdvancedAction } from "../actions/resize/ResizeAdvancedAction.js";
73+
import { BackgroundColor } from "../actions/background/actions/BackgroundColor.js";
74+
import { ResizeAutoPadAction } from "../actions/resize/ResizeAutoPadAction.js";
75+
import { GenerativeBackgroundReplace } from "actions/effect/GenerativeBackgroundReplace.js";
7576

7677
const ActionModelMap: Record<string, IHasFromJson> = {
7778
scale: ResizeScaleAction,
@@ -149,6 +150,7 @@ const ActionModelMap: Record<string, IHasFromJson> = {
149150
border: BorderAction,
150151
generativeRemove: GenerativeRemove,
151152
generativeReplace: GenerativeReplace,
153+
generativeBackgroundReplace: GenerativeBackgroundReplace,
152154
generativeRecolor: GenerativeRecolor,
153155
generativeRestore: SimpleEffectAction,
154156
upscale: SimpleEffectAction,

src/internal/models/IEffectActionModel.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,10 @@ interface IGenerativeReplaceModel extends IActionModel {
135135
detectMultiple?: boolean;
136136
}
137137

138+
interface IGenerativeBackgroundReplaceModel extends IActionModel {
139+
prompt?: string;
140+
}
141+
138142
interface IBackgroundColorModel extends IActionModel {
139143
color?: SystemColors | string;
140144
}
@@ -163,5 +167,6 @@ export {
163167
IGenerativeRemoveModel,
164168
IGenerativeReplaceModel,
165169
IGenerativeRecolorModel,
170+
IGenerativeBackgroundReplaceModel,
166171
IBackgroundColorModel,
167172
};

0 commit comments

Comments
 (0)