透明像素-Premultiplied Alpha的秘密
Premultiplied Alpha的秘密
我得承認題目有點標題黨的意思,自從Flash播放器采用了BitmapData以來,Flash采用一種叫做Premultipled Alpha的技術來存儲透明的像素。但是它還是有點...為了避免你覺得我啰里巴索你可以直接去檢查示例程序,? check out the demo right away ?如果沒看懂,呵呵......
"Premultiplied" alpha技術意味著不僅像素的Alpha信息存儲在通道里,而且已經擴張到紅,藍,綠通道里,在實際應用中這意味著如果你保存著 #fff8000橙色,而將其透明度設置為50%,那么實際設置保存的是#80803f00.這意味著顏色通道中的任意像素值都不會比Alpha通道中的值來的大
這樣做的原因是出于性能的考慮,圖像處理算法在復合兩張圖片的時候總是需要將ALPHA通道的信息復合到各個顏色通道,因此如果你需要處理很多的圖像復合時候,這樣的做法就節省了很多的時間,而不需要對每個像素重新進行復合,正如我們所知道的Flash的日常處理中有很多時候都在處理復合,比如重合兩張反鋸齒的直線時就會有復合,有了這樣的處理之后Flash的速度就很快了。
但是也有一個問題,像素是以32位的整數值存儲的,也就是說每個通道有8位或者256種可能的值,另一方面像素的計算通常是以浮點數學的方式進行的,也就是說可能的值要遠大的多,如果通常以浮點處理那很好,但是有些情況下你不得不將浮點的值回寫到像素信息,也就是說比如43.7回寫的時候就會圓整為44或者更糟的43回寫到像素值里面
通常情況下這種小的誤差不會對應用造成很大的麻煩,但是一旦你開始處理小的像素值,那么錯誤就會被基類放大,,例如如果你將一個像素的ALPHA值設置為16那么每一個像素都會被乘上一個因子16/256=0.0625,因此灰色像素就會變成128*0.0625=8 暗像素64就會變成4,但是稍微亮一點的像素如67也會變成4,注意沒有小數這是圓整后的結果,你會發現顏色種類減少了,從原來的256×256×256減少到8*8*8,嚴重的問題
如果你將ALPHA值保持設置為8那么不會有太大的問題,如果你增大ALPHA值,那么災難就出現了,大量的顏色信息由于進度原因會丟失,而且無法修復。
為了解釋清楚到底是怎么回事我設置了一個Demo?demo that visualizes the amount of information loss來解釋。它先將圖像的Alpha通道設置為一個選定值,然后再設置回255,你所觀察到的現象正好說明了,當Alpha值很小的時候會有些海報斑駁效果,即使你將像素設置為254,你也會發現顏色丟失的現象(復選 觀察數據丟失復選框)該復選框會對比顏色丟失和未丟失的情況,由于有的時候丟失不是很明顯,DEMO將該丟失放大了以增強了對比度
那要怎樣才能保存顏色信息呢,你只有慢慢來,效率和質量不可兼得么,將Alpha信息和像素分開存儲,也就是說你維護著三張Bitmap一張存儲顏色信息,一張存儲Alpha值,第三章存儲兩者復合后的結果。
總結
以上是生活随笔為你收集整理的透明像素-Premultiplied Alpha的秘密的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java宠物网站系统的设计与实现
- 下一篇: 近200篇机器学习深度学习资料分享(含各