Как сериализовать объект System.Windows.Media.Color в строку sRGB? - PullRequest
15 голосов
/ 23 июля 2010

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

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

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

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

Ответы [ 7 ]

18 голосов
/ 23 июля 2010

Если вы создаете свои цвета, используя 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обратитесь к различным цветовым пространствам, убедитесь, что вы используете тот, который вам нужен.

8 голосов
/ 30 апреля 2013

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

string myHex = new ColorConverter().ConvertToString(myColor);
4 голосов
/ 18 февраля 2011

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

[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

2 голосов
/ 21 октября 2015

Если ваша цель - сериализовать в файл и десериализовать обратно в цветной объект, я думаю, вам лучше преобразовать цвет в Int32 и наоборот.Нет ничего сложнее в сериализации / десериализации Int32.Если это ваша цель, вот код: Color To 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]};
1 голос
/ 23 июля 2010

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

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

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

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

0 голосов
/ 25 апреля 2018

Существует встроенная реализация для метода System.Windows.Media.Color toString (), который дает шестнадцатеричный код цвета.

Фрагмент из интерфейса класса сам

        //
        // Summary:
        //     Creates a string representation of the color using the sRGB channels.
        //
        // Returns:
        //     The string representation of the color. The default implementation represents
        //     the System.Byte values in hex form, prefixes with the # character, and starts
        //     with the alpha channel. For example, the System.Windows.Media.Color.ToString()
        //     value for System.Windows.Media.Colors.AliceBlue is #FFF0F8FF.
        public override string ToString();
0 голосов
/ 23 июля 2010

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

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

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