日期:2014-05-17  浏览次数:21232 次

png图片如何做类似PS的颜色叠加效果?
如题,在场景上绘制一个png图片,现在想给这个图片增加一种类似photoshop的颜色叠加的效果,请问怎么处理?谢谢。如果透明度可调那是最好。

------解决方案--------------------
OnPaint(e)
{
  e.Graphics.DrawImage(yourPng,xxx);
  Brush brush = new SolidBrush(Color.FromArgb(透明度,Color.Black));
  e.Graphics.FillRectangle(brush,yourPng.Bounds);
}


简单是示意代码,就是在图片上绘制一个半透明层


------解决方案--------------------
MSDN上搜搜 ColorMatrix,调整颜色矩阵,效果类似
------解决方案--------------------


 private void CmdTest_Click(object sender, EventArgs e)
        {
            BlendBitmap((Bitmap)Pic.Image, Color.Red, 100);
            Pic.Invalidate();
        }

        private void BlendBitmap(Bitmap Bmp, Color FillColor, int Opacity = 255)
        {
            int X, Y,Width,Height;
            byte* Pointer;
            int A1,B1,G1,R1;
            int A2,B2,G2,R2,BlendAlpha;
            BitmapData BmpData = Bmp.LockBits(new Rectangle(0, 0, Bmp.Width, Bmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
            /*  LockBits 在第一个参数和图像一样大,以及读取格式和原始一样的情况
            * 下,调用函数的时间为0,且每次调用后BitmapData的Scan0都相同,而在
            * 其他的大部分情况下同样参数调用该函数返回的Scan0都不同,这就说明在
            * 在程序内部,GDI+为在创建图像时还是分配了和对应位图一样大小内存空间,
            * 这样我们就可以再加载时调用一次该函数,并记住Scan0的值,然后直接用
            * 指针操作这一片区域,就相当于操作了图像。而不用每次都LOCK和UNLOCK了
            * 从这个层次上说,该函数和GetDibits类似。
            */
            A2=Opacity;B2=FillColor.B;G2=FillColor.G;R2=FillColor.R;
            Width = Bmp.Width; Height = Bmp.Height;
            for (Y=0;Y<Height;Y++)
            {
                Pointer = (byte *) BmpData.Scan0+ Y * BmpData.Stride;
                for (X=0;X<Width;X++)
                {
          &nbs