Я работаю над приложением silverlight, где все мои значки - PNG.
Цвет всех этих значков - черный или, скорее, от черного к серому, в зависимости от значения альфа. Каждый PNG имеет прозрачный фон.
В моем приложении я хочу сделать пиксельное изменение цвета с черного или серого, скажем, на красный (перед черным) или светло-красный (перед серым).
Просматривая байты каждого пикселя, я обнаружил, что каждый полностью черный пиксель имеет альфа-значение 255. Те, кто серые, имеют альфа-значение от 1 до 254. Альфа-значение 0 кажется прозрачным. Все значения RGB равны 0 для черного.
Моя идея заключалась в том, что я меняю цвет каждого пикселя, но сохраняю альфа-значение, чтобы PNG сохраняли свой первоначальный вид.
Для этого я написал небольшую функцию, которая выглядит так:
private static WriteableBitmap ColorChange(WriteableBitmap wbmi, System.Windows.Media.Color color)
{
for (int pixel = 0; pixel < wbmi.Pixels.Length; pixel++)
{
if (wbmi.Pixels[pixel] != 0)
{
byte[] colorArray = BitConverter.GetBytes(wbmi.Pixels[pixel]);
byte blue = colorArray[0];
byte green = colorArray[1];
byte red = colorArray[2];
byte alpha = colorArray[3];
if (alpha > 0)
{
//HERE, I change the color, but keep the alpha
//
wbmi.Pixels[pixel] = Gui.Colors.ToInt.Get(color,alpha);
colorArray = BitConverter.GetBytes(wbmi.Pixels[pixel]);
blue = colorArray[0];
green = colorArray[1];
red = colorArray[2];
alpha = colorArray[3];
String colorString = "blue: " + blue.ToString() + "green: " + green.ToString() + "red: " + red.ToString() + "alpha: " + alpha.ToString();
System.Diagnostics.Debug.WriteLine(colorString);
}
}
}
return wbmi;
}
И небольшой вспомогательный класс для изменения цвета, но с сохранением альфа-канала:
namespace Gui.Colors
{
public class ToInt
{
public static int Get(System.Windows.Media.Color color, Byte alpha)
{
color.A = alpha;
return color.A << 24 | color.R << 16 | color.G << 8 | color.B;
}
}
}
Моя проблема в том, что я ясно вижу, что проблема заключается в пикселях с альфа-каналом меньше 255 (серый). Хотя альфа-значение сохранено и цвет изменился, пиксели выглядят иначе, они больше не прозрачны. Из-за этого края выглядят тощими.
Длинный разговор, короткий вопрос: Глядя на мой код - в чем проблема? Как добиться преобразования цвета пиксель в пиксель с прозрачностью исходного PNG?
Прошу прощения за мой английский. Я не являюсь носителем английского языка.