Ответ 1
Да, используйте 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)
Каков наилучший способ установить компоненты RGB каждого пикселя в System.Drawing.Bitmap
на один сплошной цвет? Если это возможно, я бы хотел, чтобы это не выполнялось вручную для каждого пикселя.
Примечание. Я хочу сохранить один и тот же альфа-компонент из исходного растрового изображения. Я хочу изменить значения RGB.
Я просмотрел с помощью ColorMatrix
или ColorMap
, но я не смог найти способ установить все пиксели в конкретный заданный цвет при любом подходе.
Да, используйте 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)
Я знаю, что это уже ответили, но на основании ответа Hans Passant получившийся код выглядит примерно так:
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/
Лучшим вариантом (по крайней мере, с точки зрения перфоратора) является использование Bitmap.LockBits и цикл через данные пикселя в строка сканирования, устанавливая значения RGB.
Поскольку вы не хотите менять Alpha, вам придется перебирать каждый пиксель - нет единого назначения памяти, которое сохранит альфа и заменит RGB, поскольку они чередуются вместе.