【问题标题】:Halftone effect in with gdi+gdi+ 中的半色调效果
【发布时间】:2012-01-16 15:52:14
【问题描述】:

如何在 GDI+ 中模仿 this 半色调效果?

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

【问题讨论】:

  • 不是半色调,像素大小不可变。这是一个有图案的抖动。印刷机算法是秘密的。
  • @HansPassant:嗯……好吧。手指交叉有人会传播爱。
  • 嗯,你为什么不直接实现它呢?没有任何内置的东西可以让它变得容易。放大图像以查看图案。
  • 如果可以的话,我不会问我会怎么做的问题。

标签: c# gdi+


【解决方案1】:

我试了一下,得到了这个结果:

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

  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);
                }
        }

然后我使用this technique 将它施加在过饱和位图上。

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

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

  • 在 bmpA 中绘制一个彩色/效果版本
  • 将其他颜色/效果版本绘制到 bmpB 中
  • 在 bmpMask 中创建蒙版(黑白)
  • 使用 transferOneARGBChannelFromOneBitmapToAnother 方法。
  • 在 bmpA 上绘制 bmpB(因为 bmpB 现在有透明部分)
  • 结果现在是 bmpA。 bmpB 和 bmpMask 可以被释放。

完成

【讨论】:

  • 为此干杯。效果很好,看起来像我可以使用的东西。我在您博客的示例代码中注意到 codetransferOneARGBChannelFromOneBitmapToAnother 方法使用了不安全的代码。这些东西主要用于 Web 开发,所以中等信任对我来说是必须的。您是否有不使用不安全代码的方法示例?
  • 更改非常简单。这是将位图字节移出普通字节[]然后再移回的代码:msdn.microsoft.com/en-us/library/5ey6h79d(v=vs.80).aspx
  • 以下是更改饱和度的方法:bobpowell.net/imagesaturation.htm。亮度和对比度也可以使用颜色矩阵来实现。
  • 你不会碰巧还有你写来测试这个的应用程序吧?我正在重温它,我迷路了。
  • 对不起,没有。不是我可以毫无困难地找到它的地方。但是,如果您有任何代码要分享,我可以尝试指导您。
猜你喜欢
  • 2017-06-24
  • 1970-01-01
  • 2011-10-19
  • 1970-01-01
  • 2012-04-29
  • 2018-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多