GDI +: установить все пиксели на заданный цвет, сохраняя при этом существующее альфа-значение - PullRequest
7 голосов
/ 24 марта 2010

Каков наилучший способ установить компоненты RGB каждого пикселя в System.Drawing.Bitmap на один сплошной цвет? Если это возможно, я бы хотел избежать ручной петли через каждый пиксель, чтобы сделать это.

Примечание. Я хочу сохранить тот же альфа-компонент из исходного растрового изображения. Я только хочу изменить значения RGB.

Я изучил использование ColorMatrix или ColorMap, но не смог найти способа установить для всех пикселей определенный заданный цвет при любом подходе.

Ответы [ 3 ]

14 голосов
/ 24 марта 2010

Да, используйте ColorMatrix. Это должно выглядеть так:

  0  0  0  0  0
  0  0  0  0  0
  0  0  0  0  0 
  0  0  0  1  0 
  R  G  B  0  1

Где R, G и B - масштабированные значения цвета замещающего цвета (делим на 255.0f)

7 голосов
/ 11 января 2011

Я знаю, что на этот вопрос уже есть ответ, но на основании ответа Ханса Пассанта полученный код выглядит примерно так:

public class Recolor
{
    public static Bitmap Tint(string filePath, Color c)
    {
        // load from file
        Image original = Image.FromFile(filePath);
        original = new Bitmap(original);

        //get a graphics object from the new image
        Graphics g = Graphics.FromImage(original);

        //create the ColorMatrix
        ColorMatrix colorMatrix = new ColorMatrix(
            new float[][]{
                    new float[] {0, 0, 0, 0, 0},
                    new float[] {0, 0, 0, 0, 0},
                    new float[] {0, 0, 0, 0, 0},
                    new float[] {0, 0, 0, 1, 0},
                    new float[] {c.R / 255.0f,
                                 c.G / 255.0f,
                                 c.B / 255.0f,
                                 0, 1}
                });

        //create some image attributes
        ImageAttributes attributes = new ImageAttributes();

        //set the color matrix attribute
        attributes.SetColorMatrix(colorMatrix);

        //draw the original image on the new image
        //using the color matrix
        g.DrawImage(original, 
            new Rectangle(0, 0, original.Width, original.Height),
            0, 0, original.Width, original.Height,
            GraphicsUnit.Pixel, attributes);

        //dispose the Graphics object
        g.Dispose();

        //return a bitmap
        return (Bitmap)original;
    }
}

Загрузите рабочую демоверсию здесь: http://benpowell.org/change-the-color-of-a-transparent-png-image-icon-on-the-fly-using-asp-net-mvc/

2 голосов
/ 24 марта 2010

Лучший (с точки зрения перфорации) вариант - использовать Bitmap.LockBits и циклически проходить по пиксельным данным в строке сканирования, устанавливая значения RGB.

Так как вы не хотите менять альфу, вам придется проходить через каждый пиксель - нет единственного назначения памяти, которое сохранит альфа и заменит RGB, поскольку они чередуются вместе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...