作者:張醫博
背景
針對 OSS case 的基礎排查,以及如果查看圖片基礎原始參數進行故障定位
必要信息
- 處理圖片的需求請描述清楚
- 圖片處理的原圖鏈接
- 圖片處理後的鏈接
查看圖片原基礎參數
示例:http://zhangyb.oss-cn-shanghai.aliyuncs.com/1.jpg?x-oss-process=image/info
遇到問題時,如果有明顯的參數超過顯示等問題,可以先看下原始參數中的信息,是否有超標,類似如下原始參數中的寬、高、像素、等等,(我們已知的 OSS 單邊長度不能超過 4X4096 ,乘積不能低於 4096X4096 )
案例: Picture exceed the maximum allowable rotation range
分析:
出現這種問題基本都是原圖的單邊長度超過了 4096 的限制。或者四邊乘機超過了 406X4096 ,可以用 OSS 的 ?x-oss-process=image/info 參數獲取圖片的信息判斷是否超過限制。
我們在看下圖片的原參數的寬高,可知道已經超過了我們的單邊限制 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 參數。
結論:
根據報錯信息判斷是圖片超過顯示,我們請求一下圖片的原始信息看下是否超過限制。通過 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 的域名後,需要按照新的方式來處理,如下
案例:為何圖片經過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