微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 使用混合模式颜色在另一个图像上绘制图像

在Photoshop中,您可以选择“颜色”(从底部开始的第二个)将混合模式设置为下一个较低层:

如果图像顶部只有一个渐变,结果可能如下所示:

我在某处找到的颜色混合模式的描述是:

颜色将下层的色调和饱和度改变为上层的色调和饱和度,但仅留下亮度.

到目前为止我的代码是:

using(var g = Graphics.FromImage(canvas))
{
    // draw the lower image
    g.DrawImage(lowerImg,left,top);

    // creating a gradient and draw on top
    using (Brush brush = new LinearGradientBrush(new Rectangle(0,canvasWidth,canvasHeight),Color.Violet,Color.Red,20))
    {
        g.FillRectangle(brush,canvasHeight);
    }
}

但那是 – 当然 – 只是在较低的图像上绘画.

所以问题是:

如何使用Photoshop中提供的混合模式“颜色”在另一个图像上绘制图像?

编辑:

为了使我更清楚我想要实现的目标:

如果有人想使用图像进行测试:

解决方法

这是我的解决方案.我使用Rich Newman的 HSLColor类来转换RGB和HSL值.
using (Bitmap lower = new Bitmap("lower.png"))
using (Bitmap upper = new Bitmap("upper.png"))
using (Bitmap output = new Bitmap(lower.Width,lower.Height))
{
    int width = lower.Width;
    int height = lower.Height;
    var rect = new Rectangle(0,width,height);

    BitmapData lowerData = lower.LockBits(rect,ImageLockMode.ReadOnly,PixelFormat.Format24bppRgb);
    BitmapData upperData = upper.LockBits(rect,PixelFormat.Format24bppRgb);
    BitmapData outputData = output.LockBits(rect,ImageLockMode.writeonly,PixelFormat.Format24bppRgb);

    unsafe
    {
        byte* lowerPointer = (byte*) lowerData.Scan0;
        byte* upperPointer = (byte*) upperData.Scan0;
        byte* outputPointer = (byte*) outputData.Scan0;

        for (int i = 0; i < height; i++)
        {
            for (int j = 0; j < width; j++)
            {
                HSLColor lowerColor = new HSLColor(lowerPointer[2],lowerPointer[1],lowerPointer[0]);
                HSLColor upperColor = new HSLColor(upperPointer[2],upperPointer[1],upperPointer[0]);
                upperColor.Luminosity = lowerColor.Luminosity;
                Color outputColor = (Color) upperColor;

                outputPointer[0] = outputColor.B;
                outputPointer[1] = outputColor.G;
                outputPointer[2] = outputColor.R;

                // Moving the pointers by 3 bytes per pixel
                lowerPointer += 3;
                upperPointer += 3;
                outputPointer += 3;
            }

            // Moving the pointers to the next pixel row
            lowerPointer += lowerData.Stride - (width * 3);
            upperPointer += upperData.Stride - (width * 3);
            outputPointer += outputData.Stride - (width * 3);
        }
    }

    lower.UnlockBits(lowerData);
    upper.UnlockBits(upperData);
    output.UnlockBits(outputData);

    // Drawing the output image
}

原文地址:https://www.jb51.cc/csharp/99489.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