Я работаю с Растровым C# и задаюсь вопросом, как преобразовать цвет png изображение только к одному цвету. Я хочу, чтобы все видимые цвета в изображении стали белыми. Части, которые прозрачны, должны остаться прозрачными. Я собираюсь отобразить эти agains серый фон.
Другие ответы были полезны и помогли мне продолжить работу, большое спасибо. Однако я не мог заставить их работать, не знаю почему. Но я также обнаружил, что хочу сохранить исходное альфа-значение пикселей, сделав края гладкими. Вот что я придумал.
for (int x = 0; x < bitmap.Width; x++)
{
for (int y = 0; y < bitmap.Height; y++)
{
Color bitColor = bitmap.GetPixel(x, y);
//Sets all the pixels to white but with the original alpha value
bitmap.SetPixel(x, y, Color.FromArgb(bitColor.A, 255, 255, 255));
}
}
Вот дамп экрана результата, увеличенного в несколько раз (оригинал вверху):
(источник: codeodyssey.se )
Если изображение не использует альфа-канал для прозрачности, то подойдет следующее:
Bitmap image;
for (int x = 0; x < image.Width; x++)
{
for (int y = 0; y < image.Height; y++)
{
if (image.GetPixel(x, y) != Color.Transparent)
{
image.SetPixel(x, y, Color.White);
}
}
}
попробуйте следующий код:
void Test()
{
Bitmap bmp = new Bitmap(50, 50);//you will load it from file or resource
Color c = Color.Green;//transparent color
//loop height and width.
// YOU MAY HAVE TO CONVERT IT TO Height X VerticalResolution and
// Width X HorizontalResolution
for (int i = 0; i < bmp.Height; i++)
{
for (int j = 0; j < bmp.Width; j++)
{
var p = bmp.GetPixel(j, i);//get pixle at point
//if pixle color not equals transparent
if(!c.Equals(Color.FromArgb(p.ToArgb())))
{
//set it to white
bmp.SetPixel(j,i,Color.White);
}
}
}
}
PS: это не протестировано и никак не оптимизировано