一种简洁的为图片设置Logo的算法,支持透明度选项

来源:互联网 发布:淘宝重新拆分订单 编辑:程序博客网 时间:2024/06/08 13:18

之前提到的算法是基于原理性的,代码比较繁琐。最近看到一个用色彩矩阵的例子,觉得很简洁,分享一下。原理就不多说了,因为线性代数什么的早就放弃了 :D

 

 

        /// <summary>
        /// 合并图片,支持透明度选项
        /// </summary>
        /// <param name="b0">原始图</param>
        /// <param name="b1">LOGO图</param>
        /// <param name="val">透明度,取值[0,1],数值越大LOGO越不透明</param>
        /// <param name="x">LOGO在原始图上的起始位置X</param>
        /// <param name="y">LOGO在原始图上的起始位置Y</param>
        /// <returns>完成后的贴图</returns>
        public Bitmap SetLogo(Bitmap b0,Bitmap b1,float val,int x,int y)
        {
            if (b0 == null) return null;
            if (b1 == null) return b0;

            Graphics g = null;

            try
            {
               g = Graphics.FromImage(b0);

                float[][] data =
                {
                    new float[] {1f,0f,0f,0f,0f},
                    new float[] {0f,1f,0f,0f,0f},
                    new float[] {0f,0f,1f,0f,0f},
                    new float[] {0f,0f,0f,val,0f},
                    new float[] {0f,0f,0f,0f,1f}
                };

                ColorMatrix mx = new ColorMatrix(data);

                ImageAttributes imgatt = new ImageAttributes();
                imgatt.SetColorMatrix(mx, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);

                g.DrawImage(b1, new Rectangle(x, y, b1.Width, b1.Height), 0, 0, b1.Width, b1.Height, GraphicsUnit.Pixel, imgatt);

                return b0;
            }
            catch
            {
                return null;
            }
            finally
            {
                if (g != null) g.Dispose();
            }

        }

原创粉丝点击