Cloudflare Image Resizing
场景
对于某个网站,有这样的页面:
- 商品列表,每个商品有一个缩略图,这个缩略图叫做:图片A
- 商品详情页,有多张商品图片,包括了图片A
图片A的地址是:https://example.com/images/product-12345.jpg
传统做法
对于商品缩略图和详情页图片,传统做法是两个场景使用共同的图片:
<img src="https://example.com/images/product-12345.jpg" alt="商品缩略图">
<img src="https://example.com/images/product-12345.jpg" alt="商品详情图">
分析问题
这种做法存在以下问题:
- 尺寸不匹配:缩略图通常需要较小尺寸,而详情页需要更大尺寸。使用同一张图片会导致缩略图加载过大,影响性能。
- 图片未压缩:详情页图片通常需要高质量,而缩略图可以适当压缩以节省带宽。使用同一张图片无法满足不同质量需求。
解决问题
解决问题的办法也很简单,准备两张图片即可:
<img src="https://example.com/images/product-12345-thumbnail.jpg" alt="商品缩略图">
<img src="https://example.com/images/product-12345.jpg" alt="商品详情图">
还有问题
详情页图片是 800x800。如果在小屏幕设备上,我们也要加载 800x800 的图片吗?这显然是不合理的,因为加载 400x400 的图片已经足够清晰了,加载那么大的图片只会浪费带宽和流量。
所以对于不同设备,我们还需要准备不同尺寸的图片…
这样岂不是要维护很多张图片吗?对于一个电商网站来说,可能有成千上万的商品,每个商品都需要多张不同尺寸的图片,这样的工作量是非常庞大的。
理想的解决方案
理想的解决方案是:只上传一张高质量的原始图片,然后根据不同的需求,动态生成不同尺寸、不同质量、不同格式的图片。
我希望这样:
- 我上传一张原始图片,它很高清,尺寸足够大
- 当我需要一张 150x150 的缩略图时,我只需要一个 URL,就能得到这张图片
例如:
- 原始图片的地址是:
https://example.com/images/product-12345.jpg - 150x150 缩略图的地址是:
https://example.com/cdn-cgi/image/width=150,height=150,quality=75,fit=cover,format=auto/images/product-12345.jpg
还有格式也能自动处理就好了:
- 如果浏览器支持 WebP,就返回 WebP 格式
- 如果浏览器支持 AVIF,就返回 AVIF 格式
还能自动压缩就更好了:
- 对于缩略图,质量可以设置低一些,比如 75
Cloudflare Image Resizing
Cloudflare 提供的实时图片优化服务,通过简单的 URL 参数即可对图片进行动态调整、压缩和格式转换。它是现代 Web 应用图片优化的完美解决方案。
基础用法
URL 格式
https://your-domain.com/cdn-cgi/image/[参数]/[原图片路径]
基本示例
原始图片:
https://example.com/images/photo.jpg
优化后:
https://example.com/cdn-cgi/image/width=800,quality=85,format=auto/images/photo.jpg
核心参数详解
尺寸控制
# 指定宽度
width=800
# 指定高度
height=600
# 同时指定宽高
width=800,height=600
质量控制
# 质量范围:1-100
quality=85 # 推荐值:80-90
quality=75 # 移动端可用更低质量
quality=95 # 高质量场景
格式转换
format=auto # 自动选择最佳格式(推荐)
format=webp # 强制 WebP 格式
format=avif # 强制 AVIF 格式
format=jpeg # 强制 JPEG 格式
适配模式
fit=scale-down # 缩小(默认,不会放大)
fit=contain # 包含(保持比例,可能有空白)
fit=cover # 覆盖(裁剪以填满)
fit=crop # 裁剪到指定尺寸
fit=pad # 填充(添加背景色)
实际应用场景
场景 1:响应式图片
为不同设备提供不同尺寸的图片:
<picture>
<!-- 桌面端 -->
<source media="(min-width: 1024px)"
srcset="https://example.com/cdn-cgi/image/width=1200,quality=90,format=auto/hero.jpg">
<!-- 平板 -->
<source media="(min-width: 768px)"
srcset="https://example.com/cdn-cgi/image/width=800,quality=85,format=auto/hero.jpg">
<!-- 移动端 -->
<img src="https://example.com/cdn-cgi/image/width=400,quality=80,format=auto/hero.jpg"
alt="Hero Image">
</picture>
场景 2:产品图片优化
电商网站的产品图片:
const productImageUrls = {
// 缩略图
thumbnail: `/cdn-cgi/image/width=150,height=150,quality=75,fit=cover,format=auto/products/${productId}.jpg`,
// 列表页
listing: `/cdn-cgi/image/width=300,height=300,quality=80,fit=cover,format=auto/products/${productId}.jpg`,
// 详情页
detail: `/cdn-cgi/image/width=600,height=600,quality=90,fit=contain,format=auto/products/${productId}.jpg`,
// 放大镜
zoom: `/cdn-cgi/image/width=1200,height=1200,quality=95,fit=contain,format=auto/products/${productId}.jpg`
};
场景 3:内容管理系统
博客或 CMS 的图片处理:
function generateImageVariants(originalPath) {
const baseUrl = `/cdn-cgi/image`;
return {
// 文章缩略图
thumbnail: `${baseUrl}/width=200,height=150,quality=75,fit=cover,format=auto/${originalPath}`,
// 文章内图片
content: `${baseUrl}/width=800,quality=85,format=auto/${originalPath}`,
// 社交分享图
social: `${baseUrl}/width=1200,height=630,quality=90,fit=cover,format=auto/${originalPath}`,
// 移动端优化
mobile: `${baseUrl}/width=400,quality=75,format=webp/${originalPath}`
};
}
进一步了解
其功能绝不像我们介绍的那样简单,如需了解更多高级功能和配置,请参考官方文档: