Cloudflare Images Only Works Inside Cloudflare
You need to resize a product photo, convert it to AVIF, and strip the background. Three operations. Should be one API call to any image service.
With Cloudflare Images, you first upload the image to Cloudflare’s storage. Then you define named variants — preset combinations of resize, crop, and format settings — through the Cloudflare dashboard or API. The transformed image is served through Cloudflare’s CDN. There is no option to process an image and get the result back without storing it on Cloudflare’s infrastructure.
This means Cloudflare Images is not an image transformation API. It’s a feature of Cloudflare’s ecosystem. If you’re already running your entire stack on Cloudflare — Workers, R2, CDN — then Images fits naturally. But if your images live in S3, or you have your own CDN, or you just want to process an image and move on, Cloudflare Images requires you to migrate your image storage to make transformations work.
That’s not a tradeoff. That’s a prerequisite.
Limited Transformations, No AI
Cloudflare Images supports a narrow set of transformations: resize, crop, blur, sharpen, rotate, background color, format conversion, quality adjustment, and DPR scaling. These cover the basics. But “the basics” is where it stops.
There is no background removal. No AI-powered smart crop that detects subjects and frames them automatically. No AI upscaling that adds real detail instead of blurring pixels. No color adjustments beyond what the basic parameters offer. No target-size compression where you say “make this the best image under 500 KB” and let the API figure it out.
If you need any of these, you’re integrating a second service alongside Cloudflare Images. Now you’re managing two APIs, two sets of credentials, two billing models, and the glue code to route images between them. The simplicity that Cloudflare advertised just doubled in complexity.
“Unique Transformations” Pricing
Cloudflare Images bills transformations based on unique transformations — distinct combinations of source image and transformation parameters. The first time you request image-abc at width=400,fit=cover,format=webp, that’s a unique transformation. The second time you request the same combination, it’s served from cache and doesn’t count.
Sounds efficient until you think about it. If you serve user-uploaded content where every image is different, every transformation is unique by definition. If you serve personalized crops — different focal points per user — every request is unique. The caching benefit only helps when you serve the same transformation of the same image repeatedly.
And estimating costs upfront is guesswork. How many unique source images will you have next month? How many variant combinations will your frontend request? The answer depends on your user behavior, your design system, and whether someone adds a new responsive breakpoint. You’re forecasting transformation costs based on variables you can’t predict.
The Variant System
Instead of defining transformations per request, Cloudflare Images uses named variants. You create a variant called “thumbnail” with width=200, height=200, fit=crop. You create another called “hero” with width=1200, height=630, fit=cover. Then you request images by variant name.
This works for static design systems where you know every image size at build time. It falls apart when transformation requirements are dynamic — when the resize dimensions come from a database, when the crop parameters depend on detected content, when the pipeline changes per image.
Adding a new variant means going to the dashboard or making an API call to Cloudflare’s variant management endpoint. Removing a variant means making sure nothing still references it. You’re managing a registry of transformation presets on top of managing your actual images.
Compare this to passing a JSON pipeline per request: you define exactly what you need at call time, and the definition lives in your code, version-controlled and reviewable.
A Standalone Alternative
The Iteration Layer Image Transformation API transforms images without storing them, without requiring a specific CDN, and without tying you to any ecosystem. Send an image URL, define a pipeline of operations, get the result back.
24 operations cover both the basics and the gaps Cloudflare leaves open:
- Resize, crop, rotate, flip
- Format conversion (JPEG, PNG, WebP, GIF, AVIF, HEIF)
- Quality adjustment and target-size compression
- Smart crop with AI object detection
- AI upscaling (4x resolution)
- AI background removal
- Color adjustments, blur, sharpen, grayscale
Chain up to 30 operations in a single request. The pipeline executes in order — remove the background, resize to the target dimensions, sharpen, convert to AVIF. Explicit, sequential, predictable.
Here’s a pipeline that Cloudflare Images cannot do at all:
import { IterationLayer } from "iterationlayer";
const client = new IterationLayer({ apiKey: "YOUR_API_KEY" });
const result = await client.transform({
file: { name: "banner.png", url: "https://example.com/banner.png" },
operations: [
{ type: "remove_background" },
{ type: "resize", width_in_px: 1200, height_in_px: 630, fit: "cover" },
{ type: "sharpen", sigma: 1.2 },
{ type: "convert", format: "avif", quality: 80 },
],
});
Four operations, one call. Background removal, resize, sharpen, and format conversion — all in a single request. No variant registry, no image upload to third-party storage, no ecosystem dependency. The pipeline is JSON you can generate dynamically, store in a config file, or construct based on runtime conditions.
AI Features as Standard Operations
AI-powered transformations are not premium tiers or separate products. They’re operations in the same pipeline.
Smart crop uses AI object detection to find subjects in an image and crop around them. Product photography, profile pictures, editorial thumbnails — the crop follows the content instead of defaulting to center. Cloudflare’s fit=crop with gravity=auto attempts basic content-aware cropping, but it’s not object detection. It can’t distinguish a person from a lamp.
AI upscaling upscales images to 4x resolution with AI-powered super resolution. A 300x200 source image becomes 1200x800 with actual detail synthesis — not the bicubic interpolation blur you get from naive resizing. Cloudflare Images has no upscaling capability at all.
Background removal uses AI segmentation to isolate the foreground and remove the background cleanly. Product images on white, profile photos for compositing, marketing assets that need transparency. Cloudflare Images does not offer this.
These operations compose with everything else. Remove the background, then upscale, then resize, then convert — one request, one result.
Compress to Target Size
Email clients reject attachments over 5 MB. App stores want icons under specific file sizes. CMS platforms enforce upload limits. The constraint is a number in bytes, not a quality percentage.
Target-size compression takes a file size limit and optimizes quality and dimensions to produce the best possible image under that constraint:
const result = await client.transform({
file: { name: "hero.jpg", url: "https://example.com/hero.jpg" },
operations: [
{ type: "compress_to_size", max_file_size_in_bytes: 500_000 },
],
});
Cloudflare Images lets you set a quality parameter. If the output is still too large, you adjust quality manually and try again. There’s no way to say “fit within this budget” and let the system handle it.
Side-by-Side
| Capability | Cloudflare Images | Iteration Layer |
|---|---|---|
| Core model | Ecosystem feature (storage + CDN + transforms) | Standalone transformation API |
| Requires vendor storage | Yes — must upload to Cloudflare | No — bring your own |
| Requires vendor CDN | Yes — served via Cloudflare CDN | No — bring your own |
| Transformation definition | Named variants (preset registry) | JSON pipeline per request |
| Pricing model | Per unique transformation | Per request |
| Available operations | ~10 basic parameters | 24 operations |
| Operations per request | One variant at a time | Up to 30 per request |
| AI background removal | Not available | Included |
| AI smart crop | Not available | Included (AI object detection) |
| AI upscaling | Not available | Included (AI 4x) |
| Target-size compression | Not available | Built-in operation |
| Ecosystem dependency | Full Cloudflare stack | None |
| Data residency | Global edge network | EU-hosted (Frankfurt) |
When Cloudflare Images Makes Sense
If you’re already all-in on Cloudflare — Workers for compute, R2 for storage, their CDN for delivery — then Cloudflare Images is a natural extension. It’s deeply integrated, the caching is automatic, and the variant system works well for static design systems with a fixed set of image sizes.
But if you’re not on Cloudflare. If your images live in S3, GCS, or your own servers. If you need AI features. If your transformations are dynamic. If you don’t want to migrate your image storage to get access to basic resize and crop — then Cloudflare Images is asking you to adopt an ecosystem to solve a transformation problem.
You don’t need a platform. You need a function call that takes an image and returns a better image.
Get Started
Check the Image Transformation docs for the full operation reference, pipeline examples, and SDK guides. The TypeScript and Python SDKs handle authentication, file handling, and response parsing — your integration is a few lines of code.