Как преобразовать объект System.Windows.Media.Color в строку sRGB?

Мне нужно сериализовать цвет, используемый в приложении WPF, в базу данных. Я хотел бы использовать значения sRGB, потому что они более знакомы тем из нас, которые последние несколько лет занимались веб-разработкой.

Как получить строку ARGB (например, #FFFFFFFF) из объекта System.Windows.Media.Color?

ОБНОВЛЕНИЕ. Я был введен в заблуждение в документации по MSDN. Как отметил @Kris ниже, документация для метода ToString() неверна. Хотя он говорит, что ToString() "создает строковое представление цвета с использованием каналов ScRGB", он фактически вернет строку в формате ARGB hex, если цвет был создан с использованием метода FromARGB(). Я предполагаю, что это недокументированная функция.

См. http://msdn.microsoft.com/en-us/library/ms606572.aspx

Ответ 1

Если вы создаете свои цвета, используя Color.FromRgb или Color.FromArgb вместо FromScRgb, вы должны получить результат шестнадцатеричной строки из ToString.

Если вы хотите сделать это вручную

string.Format("#{0:X2}{1:X2}{2:X2}{3:X2}", c.A, c.R, c.G, c.B);

Вы можете использовать int.Parse(, NumberStyles.HexNumber), чтобы перейти в другую сторону.

Примечание. sRGB и scRGB относятся к разным цветовым пространствам, убедитесь, что вы используете тот, который вам нужен.

Ответ 2

Вы также можете сделать это следующим образом:

string myHex = new ColorConverter().ConvertToString(myColor);

Ответ 3

Я создал структуру для обработки преобразования и сериализации. Это решает две проблемы для меня: она сериализуема и исправляет орфографию;)

[Serializable]
public struct Colour
    {
    public byte A;
    public byte R;
    public byte G;
    public byte B;

    public Colour(byte a, byte r, byte g, byte b)
        {
        A = a;
        R = r;
        G = g;
        B = b;
        }

    public Colour(Color color)
        : this(color.A, color.R, color.G, color.B)
        {
        }

    public static implicit operator Colour(Color color)
        {
        return new Colour(color);
        }

    public static implicit operator Color(Colour colour)
        {
        return Color.FromArgb(colour.A, colour.R, colour.G, colour.B);
        }
    }

Просто используйте Colour, где вы в противном случае использовали бы System.Windows.Media.Color

Ответ 4

Этот ответ предназначен для цветов GDI, а не для WPF, поэтому может быть не так много.

Вы можете получить цветовую строку HTML (и обратно), подобную этой

System.Drawing.Color c = System.Drawing.ColorTranslator.FromHtml("#F5F7F8");
String strHtmlColor = System.Drawing.ColorTranslator.ToHtml(c);

здесь - это документация MSDN.

Ответ 5

Если ваша цель состоит в сериализации в файл и десериализации обратно к цветному объекту, я думаю, что вам лучше преобразовать цвет в Int32 и наоборот. Нецелесообразно сериализовать/десериализовать Int32. Если это ваша цель, вот код: Цвет: Int32:

        byte[] color = new byte[4];
        color[0] = Color.B;
        color[1] = Color.G;
        color[2] = Color.R;
        color[3] = Color.A;
        Int32 intColor = System.BitConverter.ToInt32(color, 0);

Int32 To Color:

byte[] bytes = System.BitConverter.GetBytes(intColor);
Color =new System.Windows.Media.Color(){B= bytes[0], G=bytes[1], R=bytes[2], A=bytes[3]};

Ответ 6

Вы можете получить значения A, R, G и B из экземпляра Color в виде байтов, поэтому вам просто нужно преобразовать байты в hex и объединить шестнадцатеричные значения в виде строк.

byte [] в шестнадцатеричную строку