Как получить «настоящие» цвета при экспорте чертежа GDI в bmp - PullRequest
1 голос
/ 03 мая 2010

Я разрабатываю веб-обработчик ASP.Net, который возвращает изображения, создающие в памяти System.Windows.Forms.Control, а затем экспортирует визуализированный элемент управления в виде растрового изображения, сжатого в PNG, с использованием метода DrawToBitmap(). Классы полностью работают, за исключением проблемы с назначением цвета. Например, это датчик, сгенерированный веб-обработчиком.

The gauge

Цвета, назначенные внутренним частям датчика, - красный (#FF0000), желтый (#FFFF00) и зеленый (#00FF00), но я получаю только тусклую версию каждого цвета (#CB100F для красного , #CCB70D для желтого и #04D50D для зеленого).

Фон представляет собой bmp-файл, содержащий градиент цвета. Потеря цвета происходит, если фон является градиентом, например образец, черный холст, белый холст, прозрачный холст, даже если фон не установлен.

  • с черным фоном

With black background

  • с прозрачным фоном

With a transparent background

  • С белым фоном

With a white background

  • Без набора фона

Without a background set

  • С форматом пикселей в Format32bppArgb

With pixelformat Format32bppArgb

Я пробовал несколько глубин растровых цветов, форматов вывода, уровня сжатия и т. Д., Но, похоже, ни один из них не работает. Есть идеи?

Это выдержка из исходного кода:

Bitmap bmp = new Bitmap(w, h, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
Image bgimage = (Image) HttpContext.GetGlobalResourceObject("GraphicResources", "GaugeBackgroundImage");
Canvas control_canvas = new Canvas(); //inherits from Control
....
//the routine that makes the gauge
....
control_canvas.DrawToBitmap(bmp, new Rectangle(0, 0, w, h));

Ответы [ 4 ]

1 голос
/ 04 мая 2010

Вы пробовали это только с PNG? Я столкнулся с этой проблемой с PNG (или JPEG?) В браузере давно, но GIF-файлы IIRC устранили эту проблему:

Обратите внимание, что я не говорю, что GIF-файлы решат вашу проблему в долгосрочной перспективе, но она может сказать вам, является ли проблема записи / чтения PNG. Попробуйте, попробуйте BMP, попробуйте что-нибудь. Не верьте PNG. Вы можете попробовать сбросить значения r g b в файл журнала (или на диск как в формате raw и импортировать в Photoshop и) посмотреть, что это за числа, прежде чем записывать растровое изображение. (Используйте LockBits ; существуют учебники по коду при получении байтов в битовые карты и из них).

1 голос
/ 03 мая 2010

Когда вы рисуете цвета, убедитесь, что альфа-канал также настроен правильно. Если у вас есть альфа, он будет сливаться с темным фоном и даст вам более темный цвет.

0 голосов
/ 27 июня 2011

Холст был классом, предоставленным третьей стороной. Мы нашли ошибку в их пакете, они выпустили новую версию, и проблема была наконец решена. В любом случае спасибо за ваше время!

0 голосов
/ 04 мая 2010

Я только что понял, что у вас есть действительно ярко-желтые части на этом указателе треугольника, так что проблема, скорее всего, с фоновым изображением. Вы рисуете эти дуги с помощью примитивов или загружаете растровое изображение? У вас могут быть проблемы с гаммой, цветовым пространством и т. Д. В зависимости от формата ввода, если вы используете изображение для красной / желтой / зеленой части измерителя. Попробуйте нарисовать эти фигуры в коде, если вы используете изображение. Какой бы код ни делал желтый треугольник, он получает яркие цвета, поэтому используйте тот же формат изображения, кисть или любой другой, который заставляет работать желтый треугольник.

...