Skip to content

Commit 5fd87b1

Browse files
committed
feat: add support for new transformations and layer modes in URL generation
1 parent 06de9eb commit 5fd87b1

File tree

3 files changed

+99
-1
lines changed

3 files changed

+99
-1
lines changed

src/imagekitio/lib/helper.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@
8181
"sharpen": "e-sharpen",
8282
"unsharp_mask": "e-usm",
8383
"gradient": "e-gradient",
84+
"color_replace": "cr",
85+
"distort": "e-distort",
8486
# Other flags & finishing
8587
"progressive": "pr",
8688
"lossless": "lo",
@@ -315,6 +317,11 @@ def _process_overlay(overlay: Overlay) -> str:
315317

316318
parsed_overlay.append(f"bg-{color}")
317319

320+
# Handle layer_mode property
321+
layer_mode = overlay.get("layer_mode")
322+
if layer_mode:
323+
parsed_overlay.append(f"lm-{layer_mode}")
324+
318325
# Handle position properties (x, y, focus)
319326
# Node.js uses if (x) which skips falsy values like 0, '', false, null, undefined
320327
x = position.get("x")

tests/custom/url_generation/test_advanced_url_generation.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,17 @@ def test_should_handle_complex_transformation_combinations(self):
216216
expected = "https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=w-300,h-200,q-85,b-5_FF0000"
217217
assert url == expected
218218

219+
def test_should_handle_radius_with_complex_corner_values(self):
220+
"""Test radius transformation with complex corner-specific values."""
221+
url = self.client.helper.build_url(
222+
src="/test_path1.jpg",
223+
url_endpoint="https://ik.imagekit.io/test_url_endpoint",
224+
transformation_position="query",
225+
transformation=[{"radius": "10_20_20_max"}],
226+
)
227+
expected = "https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=r-10_20_20_max"
228+
assert url == expected
229+
219230
def test_should_generate_the_correct_url_with_many_transformations_including_video_and_ai_transforms(self):
220231
"""Test many transformations including video and AI."""
221232
url = self.client.helper.build_url(
@@ -271,11 +282,13 @@ def test_should_generate_the_correct_url_with_many_transformations_including_vid
271282
"sharpen": 10,
272283
"unsharp_mask": "2-2-0.8-0.024",
273284
"gradient": "from-red_to-white",
285+
"color_replace": "FF0000_10_0000FF",
286+
"distort": "p-10_20_100_20_100_200_10_200",
274287
"original": True,
275288
"page": "2_4",
276289
"raw": "h-200,w-300,l-image,i-logo.png,l-end",
277290
}
278291
],
279292
)
280-
expected = "https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=h-300,w-400,ar-4-3,q-40,c-force,cm-extract,fo-left,f-jpeg,r-50,bg-A94D34,b-5-A94D34,rt-90,bl-10,n-some_name,pr-true,lo-true,t-5,md-true,cp-true,di-folder@@file.jpg,dpr-3,x-10,y-20,xc-30,yc-40,fl-h,o-0.8,z-2,vc-h264,ac-aac,so-5,eo-15,du-10,sr-1440_1080,e-grayscale,e-upscale,e-retouch,e-genvar,e-dropshadow,e-changebg-prompt-car,e-edit-prompt-make it vintage,e-bgremove,e-contrast,e-shadow-bl-15_st-40_x-10_y-N5,e-sharpen-10,e-usm-2-2-0.8-0.024,e-gradient-from-red_to-white,orig-true,pg-2_4,h-200,w-300,l-image,i-logo.png,l-end"
293+
expected = "https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=h-300,w-400,ar-4-3,q-40,c-force,cm-extract,fo-left,f-jpeg,r-50,bg-A94D34,b-5-A94D34,rt-90,bl-10,n-some_name,pr-true,lo-true,t-5,md-true,cp-true,di-folder@@file.jpg,dpr-3,x-10,y-20,xc-30,yc-40,fl-h,o-0.8,z-2,vc-h264,ac-aac,so-5,eo-15,du-10,sr-1440_1080,e-grayscale,e-upscale,e-retouch,e-genvar,e-dropshadow,e-changebg-prompt-car,e-edit-prompt-make it vintage,e-bgremove,e-contrast,e-shadow-bl-15_st-40_x-10_y-N5,e-sharpen-10,e-usm-2-2-0.8-0.024,e-gradient-from-red_to-white,cr-FF0000_10_0000FF,e-distort-p-10_20_100_20_100_200_10_200,orig-true,pg-2_4,h-200,w-300,l-image,i-logo.png,l-end"
281294
assert url == expected

