gdi+ 中的半色调效果

Jam*_*uth 5 c# gdi+

我将如何在 GDI+ 中模仿这种半色调效果?

它几乎看起来像是Floyd-Steinberg抖动版本的图像覆盖了一个完整的图像,但我不相信。

在此处输入图片说明

Dan*_*röm 5

我试了一下,得到了这个结果: 在此处输入图片说明

这可能是一个开始的地方。我是这样做的:

  1. 绘制低饱和度的原图(使用颜色矩阵)
  2. 使用图案蒙版(即点)以高饱和度将原始图像绘制到 1) 上

我创建了这样的图案蒙版:

        using (var g = Graphics.FromImage(bmpPattern))
        {
            g.Clear(Color.Black);
            g.SmoothingMode = SmoothingMode.HighQuality;
            for (var y = 0; y < bmp.Height; y += 10)
                for (var x = 0; x < bmp.Width ; x += 6)
                {
                    g.FillEllipse(Brushes.White, x, y, 4, 4);
                    g.FillEllipse(Brushes.White, x + 3, y + 5, 4, 4);
                }
        }
Run Code Online (Sandbox Code Playgroud)

然后我使用这种技术将它强加在过饱和的位图上。

更新:详细说明图像如何合并。让我们更一般地讨论一下,假设我们想使用图案蒙版组合同一图像的两个不同着色版本,从而产生一个新图像 - 我们可以这样做:

创建三个新的位图,它们的大小都与原始图像相同。称它们为 bmpA、bmpB 和 bmpMask。

  • 在 bmpA 中绘制一个彩色/效果版本
  • 将其他颜色/效果版本绘制到 bmpB 中
  • 在 bmpMask 中创建蒙版(黑白)
  • 使用 transferOneARGBChannelFromOneBitmapToAnother 方法将 bmpMask 的 R/G/B 通道之一推入 bmpB 的 alpha 通道。
  • 在 bmpA 上绘制 bmpB(因为 bmpB 现在有透明部分)
  • 结果现在是 bmpA。bmpB 和 bmpMask 可以处理。

完毕