图像处理(Image Processing) ---------- 图像透明度 (C#实现)

版权声明:此为个人学习与研究成果,若需转载请提前告知。 https://blog.csdn.net/weixin_35811044/article/details/84258858

 讲到透明,可以先说几种常见的彩色图像深度标准:

  1. 8位色,每个像素所能显示的彩色数为2的8次方,即256种颜色。
  2. 16位增强色,16位彩色,每个像素所能显示的彩色数为2的16次方,即65536种颜色。
  3. 24位真彩色,每个像素所能显示的彩色数为24位,即2的24次方,约1680万种颜色。
  4. 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

猜你喜欢

转载自blog.csdn.net/weixin_35811044/article/details/84258858