Я пытаюсь динамически создать изображение gif указанного размера и цвета в HttpHandler. По какой-то причине изображение создается с использованием смешанного цветового узора, а не сплошного цвета, который, как я ожидал, создаст 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 + сохраняет GIF-файлы с веб-безопасная палитра, если какие-либо программные изменения были внесены в Bitmap. Это то, что заставляло мою небезопасную палитру искажаться. Мне удалось изменить код, указанный в сообщении Марко ниже (http://msdn.microsoft.com/en-us/library/aa479306.aspx), чтобы изменить палитру на моем только что созданном изображении, чтобы мой цвет соблюдался.





GIF IIRC ограничены определенной паллетой в .NET. Есть обходные пути, но они были выше моего понимания.
Насколько мне известно, файлы GIF ограничены 256 цветами, поэтому они прибегают к сглаживанию. PNG - это, вероятно, тот формат, который вам нужен.
Или вы можете поискать в здесь решение, используя сложный квантователь для создания настраиваемой палитры (я не беру на себя ответственность за код в ссылке, никогда не пробовал себя).
Этот другая ссылка от Microsoft содержит подробный анализ проблемы.
Надеюсь это поможет.
См. Мое обновление исходного вопроса. Этот ответ в конечном итоге указал мне на решение.