OSS 图片处理

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,内容安全 1000次 1年
对象存储 OSS,恶意文件检测 1000次 1年
简介: 背景 针对 OSS case 的基础排查,以及如果查看图片基础原始参数进行故障定位 必要信息 处理图片的需求请描述清楚 图片处理的原图链接 图片处理后的链接 查看图片原基础参数 示例:http://zhangyb.
作者:张医博

背景

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

必要信息

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

查看图片原基础参数

image.png

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

案例: Picture exceed the maximum allowable rotation range

分析:

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

image.png

我们在看下图片的原参数的宽高,可知道已经超过了我们的单边限制 4096X4,所以出现不能旋转的异常,对于这种问题,我们先要想自适应关闭,然后在用 resize 处理图片。

案例:OSS图片尺寸超限

分析:

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

image.png

结论:

根据报错信息判断是图片超过显示,我们请求一下图片的原始信息看下是否超过限制。通过 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文字水印, 一个文字水印 是否可以分两行显示文字,如果不可以,是否可以一个图片 添加多个文字水印

  • 文件水印分行显示:不支持
  • 添加多个文字水印:支持

实例:http://image-demo.img-cn-hangzhou.aliyuncs.com/example.jpg?x-oss-process=image/resize,w_300,h_300/watermark,type_d3F5LXplbmhlaQ,size_30,text_SGVsbG8g5Zu-54mH5pyN5YqhIQ,color_FFFFFF,shadow_50,t_100,g_se,x_10,y_10/watermark,type_d3F5LXplbmhlaQ,size_30,text_SGVsbG8g5Zu-54mH5pyN5YqhIQ,color_FFFFFF,shadow_50,t_100,g_se,x_100,y_100

案例:图片水印合成出现黑线

image.png

分析:

首先这个黑印不是因为 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 的值不固定按实际效果调整大小。

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缩略之后尺寸变大了?

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

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

image.png

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

  • 用户的源文件在本地可以正常打开,但是上传到到 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 的效果
image.png

这通过 CDN 访问的效果
image.png

分析:

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

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

请求范本

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

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

案例:BadRequest

image.png

分析:

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

案例:InvalidArgument

image.png

分析:

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

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

image.png

image.png

分析:

  • 先分析下原图的编码,可以用开源工具获取,如果原图是 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 变成空白图片,刷新后又能再次出来,浏览器可以正常显示;

image.png

排查:

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

image.png

排查:

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

案例:

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

image.png

排查:

  • 1)图片并没有所谓的分割线,只是图片 RGB 处理后的色彩构成问题。
  • 2)原图是 RGB 的真彩色 ImageHeight": {"value": "2560" "ImageWidth": {"value": "1440" ,像素被你 裁剪到 m_fill,h_1920,w_1080 ,RGB 的像素点位被压缩,发生变化很正常。
  • 3) 可以将绝对质量提高到 100 , quality,Q_100 ,目前只有这个方法。

案例:

客户图片上传到 OSS 访问报错;

image.png

排查:

  • 先看图片下载到本地后是否可以打开,如果打不开则证明是图片本身的问题,和 OSS 图片处理没关系;
  • 实际访问下测试看看是否有报错,如果看到有明显的 requestID 报错,可以拿 requestID 反馈阿里云查询日志;
  • 看下原图是否超过了一些限制,限制如下;
找到问题了,的图片length 超过了我们的 30000 限制;
图片格式只能是:jpg、png、bmp、gif、webp、tiff。
文件大小不能超过 20MB。
使用图片旋转时图片的宽或者高不能超过 4096。
原图单边大小不能超过30,000。
宽高乘机不能超过 4096 * 4096
相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
相关文章
|
存储 数据可视化 安全
一张图的七十二变——阿里云OSS图片处理实践
      小张是某视频网站的新入职的UED,日常工作就是创作各式各样的海报banner。踌躇满志的小张,上了三天班就蔫了。因为他在完成一张图的创作后,还需要考虑:• 同一张图会以不同的形式应用于网站各处:有时候需裁剪成不同形状,有时需要加水印,有时需转换格式....• 为了风格统一,不同的图需要保持样式统一:不同图片排列组成成一组,每组图片风格(
2416 0
|
对象存储 数据安全/隐私保护 数据处理
对象存储OSS如何进行图片处理?
阿里云对象存储服务提供图片处理功能,您可以将常用的图片处理操作保存成样式。一个复杂的操作利用样式功能后,使用一个很短的URL链接就能实现相同的效果。下面我们来介绍一下如何使用图片样式功能。 首先登录阿里云对象存储控制台,选择目标存储空间。
5054 0
|
存储 域名解析 缓存
使用 OSS 图片处理服务|学习笔记
快速学习使用 OSS 图片处理服务
1244 0
|
对象存储 数据安全/隐私保护 存储
【OSS】对象存储-图片处理
帮您快速掌握对象存储图片处理功能。
5891 0
|
PHP 数据安全/隐私保护 对象存储
oss php sdk+laravel搭建图片处理静态网站
结合oss的图片处理功能介绍如何利用oss搭建一个低成本高性能的静态服务器
9033 0
|
对象存储 CDN 数据安全/隐私保护
|
4月前
|
机器学习/深度学习 人工智能 专有云
人工智能平台PAI使用问题之怎么将DLC的数据写入到另一个阿里云主账号的OSS中
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
16天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
3月前
|
存储 机器学习/深度学习 弹性计算
阿里云EMR数据湖文件系统问题之OSS-HDFS全托管服务的问题如何解决
阿里云EMR数据湖文件系统问题之OSS-HDFS全托管服务的问题如何解决

热门文章

最新文章