2009年8月19日 星期三

PNG秀圖的處理

首先看看底下這張PNG格式圖檔,正確顯示結果應該如下原圖所示。


載入後以API AlphaBlend作Per-Pixel Alpha Blend如下所示,結果是不正確。


檢查AlphaBlend規格發現,以AlphaBlend作Per-Pixel Alpha Blend時,會以底下公式計算每一個像素的值。

Dst.Red = Src.Red + (1 - Src.Alpha) * Dst.Red;
Dst.Green = Src.Green + (1 - Src.Alpha) * Dst.Green;
Dst.Blue = Src.Blue + (1 - Src.Alpha) * Dst.Blue;

要作正確PNG秀圖(或者說有帶Alpha Channel的圖),底下列出虛擬碼。

if (255 == Src.Alpha)
{
Dst.Red = Src.Red;
Dst.Green = Src.Green;
Dst.Blue = Src.Blue;
}
else if (0 != Src.Alpha)
{
Dst.Red = Src.Red * Src.Alpha + (1 - Src.Alpha) * Dst.Red;
Dst.Green = Src.Green * Src.Alpha + (1 - Src.Alpha) * Dst.Green;
Dst.Blue = Src.Blue * Src.Alpha + (1 - Src.Alpha) * Dst.Blue;
}

;

AlphaBlend測試代碼:
BLENDFUNCTION bf;
bf.BlendOp = AC_SRC_OVER; // 目前僅支援此操作.
bf.BlendFlags = 0; // 必須為0
bf.SourceConstantAlpha = 255; // 使用Per-Pixel Alpha
bf.AlphaFormat = AC_SRC_ALPHA; // 使用Per-Pixel Alpha

dc.AlphaBlend(0, 0, sz.cx, sz.cy, memdc, 0, 0, sz.cx, sz.cy, bf);

沒有留言:

張貼留言

Related Posts Plugin for WordPress, Blogger...