【问题标题】:Why does a SolidBrush result in a patterned image?为什么 SolidBrush 会产生带图案的图像?
【发布时间】:2010-09-22 01:00:30
【问题描述】:

我正在尝试在 HttpHandler 中动态生成指定大小和颜色的 gif 图像。出于某种原因,生成的图像使用的是抖动的颜色模式,而不是我期望 SolidBrush 创建的纯色。以下代码是我能找到的最简单的暴露问题的代码。

private void GenerateSquareImage(String filename, String color, Int32 width)
{
    Bitmap img = new Bitmap(width, width);
    Graphics g = Graphics.FromImage(img);
    SolidBrush brush = new SolidBrush(ColorTranslator.FromHtml("#" + color));

    g.FillRectangle(brush, 0, 0, width, width);

    img.Save(filename, System.Drawing.Imaging.ImageFormat.Gif);
    img.Dispose();

    brush.Dispose();
    g.Dispose();
}

这是我在颜色参数中传递“415976”时得到的结果示例:

imageshack http://img148.imageshack.us/img148/8936/colorcb5.png

(左边的块是一个HTML SPAN,背景颜色设置为#415976。右边的块是我的图形,你可以看到抖动的颜色。)

如果我使用这段代码,结果是一样的:

g.Clear(ColorTranslator.FromHtml("#" + color));

代替上述方法中的 g.FillRectangle 调用。

更新:默认情况下,如果对位图进行任何编程更改,GDI+ 会使用web safe palette 保存 GIF。这就是导致我的非安全调色板颜色抖动的原因。我能够修改下面 Marco 的帖子 (http://msdn.microsoft.com/en-us/library/aa479306.aspx) 中引用的代码,以修改我新创建的图像上的调色板,从而尊重我的颜色。

【问题讨论】:

    标签: .net graphics colors gif


    【解决方案1】:

    据我所知,GIF 文件仅限于 256 种颜色,因此它采用抖动处理。 PNG 可能是您需要的格式。

    或者您可以查看here 的解决方案,使用复杂的量化器来构建自定义调色板(我不对链接中的代码负责,我自己从未尝试过)。

    这个other link from Microsoft对问题有深入的分析。

    希望这会有所帮助。

    【讨论】:

    • 查看我对原始问题的更新。这个答案最终为我指明了解决方案。
    【解决方案2】:

    IIRC GIF 仅限于 .NET 上的特定调色板。有一些解决方法,但它们超出了我的理解。

    【讨论】:

      猜你喜欢
      • 2015-01-26
      • 1970-01-01
      • 2017-02-09
      • 1970-01-01
      • 2017-11-14
      • 1970-01-01
      • 1970-01-01
      • 2023-02-23
      相关资源
      最近更新 更多