Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 为什么SolidBrush会生成有图案的图像?_.net_Graphics_Colors_Gif - Fatal编程技术网

.net 为什么SolidBrush会生成有图案的图像?

.net 为什么SolidBrush会生成有图案的图像?,.net,graphics,colors,gif,.net,Graphics,Colors,Gif,我试图在HttpHandler中动态生成指定大小和颜色的gif图像。由于某种原因,图像是用抖动的颜色模式生成的,而不是我期望的SolidBrush创建的纯色。下面的代码是我能找到的暴露问题的最简单的代码 private void GenerateSquareImage(String filename, String color, Int32 width) { Bitmap img = new Bitmap(width, width); Graphics g = Graphics.

我试图在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”时得到的结果示例:

(左侧的块是背景色设置为#415976的HTML跨距。右侧的块是我的图形,您可以在其中看到抖动的颜色。)

如果我使用以下代码,结果是相同的:

g.Clear(ColorTranslator.FromHtml("#" + color));
代替上面方法中的g.FillRectangle调用


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

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

据我所知,GIF文件的颜色限制为256色,因此它需要抖动。 PNG可能是您需要的格式

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

这对问题进行了深入的分析

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

希望这有帮助。

请参阅我对原始问题的更新。这个答案最终为我指明了解决办法。