Priya Karthish Ответов: 2

Int value to hex color C# WPF


Мне нужно преобразовать цвет, который хранится в виде целочисленного значения. Когда я пытаюсь преобразовать, цвет приходит в обратном порядке. Цвет-Алиса Блю. Целочисленное значение-16445926. Шестнадцатеричное значение - #E6F1FA. (R=230, G=241, B=250)

Но для меня это происходит как #FAF1E6 (R=250, G=241, B=230), когда я преобразую целое число в шестнадцатеричное значение.Поскольку мне нужно заполнить прямоугольник, он должен быть в формате кисти.

Я не знаю, где я ошибаюсь.

Что я уже пробовал:

int pcolor = 16445926;
           
                var panelcolor = System.Drawing.Color.FromArgb(pcolor);
                
                System.Windows.MessageBox.Show("Panelcolor", panelcolor.ToString());
                string myHex = pcolor.ToString("X");
                string colorhex = "#" + myHex;
                System.Windows.MessageBox.Show("Hexadecimal Value : ", "#"+myHex); 
                var converter = new System.Windows.Media.BrushConverter();
                var brush = (System.Windows.Media.Brush)converter.ConvertFrom(colorhex);
                rect1.Fill = brush;

2 Ответов

Рейтинг:
7

OriginalGriff

FAF1E6-это правильный шестнадцатеричный код для 16445926, поэтому ваши значения красного и синего цветов меняются местами.
Поменяйте местами байты:

int x = 0xFAF1E6;
int y = ((x & 0xFF0000) >> 16) | (x & 0x00FF00) | ((x & 0x0000FF) << 16);
Затем преобразуйте его в цветовое значение


Рейтинг:
16

BillWoodruff

Я предполагаю, что вы имеете дело с цветовыми значениями, упорядоченными BGR, используемыми в MS Office.

Я предлагаю вам создать свою собственную библиотеку функций преобразования цвета: вот начало из моей собственной библиотеки:

using System;
using System.Drawing;
using System.Globalization;

namespace ColorExtensions
{
    public static class RGBExtensions
    {
        public static Color RGBColorToBGRColor(this Color rgbColor)
        {
            return Color.FromArgb(rgbColor.A, rgbColor.B, rgbColor.G, rgbColor.R);
        }

        public static Color BGRColorToRGBColor(this Color bgrColor)
        {
            return bgrColor.RGBColorToBGRColor();
        }

        public static Color RGBIntToBGRColor(this int rgbColor)
        {
            var byteAry = BitConverter.GetBytes(rgbColor);

            return Color.FromArgb(byteAry[3], byteAry[0], byteAry[1], byteAry[2]);
        }

        public static Color BGRIntToRGBColor(this int bgrColor)
        {
            return bgrColor.RGBIntToBGRColor();
        }

        public static int RGBColorToBGRInt(this Color rgbColor)
        {
            return rgbColor.ToArgb().RGBIntToBGRColor().ToArgb();
        }

        public static int BGRColorToRGBInt(this Color bgrColor)
        {
            return bgrColor.ToArgb().BGRIntToRGBColor().ToArgb();
        }

/* left for you to write

        public static string BGRColorToRGBString(this Color bgrColor, bool hexout = false)
        {
        }

        public static string RGBColorToBGRString(this Color rgbColor, bool hexout = false)
        {
        }
*/

        public static string ColorToHexString(this Color color)
        {
            return color.ToArgb().ToString("X");
        }

        private static CultureInfo provider = CultureInfo.InvariantCulture;

        public static (bool, Color) HexStringToColor(this string colorstring)
        {
            int i = 0;

            if (int.TryParse(colorstring, NumberStyles.HexNumber, provider, out i))
            {
                return (true, Color.FromArgb(i));
            }

            return (false, Color.Empty);
        }
    }
}
Тест в каком-то методе:
// required using ColorExtensions;

            string hex = "FAF1E6";

            int toint = int.Parse(hex, NumberStyles.HexNumber);

            string backtostring = toint.ToString("X");

            var clr = hex.HexStringToColor();

            string backtohex;

            if (clr.Item1) backtohex = (clr.Item2).ColorToHexString();

            int rgb = 16445926;

            Color bgr = rgb.RGBIntToBGRColor();

            Color backtorgbcolor = bgr.BGRColorToRGBColor();

            int backtoint = bgr.BGRColorToRGBInt();


Maciej Los

5ed!