C# 半色调效果与gdi+;

C# 半色调效果与gdi+;,c#,gdi+,C#,Gdi+,我将如何在GDI+中模拟半色调效果 它看起来几乎像是覆盖了完整图像的抖动版本,但我不相信 我尝试了一下,得到了这样的结果: 这可能是一个开始。我是这样做的: using (var g = Graphics.FromImage(bmpPattern)) { g.Clear(Color.Black); g.SmoothingMode = SmoothingMode.HighQuality; fo

我将如何在GDI+中模拟半色调效果

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


我尝试了一下,得到了这样的结果:

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

        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);
                }
        }
  • 以低饱和度绘制原始图片(使用颜色 矩阵)
  • 将原始图像以高饱和度绘制到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);
                    }
            }
    
    使用(var g=Graphics.FromImage(bmpPattern))
    {
    g、 清晰(颜色为黑色);
    g、 SmoothingMode=SmoothingMode.HighQuality;
    对于(变量y=0;y
    然后我把它用在过饱和的位图上

    更新:详细说明图像是如何合并的。让我们更笼统地说,我们希望使用图案遮罩将同一图像的两个不同彩色版本组合起来,生成一个新图像-我们可以这样做:

            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);
                    }
            }
    
    创建三个与原始图像大小相同的新位图。称它们为bmpA、bmpB和bmpMask

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

    完成

    这不是半色调,像素大小不可变。这是一种有模式的抖动。印刷机算法是秘密的。@HansPassant:Hmmm。。。那好吧。祈祷有人会传播爱。嗯,你为什么不去实现它呢?没有什么内置的东西可以让它变得简单。放大图片查看图案。如果可以的话,我不会问关于如何处理的问题。为此干杯。效果很好,看起来我可以用。我注意到,在您博客中的示例代码中,方法
    code
    transferOneArgbChannel从一个位图转换到另一个使用了不安全代码。这些东西主要用于web开发,所以中等信任度对我来说是必须的。您是否有一个不使用不安全代码的方法的示例?更改非常简单。下面是将位图字节移出到普通字节[]然后再返回的代码:下面是如何更改饱和度:。亮度和对比度也可以通过使用颜色矩阵来实现。你不会碰巧还有你编写的应用程序来测试它吧?我正在重访它,我迷路了。对不起,不。不是在我可以找到它的地方。但是如果你有任何代码可以分享,我可以试着指导你。