Преобразовать прозрачный PNG в цвет в один цвет - PullRequest
6 голосов
/ 01 августа 2010

Я работаю с Bitmap C # и задаюсь вопросом, как преобразовать цветное изображение PNG в один цвет.Я хочу, чтобы все видимые цвета на изображении стали белыми.Прозрачные части должны оставаться прозрачными.Я собираюсь отобразить их снова на сером фоне.

Ответы [ 4 ]

7 голосов
/ 01 августа 2010

Если изображение не использует альфа-канал для прозрачности, тогда будет делать следующее:

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);
        }
    }
}
7 голосов
/ 17 августа 2010

Другие ответы были полезны и помогли мне, большое спасибо. Я не мог заставить их работать, хотя, не уверен почему. Но я также узнал, что хотел сохранить исходное альфа-значение пикселей, чтобы края были гладкими. Это то, что я придумал.

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));
    }
}

Вот дамп экрана результата, увеличенного в несколько раз (оригинал сверху): альтернативный текст http://codeodyssey.se/upload/white-transparent.png

4 голосов
/ 27 ноября 2012

SetPixel - самый медленный способ сделать это. Вы можете использовать ColorMatrix вместо:

var newImage = new Bitmap(original.Width, original.Height,
                          original.PixelFormat);

using (var g = Graphics.FromImage(newImage)) {
    var matrix = new ColorMatrix(new[] {
        new float[] { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f },
        new float[] { 0.0f, 1.0f, 0.0f, 0.0f, 0.0f },
        new float[] { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f },
        new float[] { 0.0f, 0.0f, 0.0f, 1.0f, 0.0f },
        new float[] { 1.0f, 1.0f, 1.0f, 0.0f, 1.0f }
    });

    var attributes = new ImageAttributes();

    attributes.SetColorMatrix(matrix);

    g.DrawImage(original,
                new Rectangle(0, 0, original.Width, original.Height),
                0, 0, original.Width, original.Height,
                GraphicsUnit.Pixel, attributes);
}
1 голос
/ 01 августа 2010

попробуйте следующий код:

    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: это не проверено и никоим образом не оптимизировано

...