Я использую .NET 4.0. Я не знаю, ошибка ли это фреймворка или проблема GDI +. Я только что обнаружил это, когда писал приложение для переключения цветовых каналов.
Позвольте мне попытаться объяснить проблему. Я читаю пиксели из одного растрового изображения, меняю местами каналы и записываю их в другое растровое изображение. (В частности, я устанавливаю значения RGB выходного изображения равными альфа-каналу входного изображения, а альфа-выходное значение равным входному зеленому каналу ... или, короче говоря, A => RGB и G => A.) Код следующий. следующее:
for (int y = 0; y < input.Height; y++)
{
for (int x = 0; x < input.Width; x++)
{
Color srcPixel = input.GetPixel(x, y);
int alpha = srcPixel.A;
int green = srcPixel.G;
Color destPixel = Color.FromArgb(green, alpha, alpha, alpha);
output.SetPixel(x, y, destPixel);
}
}
Точно так же я пробовал это:
int color = green << 24 | alpha << 16 | alpha << 8 | alpha;
Color destPixel = Color.FromArgb(color);
output.SetPixel(x, y, destPixel);
По большей части это работает.
Проблема: независимо от значений RGB, когда альфа равна нулю, результирующее значение RGB всегда чисто черный (R: 0, G: 0, B: 0). Я не знаю, является ли это своего рода «оптимизацией» FromArgb () - используя .NET Reflector, я не вижу, чтобы FromArgb () делал что-нибудь странное - или если Bitmap.SetPixel является виновником - более вероятно, поскольку он полагается на собственный код, и я не могу на него смотреть. В любом случае, когда альфа равна нулю, пиксель черный. Это не то поведение, которого я ожидал. Мне нужно сохранить каналы RGB нетронутыми.
Сначала я подумал, что это проблема с предварительно умноженной альфа-версией, потому что я загружаю файлы DDS, используя самодельный загрузчик DDS (который я построил в соответствии со спецификацией и который никогда не создавал мне никаких проблем), но когда я указываю явную альфа-версию из 255, вот так:
Color destPixel = Color.FromArgb(255, alpha, alpha, alpha);
... каналы RGB отображаются правильно - то есть ни один из них не оказывается черным - так что определенно что-то в GDI + ошибочно предполагает, что значения RGB можно безопасно игнорировать, если альфа равна нулю ... что, на мой взгляд, кажется довольно глупым предположение, но, как бы то ни было.
Проблема еще больше усугубляется тем, что тип Color является неизменным, что имеет смысл для структуры, но это означает, что я не могу создать цвет, а затем назначить альфа ... что, если SetPixel () является виновником, в любом случае не имеет значения . (Я проверил это, снова получив пиксель сразу после его установки и увидев те же результаты: нулевой альфа = нулевой RGB).
Итак, мой вопрос: кто-нибудь занимался этой проблемой и придумал относительно простой обходной путь? Стремясь уменьшить свои зависимости, я не хочу импортировать стороннюю библиотеку изображений, но, поскольку GDI + делает ошибочные предположения о моих цветовых каналах, у меня может не быть выбора.
Спасибо за вашу помощь.
РЕДАКТИРОВАТЬ: Я решил это, но я не могу опубликовать ответ еще семь часов. Потрясающий.