图片alpha blending的计算
来源:互联网 发布:游戏推广网站源码 编辑:程序博客网 时间:2024/04/29 15:40
转载时请注明出处和作者联系方式:http://blog.csdn.net/mimepp
作者联系方式:YU TAO <yut616 at sohu dot com>
一幅彩色图像的每个像素用R,G,B三个分量表示,若每个分量用8位,那么一个像素共用3X8=24位表示。
在用32位表示一个像素时,若R,G,B分别用8位表示,剩下的8位常称为α通道(alpha channel)位。它用来表示该像素如何产生特技效果,即通常我们说的半透明。
alpha的取值一般为0到255。
为0时,表示是全透明的,即图片是看不见的。为255时,表示图片是显示原始图的。中间值即为半透明状态。
计算alpha blending时,通常的方法是将源像素的RGB值,分别与目标像素(如背景)的RGB按比例混合,最后得到一个混合后的RGB值。
方法:
在microwindows中也有类似的代码:
如果你使用的数据是YUV数据,那么根据YUV与RGB的转换公式:
也可以直接对YUV应用上面的公式计算alpha blending,不必转换成RGB再混合。
作者联系方式:YU TAO <yut616 at sohu dot com>
一幅彩色图像的每个像素用R,G,B三个分量表示,若每个分量用8位,那么一个像素共用3X8=24位表示。
在用32位表示一个像素时,若R,G,B分别用8位表示,剩下的8位常称为α通道(alpha channel)位。它用来表示该像素如何产生特技效果,即通常我们说的半透明。
alpha的取值一般为0到255。
为0时,表示是全透明的,即图片是看不见的。为255时,表示图片是显示原始图的。中间值即为半透明状态。
计算alpha blending时,通常的方法是将源像素的RGB值,分别与目标像素(如背景)的RGB按比例混合,最后得到一个混合后的RGB值。
方法:
R = ( R_src * alpha + R_dest * (256 - alpha) )/256;
含义即为源与目标各占的百分比。
简化后:
R = ( (R_src * alpha - R_dest * alpha) + R_dest * 256 )/256;
除256,也即右移8,即:
R = (R_src - R_dest) * alpha >> 8 + R_dest;
含义即为源与目标各占的百分比。
简化后:
R = ( (R_src * alpha - R_dest * alpha) + R_dest * 256 )/256;
除256,也即右移8,即:
R = (R_src - R_dest) * alpha >> 8 + R_dest;
在microwindows中也有类似的代码:
fblin32alpha.c
while (--h >= 0) {
for (i = 0; i < w; ++i) {
register unsigned long s;
register unsigned long d;
s = src8[MWI_BYTE_OFFSET_R];
d = dst8[MWI_BYTE_OFFSET_R];
dst8[MWI_BYTE_OFFSET_R] =
(unsigned char) (((s - d) * alpha) >> 8) + d;
s = src8[MWI_BYTE_OFFSET_G];
d = dst8[MWI_BYTE_OFFSET_G];
dst8[MWI_BYTE_OFFSET_G] =
(unsigned char) (((s - d) * alpha) >> 8) + d;
s = src8[MWI_BYTE_OFFSET_B];
d = dst8[MWI_BYTE_OFFSET_B];
dst8[MWI_BYTE_OFFSET_B] =
(unsigned char) (((s - d) * alpha) >> 8) + d;
s = src8[MWI_BYTE_OFFSET_ALPHA];
d = dst8[MWI_BYTE_OFFSET_ALPHA];
dst8[MWI_BYTE_OFFSET_ALPHA] =
(unsigned char) (((s - d) * alpha) >> 8) + d;
dst8 += 4;
src8 += 4;
}
dst8 += dlinelen_minus_w4;
src8 += slinelen_minus_w4;
}
while (--h >= 0) {
for (i = 0; i < w; ++i) {
register unsigned long s;
register unsigned long d;
s = src8[MWI_BYTE_OFFSET_R];
d = dst8[MWI_BYTE_OFFSET_R];
dst8[MWI_BYTE_OFFSET_R] =
(unsigned char) (((s - d) * alpha) >> 8) + d;
s = src8[MWI_BYTE_OFFSET_G];
d = dst8[MWI_BYTE_OFFSET_G];
dst8[MWI_BYTE_OFFSET_G] =
(unsigned char) (((s - d) * alpha) >> 8) + d;
s = src8[MWI_BYTE_OFFSET_B];
d = dst8[MWI_BYTE_OFFSET_B];
dst8[MWI_BYTE_OFFSET_B] =
(unsigned char) (((s - d) * alpha) >> 8) + d;
s = src8[MWI_BYTE_OFFSET_ALPHA];
d = dst8[MWI_BYTE_OFFSET_ALPHA];
dst8[MWI_BYTE_OFFSET_ALPHA] =
(unsigned char) (((s - d) * alpha) >> 8) + d;
dst8 += 4;
src8 += 4;
}
dst8 += dlinelen_minus_w4;
src8 += slinelen_minus_w4;
}
如果你使用的数据是YUV数据,那么根据YUV与RGB的转换公式:
Y = 0.299R + 0.587G + 0.114B
U= (B-Y)*0.565
V= (R-Y)*0.713
U= (B-Y)*0.565
V= (R-Y)*0.713
- 图片alpha blending的计算
- Alpha Blending
- Alpha blending
- Introduction To Alpha Blending
- Alpha-Blending 技术简介
- Alpha-Blending 技术简介
- Alpha-Blending 技术简介
- Alpha-Blending 技术简介
- Alpha-Blending 技术简介
- alpha blending算法
- 转载 Alpha-Blending 技术简介
- MX31 PDK Board Alpha Blending
- ShaderLab Tutorials-Alpha Blending-1
- ShaderLab Tutorials-Alpha Blending-2
- Cg texturing with alpha blending
- alpha blending算法--详细解读
- Unity Shader Alpha混合 Blending
- 【Unity Shaders】Alpha Test和Alpha Blending
- 嵌入式数据库系统Berkeley DB http://www.ibm.com/developerworks/cn/linux/l-embdb/index.html
- 通过JDBC操纵Oracle数据库LOB字段的几种情况分析
- 搞定flashplayer
- SQLServer中数据加密方法
- Blob字段
- 图片alpha blending的计算
- 老了
- C#除法使用须知
- FreeBSD下Apache MPM改用Prefork
- 读孟岩先生的《程序员必须走向专业化》有感
- [转]C Runtime Library
- 59, 60, 61
- 享受奋斗的过程
- C++链表使用完整代码