首先看看底下這張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測試代碼:
載入後以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);
留言
張貼留言