OSS 图片处理

作者:张医博

背景

针对 OSS case 的基础排查,以及如果查看图片基础原始参数进行故障定位

必要信息

  • 处理图片的需求请描述清楚
  • 图片处理的原图链接
  • 图片处理后的链接

查看图片原基础参数

示例:http://zhangyb.oss-cn-shanghai.aliyuncs.com/1.jpg?x-oss-process=image/info

OSS 图片处理

遇到问题时,如果有明显的参数超过显示等问题,可以先看下原始参数中的信息,是否有超标,类似如下原始参数中的宽、高、像素、等等,(我们已知的 OSS 单边长度不能超过 4X4096 ,乘积不能低于 4096X4096 )

案例: Picture exceed the maximum allowable rotation range

分析:

出现这种问题基本都是原图的单边长度超过了 4096 的限制。或者四边乘机超过了 406X4096 ,可以用 OSS 的 ?x-oss-process=image/info 参数获取图片的信息判断是否超过限制。

OSS 图片处理

我们在看下图片的原参数的宽高,可知道已经超过了我们的单边限制 4096X4,所以出现不能旋转的异常,对于这种问题,我们先要想自适应关闭,然后在用 resize 处理图片。(http://zhangyb.oss-cn-shanghai.aliyuncs.com/1.jpg?x-oss-process=image/auto-orient,0/resize,m_lfit,h_2000,w_2000,limit_1/sharpen,100/

案例:OSS图片尺寸超限

分析:

先按要求看下基本的报错信息和原始 URL 参数。

OSS 图片处理

结论:

根据报错信息判断是图片超过显示,我们请求一下图片的原始信息看下是否超过限制。通过 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 图片处理

分析:

首先这个黑印不是因为 OSS 造成的,水印的方式是将两张图片重回,如果水印两张图是不通 RGB 图片,覆盖后色差产生的黑线是正常现象不管用任何图片处理都会存在。

结论:

可以通过透明度参数 t_[1-100] 来调整透明度将边框去掉,t 的值不固定按实际效果调整大小。

https://mt.xiuxiu.com/magicpicture/pic/server/blank.jpg?x-oss-process=image/watermark,image_bWFnaWNwaWN0dXJlL3N0YXJQdXp6bGUvcGljX2hlYXJ0XzEucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLG1fZml4ZWQsd18xMDgwLGhfMTA4MCxsaW1pdF8w,g_nw,x_0,y_0,t_10

案例:通过 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 的域名后,需要按照新的方式来处理,如下

http://test.oss-cn-beijing.aliyuncs.com/MomClass/ChuXin/3_2_336_462.jpg?x-oss-process=image/blur,r_3,s_30

案例:为何图片经过OSS缩略之后尺寸变大了?

参考:https://yq.aliyun.com/articles/74634?spm=5176.10695662.1996646101.searchclickresult.672545f3KE153V

案例:图片处理提示已损坏

OSS 图片处理

出现以下集中情况可以参考如下处理过程

  • 用户的源文件在本地可以正常打开,但是上传到到 OSS 就无法进行图片处理,总是反馈 图片损坏 damage
  • 用户的源文件上传前可以正常显示,上传后无法显示

分析:

  • 以上情况出现后,先获取原始的 OSS URL 地址,然后使用 ?x-oss-process=image/info 先查看下原图信息,如果图片是好的是可以查看出源图片的属性信息的,如果查不到,直接报错, 说用用户原图就是损坏的。
  • 为什么下载到本地可以显示?因为本地的图片查看工具是对图片做了补偿修复的。而 OSS 不对对损坏的图片进行处理,所以在浏览器上无法显示。
  • 可以用开源的 imagemagic 工具来验证这个问题。
    随便进行什么转换,下面是一个 resize 的测试用例,结果发现出现了 error 说明图片是损坏的。

convert -resize 1024x768 1123331261_15353307414801n.jpg

案例:图片处理参数如何加入到 signature

https://oss-de.roe.com.cn/47169215bed7496db34031e6ef1a02d8.jpg?OSSAccessKeyId=LTAIJn79E&Expires=1533650025&Signature=4zIqqhMzE97A2iks7QmYH6I%3D&x-oss-process=image/resize,w_100/quality,q_80

图片处理的参数要放到 signature 一起计算,否则会出现 403 的问题。

案例:存储在 OSS 图片旋转了 90 度

这是直接访问 OSS 的效果
OSS 图片处理

这通过 CDN 访问的效果
OSS 图片处理

分析:

  • 直接访问 OSS 正常,说明 OSS 存储是没问题的。
  • 但是通过 CDN 访问在浏览器中就出现旋转,无非就是和浏览器的处理有关,通过图片处理参数 info 查看原图参数带有 rotation 90 ,旋转参数,cs 代码可以针对这种参数过滤调不做旋转。否则会旋转 90 度。

案例:OSS 能否识别请求的自定义 query 参数动态缩放

请求范本

http://i.1909.com/img01/M00/*.jpg?w=xxx

w=xxx 就是客户端传的动态参数,目前还无法适配这种业务需求。

案例:BadRequest

OSS 图片处理

分析:

先利用 imagemagic 的 convert 命令看下原图的格式,如果不在图片处理支持的范围是出会出现这种情况的。通过convert 发现原图是 svg ,所以返回是预期的。

案例:InvalidArgument

OSS 图片处理

分析:

遇到这种参数错误的先看下原图的请求参数
20180899269957.jpg@0w_2e_1l_1an.src
类似这种请求参数的,都是历史 img-cn-xx 域名支持的格式。转换成新的 oss-cn-xxx 域名后是不支持 img 域名的请求方式的。而且老域名是不支持 https 访问的。

案例:图片缩略后颜色变亮了

OSS 图片处理

OSS 图片处理

分析:

  • 先分析下原图的编码,可以用开源工具获取,如果原图是 RGB 的话,压缩是不会变色的,如果原图是 CMYK 的话,压缩后会产生偏色。
  • 目前对 CMYK 的兼容还在支持中,图片色彩空间被挤压产生的色彩变化。

案例:经过 CDN 后图片处理没有效果

https://bianqian.com/2018/11/01/5225a43d630442c9bbeb6684094544d5.jpg?x-oss-process=image/resize,m_lfit,h_50,w_50/format,png

分析:

  • 直接看下 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>

案例:

手机端访问 CDN URL ,携带了图片处理,发现访问 CDN 变成空白图片,刷新后又能再次出来,浏览器可以正常显示;

OSS 图片处理

排查:

既然浏览器都可以访问,只有手机端不行,问题已经可以判断出 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 的图片打不开,原图和经过图片处理后的图片都打不开。

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 出现的问题,类似问题都可以用这个工具先来分析下。

案例:

图片处理完后背景色多了一个分割线

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 图片处理

排查:

  • 先看图片下载到本地后是否可以打开,如果打不开则证明是图片本身的问题,和 OSS 图片处理没关系;
  • 实际访问下测试看看是否有报错,如果看到有明显的 requestID 报错,可以拿 requestID 反馈阿里云查询日志;
  • 看下原图是否超过了一些限制,限制如下;
找到问题了,的图片length 超过了我们的 30000 限制;
图片格式只能是:jpg、png、bmp、gif、webp、tiff。
文件大小不能超过 20MB。
使用图片旋转时图片的宽或者高不能超过 4096。
原图单边大小不能超过30,000。
宽高乘机不能超过 4096 * 4096
上一篇:.NET 云原生架构师训练营(模块二 基础巩固 REST && RESTful)--学习笔记


下一篇:OSS-视频截帧