1

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

color パラメーターに「415976」を渡したときに得られる結果のサンプルを次に示します。

イメージシャック http://img148.imageshack.us/img148/8936/colorcb5.png

(左側のブロックは、背景色が #415976 に設定された HTML SPAN です。右側のブロックは私のグラフィックで、ディザリングされた色を確認できます。)

このコードを使用した場合、結果は同じです。

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

上記のメソッドの g.FillRectangle 呼び出しの代わりに。

更新:デフォルトでは、ビットマップにプログラムによる変更が加えられた場合、GDI+ はWeb セーフ パレットを使用して GIF を保存します。これが、安全でないパレットの色がディザリングされる原因でした。以下の Marco の投稿 ( http://msdn.microsoft.com/en-us/library/aa479306.aspx ) で参照されているコードを変更して、新しく作成した画像のパレットを変更し、色が尊重されるようにすることができました。

4

2 に答える 2

2

私の知る限り、GIF ファイルは 256 色に制限されているため、ディザリングに頼っています。PNG はおそらく必要な形式です。

または、ここで、複雑な量子化器を使用してカスタム パレットを作成するソリューションを探すこともできます(リンク内のコードについては責任を負いません。自分で試したことはありません)。

Microsoft からのこの他のリンクには、問題の詳細な分析があります。

お役に立てれば。

于 2008-11-12T20:14:56.290 に答える
0

IIRC GIFは、.NET上の特定のパレットに制限されています。回避策はありますが、私の理解を超えていました。

于 2008-11-12T18:38:38.513 に答える