Saturday, September 20, 2014

Premultiplied Alpha

CGImageCreate內的參數有一個是CGBitmapInfo,
是這樣宣告而來的,
private let bitmapInfo:CGBitmapInfo = CGBitmapInfo(CGImageAlphaInfo.PremultipliedFirst.toRaw())
點過去看會發現,會發現有8種設定,
enum CGImageAlphaInfo : UInt32 {
    case None /* For example, RGB. */
    case PremultipliedLast /* For example, premultiplied RGBA */
    case PremultipliedFirst /* For example, premultiplied ARGB */
    case Last /* For example, non-premultiplied RGBA */
    case First /* For example, non-premultiplied ARGB */
    case NoneSkipLast /* For example, RBGX. */
    case NoneSkipFirst /* For example, XRGB. */
    case Only /* No color data, alpha data only */
}

這時就看到一個陌生的單字"premultiplied",
請教google大神的翻譯,結果翻譯成中文是"預乘",
這翻譯應該還是難以理解吧?


先回到 Alpha Channel 來講起,
Alpha Channel 一般稱作不透明度參數(很怪),
當 Alpha 為0%,那它就是完全透明的(看不見),
Alpha 100%則意味著一個完全不透明的像素。

早在膠片時代,電影業就利用背景膠片、前景膠片、Matte膠片做出合成效果。
後來數位化後,Catmull / Smith小組也是使用一樣的觀念,
將 Alpha Channel 和 RGB Channel 並列
後來 Catmull / Smith小組又在 Integral Alpha 的基礎上提出 Premultiplied Alpha
*註解:Matte包含很多層次的透明度

去搜尋了Premultiplied Alpha相關資訊,
會發現很多都是跟後製或是3D Render有關的文章,
而且其中一篇比較完整像是Wiki的文章竟然是用德文寫的,
這邊就先整理出一些目前所了解的部份。

Premultiplied Alpha 最主要的不同點就是不只將透明資訊存在 Alpha Channel,
還將影響到 R、G、B 的 Channel。

簡化網路上的一張說明圖來看就很清楚,如下:


所以如果顏色為#FFFF8060,透明度設為50%,那麼實際保存的會是#80803F1E,
因此 R、G、B Channel 中的任意像素值都不會比 Alpha Channel 中的值來的大。

會這樣做的原因是因為常常在合成兩張圖時會需要將 Alpha Channel 複合到各個 Channel,
因為使用Premultiplied Alpha的圖等於預先處理,可以節省時間,但是這種方式會有失真問題。
下圖可以看到 Premultiplied 的圖,明度會降低。


圖片來源:Premultiplied Alpha

我自己用分別用CGImage 將 CGImageAlphaInfo 設定 PremultipliedFirst 及 First 的結果如下:

Premultiplied很明顯的變色了。


除此之外,一些後製與3D Render的對照圖也可以觀察到不同之處,
像是漸層過渡帶或是邊緣的黑線等等。





最後,如果你需要查看image的bitmapInfo可以這樣做,
回傳的會是數字,可以參考本文最前面的enum CGImageAlphaInfo,
就知道是代表什麼了。
let imageRef = img.CGImage
let bitmapInfo:CGImageAlphaInfo = CGImageGetAlphaInfo(imageRef)
println(bitmapInfo.toRaw())

相關連結:
CoreGraphicsでハマる
Wiki RGBA
Premultiplied_Alpha
Understanding Premultiplied Images
透明像素-Premultiplied Alpha的秘密

2 comments:

  1. Thanks for sharing, nice post!

    Chia sẻ các bạn bí quyết giúp trẻ ăn ngon miệng hơn và nhiều hơn hay trò chơi giúp trẻ học tiếng anh tạo cảm giác thú vị cho bé hay cách giúp trẻ hạ sốt nhanh mẹ nên biết hay chia sẻ các mẹ trẻ ăn nhiều bí đỏ có tốt không hay khi trẻ bi táo bón thì trẻ sơ sinh bị táo bón nên uống sữa gì hay bé uống loại sữa bé uống sữa pediasure thường xuyên có được không hay loại sữa sữa dielac pedia có tốt không sữa dielac pedia gia bao nhieu hay sữa dumex gold có tốt không sữa dumex gold giá bao nhiêu hay loại sữa dê vitacare có tốt không hay sữa frisolac gold co tot khong giá bao nhiêu tiền hay loại sữa sữa meiji nhật có tốt không sữa meiji nhật giá bao nhiêu hay Fecafovit giá bao nhiêu tiền hay sữa rửa mặt sữa rửa mặt Cetaphil trị mụn có tốt không hay đang ăn cơm mà gãy đũa có xui không hay báo hiệu có điềm gì không hay sắp 30 4 nên đi du lịch ở đâu 30 4 1 5 đi chơi ở đâu hay 30 4 1 5 năm 2016 được nghỉ mấy ngày và giỗ tổ hùng vương 2016 nghỉ mấy ngày.

    ReplyDelete
  2. - Bạn ra đường và gặp phải rắn. Bạn không biết điều gì xảy ra với mình. Thì với bài viết Gặp rắn bò vào nhà là điềm báo gì sẽ giúp bạn giải tỏa nỗi lo ây ấy nhé.

    - Bạn đã biết khá nhiều về chợ kim biên. Nhưng bạn vẫn không biết rằngChợ kim biên nằm ở đâu và bạn đang tìm câu trả lời cho chúng. Vậy bạn đã tìm đúng rồi đấy.

    - Dây chuyền của bạn bị xỉn màu. Bạn đang muốn chúng tôi sẽ giúp bạncách làm sáng bạc bằng nước rửa bát đúng không nào. Yên tâm chúng tôi đã đến và sẽ giúp bạn.

    - Bạn yêu thích chơi game và đang tìmtên nhân vật game kiếm hiệp hay để bạn có thể thỏa sức tung hoành chốn giang hồ.

    - Bạn muốn ra viếng bác vào dịp kỷ niệm ngày giải phóng miền nam. Nhưng bạn không biết rằng 30 4 Lăng Bác có mở cửa không bao nhiêu tiền vậy hãy theo chân tôi nhé

    ReplyDelete