Mono 2.8.2 и загрузка файлов PNG

Я делаю проект, который добавляет и умножает несколько слоев PNG и сгенерированных объектов Bitmap друг на друга в Mono 2.8.2.

У меня возникла проблема, когда пиксели, загружаемые из PNG (253, 252, 252, 153) (RGBA), поступают как (151, 151, 151, 153). Это без никаких модификаций PNG, просто загружая его и перебирая координаты x/y при печати пикселей. Похоже, он вытягивает правильную альфу, но не правильные значения цвета.

РЕДАКТИРОВАТЬ. Это изображение, с которым я работаю http://i.stack.imgur.com/Gr21x.png

Это более или менее то, что я делаю:

Bitmap cover = new Bitmap("test.png");
for(int x = 0; x < cover.Width; x++)
{
    for(int y = 0; y < cover.Height; y++)
    {
        Color pixel = cover.GetPixel(x, y);
        Console.WriteLine("{0}x{1}: {2} {3} {4} {5}", x, y, pixel.R, pixel.G, pixel.B, pixel.A)
    }
}

Я проверил значения, которые я проверяю в GIMP. Есть мысли по этому поводу? Разрабатываю на Linux, Mono 2.8.2, libgdiplus-2.10.

Спасибо!


person andrew    schedule 31.03.2011    source источник


Ответы (1)


Только что нашел это: https://bugzilla.novell.com/show_bug.cgi?id=679242 . По-видимому, есть открытый отчет об ошибке для этой самой проблемы.

Тем временем любой PNG, который в основном белый с альфа-каналом, можно инвертировать в программе редактирования изображений (так что он в основном черный), загрузить и повторно инвертировать в коде. Заноза в заднице, но подходящий обходной путь, если только ваш PNG не содержит белых и черных альфа-значений или не дай бог цветов.

РЕДАКТИРОВАТЬ: лучший способ - просто перемножить значения цвета, как указано в отчете об ошибке (обратите внимание, что это работает, только если альфа не равна нулю):

r|g|b *= 255.0 / (double)alpha;

Это можно проверить, создав белый однопиксельный PNG с альфа-значением 150 (или около того). Загрузите изображение и проверьте его один пиксель на значение r/g/b меньше 255. Если оно найдено, умножьте все альфа-значения для ВСЕХ ваших загруженных PNG. Если не найдено, загрузите свои PNG в обычном режиме (исправлять не нужно). Таким образом, даже если моно-ошибка будет исправлена, ваши манипуляции с изображением никак не изменятся и не сломаются.

person andrew    schedule 06.04.2011