版权声明:此为个人学习与研究成果,若需转载请提前告知。 https://blog.csdn.net/weixin_35811044/article/details/84258858
讲到透明,可以先说几种常见的彩色图像深度标准:
- 8位色,每个像素所能显示的彩色数为2的8次方,即256种颜色。
- 16位增强色,16位彩色,每个像素所能显示的彩色数为2的16次方,即65536种颜色。
- 24位真彩色,每个像素所能显示的彩色数为24位,即2的24次方,约1680万种颜色。
- 32位真彩色,即在24位真彩色图像的基础上再增加一个8位表示图像256级透明度的Alpha通道。
当然也可以各种比如16位,5位R、5位G、5位B,还有1位为Alpha通道,这样就只有透明或者不透明两种情况。
图像的透明度是相对的,即一张图的透明程度是与另一张图作为对照的结果。通常我们使用电脑工具看到的图像透明都是以背景为对照的。其原理其实就是,两张图叠加,A为前景图,B为背景图。此时透明度为alpha,那么A图RGB分量占alpha,B图RGB分量占(1-alpha),两者之和即为新图的RGB分量,也就是我们看到的透明图,这里前后景是按100%分配当然你也可以按256分配,把握好比例就行:
R(C)=(1-alpha)*R(B)+alpha*R(A)
G(C)=(1-alpha)*G(B)+alpha*G(A)
B(C)=(1-alpha)*B(B)+alpha*B(A)
C#代码实现:
//图像透明度
public Bitmap alphaImage(Bitmap fImage,Bitmap bImage,double alpha)
{
//输入fImage为前景图,bImage为背景图,alpha为透明度
int height = fImage.Height;
int width = bImage.Width;
Bitmap aImage = new Bitmap(width, height, PixelFormat.Format24bppRgb);
for (int y = 0; y < height; y++)
{
for(int x = 0; x < width; x++)
{
int Ra = (int)Math.Round((1 - (alpha / 100.0)) * fImage.GetPixel(x, y).R + (alpha / 100.0) * bImage.GetPixel(x, y).R);
int Ga = (int)Math.Round((1 - (alpha / 100.0)) * fImage.GetPixel(x, y).G + (alpha / 100.0) * bImage.GetPixel(x, y).G);
int Ba = (int)Math.Round((1 - (alpha / 100.0)) * fImage.GetPixel(x, y).B + (alpha / 100.0) * bImage.GetPixel(x, y).B);
Color RGB = Color.FromArgb(Ra, Ga, Ba);
aImage.SetPixel(x, y, RGB);
}
}
return aImage;
}
仅为个人理解,如有不足,请指教。 https://blog.csdn.net/weixin_35811044