c# – 使用混合模式颜色在另一个图像上绘制图像
发布时间:2020-12-15 07:46:35 所属栏目:百科 来源:网络整理
导读:在Photoshop中,您可以选择“颜色”(从底部开始的第二个)将混合模式设置为下一个较低层: 如果图像顶部只有一个渐变,结果可能如下所示: 我在某处找到的颜色混合模式的描述是: 颜色将下层的色调和饱和度改变为上层的色调和饱和度,但仅留下亮度. 到目前为止我
在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 } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容