PNG格式為何不支持Premultiplied Alpha?

本文首先敘述一段經(jīng)歷,然后得出結(jié)論,想看結(jié)論的可以直接跳到最后

經(jīng)歷

用一張帶Alpha通道的PNG圖片作為原始輸入,然后用常用的PNG圖片壓縮工具pngquant處理得到壓縮后的圖片

Original (144 KB).png
Compressed (39 KB).png

(圖片來源: super-mario-odyssey-switch)

壓縮后圖片從144 KB減小到39KB,而且?guī)缀跤^察不到區(qū)別,但這不是本文重點

接下來使用結(jié)構(gòu)相似性算法(Structural Similarity Index,SSIM)求出兩張圖片的相似程度,主要的Python代碼如下(Python 3.8)

from skimage import io, metrics

original_image = io.imread('Original(144 KB).png')
compressed_image = io.imread('Compressed (39 KB).png')

value = metrics.structural_similarity(original_image, compressed_image, multichannel=True)
print('ssim value: %f'%value)

然而求出的相似程度居然只有69%,讓我對結(jié)果產(chǎn)生懷疑。仔細研究一番后發(fā)現(xiàn)某些像素點的RGB值在壓縮之后產(chǎn)生了非常巨大的變化。Alpha等于零的像素,無論它的RGB值是多少,該像素最終都不可見。據(jù)此推斷,壓縮算法利用這個特點,在Alpha等于零的情況下大幅調(diào)整RGB以進一步對圖像進行壓縮

因此,進行圖片相似度評價之前,應(yīng)該將RGB值預(yù)先乘以Alpha值,調(diào)整后的代碼如下

from skimage import io, metrics

def premultiply_alpha(image):
    height = image.shape[0]
    width = image.shape[1]
    for y in range(height):
        for x in range(width):
            pixel = image[y, x]
            alpha = pixel[3]
            factor = alpha / 255
            image[y, x, 0] *= factor    # Red
            image[y, x, 1] *= factor    # Green
            image[y, x, 2] *= factor    # Blue

original_image = io.imread('Original(144 KB).png')
compressed_image = io.imread('Compressed (39 KB).png')

premultiply_alpha(original_image)
premultiply_alpha(compressed_image)

value = metrics.structural_similarity(original_image, compressed_image, multichannel=True)
print('ssim value: %f' % value)

最終得到圖片壓縮前后的相似性是98%

結(jié)論

回答標題的問題,PNG格式不支持Premultiplied Alpha原因(不一定準確)

  • 對PNG格式而言,(0, 0, 0, 0) 與 (100, 100, 100, 0)沒有區(qū)別,因為它們最終都不可見
  • 對Premultiplied Alpha而言,RGB值需要預(yù)先乘以Alpha,因此(100, 100, 100, 0)是不存在的像素,因為RGB在乘以0之后不可能還是100
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 卷首語 歡迎來到 objc.io 的第三期! 這一期都是關(guān)于視圖層的。當(dāng)然視圖層有很多方面,我們需要把它們縮小到幾...
    評評分分閱讀 1,926評論 0 18
  • 參考PNG、EPS、bmp、jpg等幾種圖片格式有什么區(qū)別GIF/PNG/JPG和WEBP/base64/apng...
    合肥黑閱讀 13,058評論 0 15
  • 談?wù)?iOS 中圖片的解壓縮 FEB 20TH, 2017 10:47 AM 對于大多數(shù) iOS 應(yīng)用來說,圖片往...
    Dev_hell03W閱讀 535評論 0 0
  • 對于大多數(shù) iOS 應(yīng)用來說,圖片往往是最占用手機內(nèi)存的資源之一,同時也是不可或缺的組成部分。將一張圖片從磁盤中加...
    nongjiazhen閱讀 1,475評論 0 5
  • ——————————————————轉(zhuǎn)載自雷純鋒的技術(shù)博客 對于大多數(shù) iOS 應(yīng)用來說,圖片往往是最占用手機內(nèi)存...
    woshishui1243閱讀 586評論 0 2

友情鏈接更多精彩內(nèi)容