tests/custom/url_generation/test_overlay.py

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,3 +403,81 @@ def test_should_properly_encode_overlay_text_when_transformations_are_in_query_p
403403
)
404404
expected = "https://ik.imagekit.io/demo/sample.jpg?tr=l-text,i-Minimal%20Text,l-end"
405405
assert url == expected
406+
407+
# Layer mode tests
408+
def test_should_handle_layer_mode_multiply_in_overlay(self):
409+
"""Test layer mode multiply in image overlay."""
410+
url = self.client.helper.build_url(
411+
src="/base-image.jpg",
412+
url_endpoint="https://ik.imagekit.io/test_url_endpoint",
413+
transformation_position="path",
414+
transformation=[
415+
{
416+
"overlay": {
417+
"type": "image",
418+
"input": "overlay.png",
419+
"layer_mode": "multiply",
420+
}
421+
}
422+
],
423+
)
424+
expected = "https://ik.imagekit.io/test_url_endpoint/tr:l-image,i-overlay.png,lm-multiply,l-end/base-image.jpg"
425+
assert url == expected
426+
427+
def test_should_handle_layer_mode_cutter_in_overlay(self):
428+
"""Test layer mode cutter in image overlay."""
429+
url = self.client.helper.build_url(
430+
src="/base-image.jpg",
431+
url_endpoint="https://ik.imagekit.io/test_url_endpoint",
432+
transformation_position="path",
433+
transformation=[
434+
{
435+
"overlay": {
436+
"type": "image",
437+
"input": "overlay.png",
438+
"layer_mode": "cutter",
439+
}
440+
}
441+
],
442+
)
443+
expected = "https://ik.imagekit.io/test_url_endpoint/tr:l-image,i-overlay.png,lm-cutter,l-end/base-image.jpg"
444+
assert url == expected
445+
446+
def test_should_handle_layer_mode_cutout_in_overlay(self):
447+
"""Test layer mode cutout in image overlay."""
448+
url = self.client.helper.build_url(
449+
src="/base-image.jpg",
450+
url_endpoint="https://ik.imagekit.io/test_url_endpoint",
451+
transformation_position="path",
452+
transformation=[
453+
{
454+
"overlay": {
455+
"type": "image",
456+
"input": "overlay.png",
457+
"layer_mode": "cutout",
458+
}
459+
}
460+
],
461+
)
462+
expected = "https://ik.imagekit.io/test_url_endpoint/tr:l-image,i-overlay.png,lm-cutout,l-end/base-image.jpg"
463+
assert url == expected
464+
465+
def test_should_handle_layer_mode_displace_in_overlay(self):
466+
"""Test layer mode displace in image overlay."""
467+
url = self.client.helper.build_url(
468+
src="/base-image.jpg",
469+
url_endpoint="https://ik.imagekit.io/test_url_endpoint",
470+
transformation_position="path",
471+
transformation=[
472+
{
473+
"overlay": {
474+
"type": "image",
475+
"input": "overlay.png",
476+
"layer_mode": "displace",
477+
}
478+
}
479+
],
480+
)
481+
expected = "https://ik.imagekit.io/test_url_endpoint/tr:l-image,i-overlay.png,lm-displace,l-end/base-image.jpg"
482+
assert url == expected
483+

0 commit comments

Comments
 (0)