作者:张医博
背景
针对 OSS case 的基础排查,以及如果查看图片基础原始参数进行故障定位
必要信息
- 处理图片的需求请描述清楚
- 图片处理的原图链接
- 图片处理后的链接
查看图片原基础参数
遇到问题时,如果有明显的参数超过显示等问题,可以先看下原始参数中的信息,是否有超标,类似如下原始参数中的宽、高、像素、等等,(我们已知的 OSS 单边长度不能超过 4X4096 ,乘积不能低于 4096X4096 )
案例: Picture exceed the maximum allowable rotation range
分析:
出现这种问题基本都是原图的单边长度超过了 4096 的限制。或者四边乘机超过了 406X4096 ,可以用 OSS 的 ?x-oss-process=image/info 参数获取图片的信息判断是否超过限制。
我们在看下图片的原参数的宽高,可知道已经超过了我们的单边限制 4096X4,所以出现不能旋转的异常,对于这种问题,我们先要想自适应关闭,然后在用 resize 处理图片。
案例:OSS图片尺寸超限
分析:
先按要求看下基本的报错信息和原始 URL 参数。
结论:
根据报错信息判断是图片超过显示,我们请求一下图片的原始信息看下是否超过限制。通过 info 信息可以看到用户原始图片的 height 超过限制
案例:开启了 OSS 违规检测,图片被判定违规,但是外部还能访问到?
OSS 没有封禁功能,这个服务是内容识别来做的。属于安全产品。
用户调用内容识别后,发现是违规图片只是被冻结,不在控制台上显示,但不会被删除,正常的保存在 bucket 中。如果要不被别人访问,用户需要手动点击违规并删除,或者批量删除。
详细的文档说明:https://help.aliyun.com/document_detail/28423.html?spm=5176.11065259.1996646101.searchclickresult.1de73273NHoYrM
案例:通过 OSS 获取主色调和图片不符
分析:
首先测试一下获取图片主色调的参数,查看原图的主色调
http://static01.versa-ai.com/video/preview/497dae10-2bb6-4559-8d01-351728a51b29.jpg?x-oss-process=image/average-hue
主色调计算不是按照屏幕颜色占比来计算的,是按照图片中心的主颜色来定的色调,计算逻辑如下:
- 计算整个图片的色调的平均值 (avg_hue)
- 遍历每个像素,计算该像素的色调值与 avg_hue 的色差(即将二者相减后取绝对值),如果该色差大于一个阈值(本文中取 30),则将该像素加入到“醒目像素”的列表
- 计算整个“醒目像素列表”的颜色均值,得到的结果即为该图片的主色调
案例:oss文字水印, 一个文字水印 是否可以分两行显示文字,如果不可以,是否可以一个图片 添加多个文字水印
- 文件水印分行显示:不支持
- 添加多个文字水印:支持
案例:图片水印合成出现黑线
分析:
首先这个黑印不是因为 OSS 造成的,水印的方式是将两张图片重回,如果水印两张图是不通 RGB 图片,覆盖后色差产生的黑线是正常现象不管用任何图片处理都会存在。
- ?x-oss-process=image/average-hue 是查询图片 RGB 的参数,可以直接在图片后面加上查看到原图的 RGB ,两张图完全是不一样的。 RGB 的介绍可以参考一下网上的开源说明
https://yq.aliyun.com/articles/421836?spm=5176.10695662.1996646101.searchclickresult.3bd79460fu5pVr
- 背景图是 {"RGB": "0x0e0e0e"} 水印是 {"RGB": "0xffffff"} ,打完水印肯定会复现类似边框的效果。
结论:
可以通过透明度参数 t_[1-100] 来调整透明度将边框去掉,t 的值不固定按实际效果调整大小。
案例:通过 CDN 回原 OSS 图片处理不生小。
分析:
遇到 CDN 回原到 OSS 图片不生小的问题,不管用的是什么效果,请直接固定 OSS 的域名进行测试。利用下面的 URL 进行基础分析。
http://test.oss-cn-beijing.aliyuncs.com/MomClass/ChuXin/3_2_336_462.jpg@30-30bl
http://test.img-cn-beijing.aliyuncs.com/MomClass/ChuXin/3_2_336_462.jpg@30-30bl
- img-cn-region.aliyuncs.com 是老版本的 OSS 域名,图片处理的分隔符和图片处理语法和新版的 oss 域名都不一样。
- oss-cn-region.aliyuncs.com 这类域名是 2017 年使用的新域名,不兼容 img 域名的图片处理语法和分隔符 "@" ,需要自己在 OSS 控制台上手动执行同步,将 img 域名图片处理同步到 OSS 。
案例:为何图片经过OSS缩略之后尺寸变大了?
参考:https://yq.aliyun.com/articles/74634?spm=5176.10695662.1996646101.searchclickresult.672545f3KE153V
案例:图片处理提示已损坏
出现以下集中情况可以参考如下处理过程
- 用户的源文件在本地可以正常打开,但是上传到到 OSS 就无法进行图片处理,总是反馈 图片损坏 damage
- 用户的源文件上传前可以正常显示,上传后无法显示
分析:
- 以上情况出现后,先获取原始的 OSS URL 地址,然后使用 ?x-oss-process=image/info 先查看下原图信息,如果图片是好的是可以查看出源图片的属性信息的,如果查不到,直接报错, 说用用户原图就是损坏的。
- 为什么下载到本地可以显示?因为本地的图片查看工具是对图片做了补偿修复的。而 OSS 不对对损坏的图片进行处理,所以在浏览器上无法显示。
- 可以用开源的 imagemagic 工具来验证这个问题。
随便进行什么转换,下面是一个 resize 的测试用例,结果发现出现了 error 说明图片是损坏的。
convert -resize 1024x768 1123331261_15353307414801n.jpg
案例:图片处理参数如何加入到 signature
图片处理的参数要放到 signature 一起计算,否则会出现 403 的问题。
案例:存储在 OSS 图片旋转了 90 度
这是直接访问 OSS 的效果
这通过 CDN 访问的效果
分析:
- 直接访问 OSS 正常,说明 OSS 存储是没问题的。
- 但是通过 CDN 访问在浏览器中就出现旋转,无非就是和浏览器的处理有关,通过图片处理参数 info 查看原图参数带有 rotation 90 ,旋转参数,cs 代码可以针对这种参数过滤调不做旋转。否则会旋转 90 度。
案例:OSS 能否识别请求的自定义 query 参数动态缩放
请求范本
http://i.1909.com/img01/M00/*.jpg?w=xxx
w=xxx 就是客户端传的动态参数,目前还无法适配这种业务需求。
案例:BadRequest
分析:
先利用 imagemagic 的 convert 命令看下原图的格式,如果不在图片处理支持的范围是出会出现这种情况的。通过convert 发现原图是 svg ,所以返回是预期的。
案例:InvalidArgument
分析:
遇到这种参数错误的先看下原图的请求参数
20180899269957.jpg@0w_2e_1l_1an.src
类似这种请求参数的,都是历史 img-cn-xx 域名支持的格式。转换成新的 oss-cn-xxx 域名后是不支持 img 域名的请求方式的。而且老域名是不支持 https 访问的。
案例:图片缩略后颜色变亮了
分析:
- 先分析下原图的编码,可以用开源工具获取,如果原图是 RGB 的话,压缩是不会变色的,如果原图是 CMYK 的话,压缩后会产生偏色。
- 目前对 CMYK 的兼容还在支持中,图片色彩空间被挤压产生的色彩变化。
案例:经过 CDN 后图片处理没有效果
分析:
- 直接看下 CDN 是否开启的去问号的功能,如果开启了忽略 ? 功能就会出现这种问题。
案例:Target bucket does not reside in the same data center as source bucket.
Target bucket does not reside in the same data center as source bucket.
- post 转储时的 bucket 和 header 中的 host 地址不一致,转储要求源 bucket 和目标 bucket 同一个 region ,否则返回 400 。
案例:调用 OSS 处理超过最大旋转范围
<Message>
Picture exceed the maximum allowable rotation range.
</Message>
- 使用 imagemagic 工具先看下原图是否自带了 auto-orient 自适应旋转的属性。
- 或者可以测试下
http://image-demo.oss-cn-hangzhou.aliyuncs.com/f.jpg?x-oss-process=image/auto-orient,0/foramt,jpg
加个 auto-orient,0 参数 如果可以正常处理就说明原图是支持了这个自适应旋转的。 - 带了自适应旋转的参数后,要求图片的宽高不能超过 4096。
案例:
手机端访问 CDN URL ,携带了图片处理,发现访问 CDN 变成空白图片,刷新后又能再次出来,浏览器可以正常显示;
排查:
既然浏览器都可以访问,只有手机端不行,问题已经可以判断出 OSS 是正常的,不然浏览器肯定不会显示正常。
- 1)出现问题后,先剥离 CDN 直接访问 OSS 看下图片是否能否访问,如果 OSS 访问都出现异常,不可能 CDN 会正常,那为什么 CDN 刷新一下就可以显示了呢? 因为 CDN 有缓存,一般这种情况,用户很可能开启了 ”参数过滤“ 功能,将 ? 后边的参数都忽略掉了,这样 CDN 就会命中客户所有的请求。表面上看就是访问 CDN 正常,访问 OSS 异常。
第 1 步排查完后,基本可以定位是哪里的问题,如果 OSS 一直都能访问,而 CDN 访问异常,说明 CDN 节点网络导致加载失败,或者 CDN 缓存了错误内容,如果是 OSS 始终显示不出来,证明图片本身就存在问题了,再向下排查:
- 2)浏览器可以访问了,说明图片本身没有坏,也没有冻结,唯一可能就是图片本身的编码不被手机浏览器支持。通过 ffmpeg 可以看到用户的原图是 webp 格式的。
Input #0, png_pipe, from 'http://oss-cn-shanghai.aliyuncs.com/201811/198c7cf3ac6a4d259ae810e205e2b4bf.jpg?/x-oss-process=style/fm_webp_720p':
Duration: N/A, bitrate: N/A
Stream #0:0: Video: weep, rgb24(pc), 1080x1920 [SAR 5906:5906 DAR 9:16], 25 tbr, 25 tbn, 25 tbc
2.58 M-V: -0.000 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
结论,经过上述排查知道了,图片的格式是 webp ,特点是 ios 默认不支持,android 支持,因为 webp 是 chrome 推出的一个新的图片编码方式。ios 需要自己编译 webp 的支持库才可以。最后参考
https://blog.csdn.net/wsyx768/article/details/78986918
案例:
存储在 OSS 的图片打不开,原图和经过图片处理后的图片都打不开。
排查:
还是先用 imagemagick 这个开源工具看下图片的编码沟通能否正确被解析出来。
[root@edas02 aliyun-oss-php-sdk]# wget https://zhangyb.mobi/test/123.jpg
--2018-11-22 10:55:16-- https://zhangyb.mobi/test/123.jpg
正在解析主机 zhangyb.mobi (zhangyb.mobi)...
已发出 HTTP 请求,正在等待回应... 200 OK
长度:4141232 (3.9M) [image/jpeg]
正在保存至: “123.jpg”
100%[========================================================================================>] 4,141,232 12.5MB/s 用时 0.3s
2018-11-22 10:55:16 (12.5 MB/s) - 已保存 “123.jpg” [4141232/4141232])
[root@edas02 aliyun-oss-php-sdk]# identify 123.jpg
identify: Not a JPEG file: starts with 0x00 0x00 `123.jpg' @ error/jpeg.c/JPEGErrorHandler/316.
[root@edas02 aliyun-oss-php-sdk]#
通过 identity 命令可以确认图片本身的编码构成出现问题,并非是存储到 OSS 出现的问题,类似问题都可以用这个工具先来分析下。
案例:
图片处理完后背景色多了一个分割线
排查:
- 1)图片并没有所谓的分割线,只是图片 RGB 处理后的色彩构成问题。
- 2)原图是 RGB 的真彩色 ImageHeight": {"value": "2560" "ImageWidth": {"value": "1440" ,像素被你 裁剪到 m_fill,h_1920,w_1080 ,RGB 的像素点位被压缩,发生变化很正常。
- 3) 可以将绝对质量提高到 100 , quality,Q_100 ,目前只有这个方法。
案例:
客户图片上传到 OSS 访问报错;
排查:
- 先看图片下载到本地后是否可以打开,如果打不开则证明是图片本身的问题,和 OSS 图片处理没关系;
- 实际访问下测试看看是否有报错,如果看到有明显的 requestID 报错,可以拿 requestID 反馈阿里云查询日志;
- 看下原图是否超过了一些限制,限制如下;
找到问题了,的图片length 超过了我们的 30000 限制;
图片格式只能是:jpg、png、bmp、gif、webp、tiff。
文件大小不能超过 20MB。
使用图片旋转时图片的宽或者高不能超过 4096。
原图单边大小不能超过30,000。
宽高乘机不能超过 4096 * 4096