Ejemplo n.º 1
0
        public void Apply(List <ColorSchemeAtom> schemes)
        {
            _writer.WriteStartElement("a", "theme", OpenXmlNamespaces.DrawingML);
            _writer.WriteAttributeString("name", "dummyTheme");

            _writer.WriteStartElement("a", "themeElements", OpenXmlNamespaces.DrawingML);
            ColorSchemeAtom s = schemes[schemes.Count - 1];

            writeScheme(s);

            //write fontScheme
            writeFontScheme();

            //write fmtScheme
            writeFmtScheme();

            _writer.WriteEndElement(); // themeElements

            if (schemes.Count > 1)
            {
                _writer.WriteStartElement("a", "extraClrSchemeLst", OpenXmlNamespaces.DrawingML);
                foreach (ColorSchemeAtom scheme in schemes)
                {
                    _writer.WriteStartElement("a", "extraClrScheme", OpenXmlNamespaces.DrawingML);
                    writeScheme(scheme);
                    _writer.WriteEndElement(); // extraClrScheme
                }
                _writer.WriteEndElement();     // extraClrSchemeLst
            }


            _writer.WriteEndElement(); // theme
        }
Ejemplo n.º 2
0
        /**
         * @return color of the line. If color is not Set returns <code>java.awt.Color.black</code>
         */
        public Color GetLineColor()
        {
            EscherOptRecord opt = (EscherOptRecord)GetEscherChild(_escherContainer, EscherOptRecord.RECORD_ID);

            EscherSimpleProperty p1 = (EscherSimpleProperty)GetEscherProperty(opt, EscherProperties.LINESTYLE__COLOR);
            EscherSimpleProperty p2 = (EscherSimpleProperty)GetEscherProperty(opt, EscherProperties.LINESTYLE__NOLINEDRAWDASH);
            int   p2val             = p2 == null ? 0 : p2.PropertyValue;
            Color clr = null;

            if ((p2val & 0x8) != 0 || (p2val & 0x10) != 0)
            {
                int rgb = p1 == null ? 0 : p1.PropertyValue;
                if (rgb >= 0x8000000)
                {
                    int idx = rgb % 0x8000000;
                    if (Sheet != null)
                    {
                        ColorSchemeAtom ca = Sheet.GetColorScheme();
                        if (idx >= 0 && idx <= 7)
                        {
                            rgb = ca.GetColor(idx);
                        }
                    }
                }
                Color tmp = new Color(rgb, true);
                clr = new Color(tmp.GetBlue(), tmp.GetGreen(), tmp.GetRed());
            }
            return(clr);
        }
Ejemplo n.º 3
0
Archivo: Shape.cs Proyecto: zzy092/npoi
        protected Color GetColor(int rgb, int alpha)
        {
            if (rgb >= 0x8000000)
            {
                int             idx = rgb - 0x8000000;
                ColorSchemeAtom ca  = Sheet.GetColorScheme();
                if (idx >= 0 && idx <= 7)
                {
                    rgb = ca.GetColor(idx);
                }
            }
            Color tmp = Color.FromArgb(rgb);

            return(Color.FromArgb(alpha, tmp.B, tmp.G, tmp.R));
        }
        public void writeBuClr(RegularContainer slide, GrColorAtom color, ref string lastColor)
        {
            if (color.IsSchemeColor) //TODO: to be fully implemented
            {
                //_writer.WriteStartElement("a", "schemeClr", OpenXmlNamespaces.DrawingML);

                if (slide == null)
                {
                    ////TODO: what shall be used in this case (happens for default text style in presentation.xml)
                    //_writer.WriteStartElement("a", "srgbClr", OpenXmlNamespaces.DrawingML);
                    //_writer.WriteAttributeString("val", "000000");
                    //_writer.WriteEndElement();

                    this._writer.WriteStartElement("a", "buClr", OpenXmlNamespaces.DrawingML);
                    this._writer.WriteStartElement("a", "schemeClr", OpenXmlNamespaces.DrawingML);
                    switch (color.Index)
                    {
                    case 0x00:
                        this._writer.WriteAttributeString("val", "bg1");     //background
                        break;

                    case 0x01:
                        this._writer.WriteAttributeString("val", "tx1");     //text
                        break;

                    case 0x02:
                        this._writer.WriteAttributeString("val", "dk1");     //shadow
                        break;

                    case 0x03:
                        this._writer.WriteAttributeString("val", "tx1");     //title text
                        break;

                    case 0x04:
                        this._writer.WriteAttributeString("val", "bg2");     //fill
                        break;

                    case 0x05:
                        this._writer.WriteAttributeString("val", "accent1");     //accent1
                        break;

                    case 0x06:
                        this._writer.WriteAttributeString("val", "accent2");     //accent2
                        break;

                    case 0x07:
                        this._writer.WriteAttributeString("val", "accent3");     //accent3
                        break;

                    case 0xFE:     //sRGB
                        lastColor = color.Red.ToString("X").PadLeft(2, '0') + color.Green.ToString("X").PadLeft(2, '0') + color.Blue.ToString("X").PadLeft(2, '0');
                        this._writer.WriteAttributeString("val", lastColor);
                        break;

                    case 0xFF:     //undefined
                        break;
                    }
                    this._writer.WriteEndElement();
                    this._writer.WriteEndElement();
                }
                else
                {
                    ColorSchemeAtom        MasterScheme = null;
                    var                    ato          = slide.FirstChildWithType <SlideAtom>();
                    List <ColorSchemeAtom> colors;
                    if (ato != null && Tools.Utils.BitmaskToBool(ato.Flags, 0x1 << 1) && ato.MasterId != 0)
                    {
                        colors = this._ctx.Ppt.FindMasterRecordById(ato.MasterId).AllChildrenWithType <ColorSchemeAtom>();
                    }
                    else
                    {
                        colors = slide.AllChildrenWithType <ColorSchemeAtom>();
                    }
                    foreach (var colorsch in colors)
                    {
                        if (colorsch.Instance == 1)
                        {
                            MasterScheme = colorsch;
                        }
                    }

                    if (color.Index != 0xFF)
                    {
                        this._writer.WriteStartElement("a", "buClr", OpenXmlNamespaces.DrawingML);
                        this._writer.WriteStartElement("a", "srgbClr", OpenXmlNamespaces.DrawingML);
                        switch (color.Index)
                        {
                        case 0x00:     //background
                            lastColor = new RGBColor(MasterScheme.Background, RGBColor.ByteOrder.RedFirst).SixDigitHexCode;
                            this._writer.WriteAttributeString("val", lastColor);
                            break;

                        case 0x01:     //text
                            lastColor = new RGBColor(MasterScheme.TextAndLines, RGBColor.ByteOrder.RedFirst).SixDigitHexCode;
                            this._writer.WriteAttributeString("val", lastColor);
                            break;

                        case 0x02:     //shadow
                            lastColor = new RGBColor(MasterScheme.Shadows, RGBColor.ByteOrder.RedFirst).SixDigitHexCode;
                            this._writer.WriteAttributeString("val", lastColor);
                            break;

                        case 0x03:     //title
                            lastColor = new RGBColor(MasterScheme.TitleText, RGBColor.ByteOrder.RedFirst).SixDigitHexCode;
                            this._writer.WriteAttributeString("val", lastColor);
                            break;

                        case 0x04:     //fill
                            lastColor = new RGBColor(MasterScheme.Fills, RGBColor.ByteOrder.RedFirst).SixDigitHexCode;
                            this._writer.WriteAttributeString("val", lastColor);
                            break;

                        case 0x05:     //accent1
                            lastColor = new RGBColor(MasterScheme.Accent, RGBColor.ByteOrder.RedFirst).SixDigitHexCode;
                            this._writer.WriteAttributeString("val", lastColor);
                            break;

                        case 0x06:     //accent2
                            lastColor = new RGBColor(MasterScheme.AccentAndHyperlink, RGBColor.ByteOrder.RedFirst).SixDigitHexCode;
                            this._writer.WriteAttributeString("val", lastColor);
                            break;

                        case 0x07:     //accent3
                            lastColor = new RGBColor(MasterScheme.AccentAndFollowedHyperlink, RGBColor.ByteOrder.RedFirst).SixDigitHexCode;
                            this._writer.WriteAttributeString("val", lastColor);
                            break;

                        case 0xFE:     //sRGB
                            lastColor = color.Red.ToString("X").PadLeft(2, '0') + color.Green.ToString("X").PadLeft(2, '0') + color.Blue.ToString("X").PadLeft(2, '0');
                            this._writer.WriteAttributeString("val", lastColor);
                            break;

                        case 0xFF:     //undefined
                        default:
                            break;
                        }
                        this._writer.WriteEndElement();
                        this._writer.WriteEndElement();
                    }
                    //_writer.WriteEndElement();
                }
            }
            else
            {
                this._writer.WriteStartElement("a", "buClr", OpenXmlNamespaces.DrawingML);
                this._writer.WriteStartElement("a", "srgbClr", OpenXmlNamespaces.DrawingML);
                lastColor = color.Red.ToString("X").PadLeft(2, '0') + color.Green.ToString("X").PadLeft(2, '0') + color.Blue.ToString("X").PadLeft(2, '0');
                this._writer.WriteAttributeString("val", lastColor);
                this._writer.WriteEndElement();
                this._writer.WriteEndElement();
            }
        }
Ejemplo n.º 5
0
        private void writeScheme(ColorSchemeAtom scheme)
        {
            //TODO: verify the mappings; at leat accent4 - 6 are wrong

            this._writer.WriteStartElement("a", "clrScheme", OpenXmlNamespaces.DrawingML);

            this._writer.WriteAttributeString("name", "dummyScheme");

            this._writer.WriteStartElement("a", "dk1", OpenXmlNamespaces.DrawingML);
            this._writer.WriteStartElement("a", "srgbClr", OpenXmlNamespaces.DrawingML);
            this._writer.WriteAttributeString("val", new RGBColor(scheme.TextAndLines, RGBColor.ByteOrder.RedFirst).SixDigitHexCode);
            this._writer.WriteEndElement(); // srgbClr
            this._writer.WriteEndElement(); // dk1

            this._writer.WriteStartElement("a", "lt1", OpenXmlNamespaces.DrawingML);
            this._writer.WriteStartElement("a", "srgbClr", OpenXmlNamespaces.DrawingML);
            this._writer.WriteAttributeString("val", new RGBColor(scheme.Background, RGBColor.ByteOrder.RedFirst).SixDigitHexCode);
            this._writer.WriteEndElement(); // srgbClr
            this._writer.WriteEndElement(); // lt1

            this._writer.WriteStartElement("a", "dk2", OpenXmlNamespaces.DrawingML);
            this._writer.WriteStartElement("a", "srgbClr", OpenXmlNamespaces.DrawingML);
            this._writer.WriteAttributeString("val", new RGBColor(scheme.TitleText, RGBColor.ByteOrder.RedFirst).SixDigitHexCode);
            this._writer.WriteEndElement(); // srgbClr
            this._writer.WriteEndElement(); // dk2

            this._writer.WriteStartElement("a", "lt2", OpenXmlNamespaces.DrawingML);
            this._writer.WriteStartElement("a", "srgbClr", OpenXmlNamespaces.DrawingML);
            this._writer.WriteAttributeString("val", new RGBColor(scheme.Shadows, RGBColor.ByteOrder.RedFirst).SixDigitHexCode);
            this._writer.WriteEndElement(); // srgbClr
            this._writer.WriteEndElement(); // lt2

            this._writer.WriteStartElement("a", "accent1", OpenXmlNamespaces.DrawingML);
            this._writer.WriteStartElement("a", "srgbClr", OpenXmlNamespaces.DrawingML);
            this._writer.WriteAttributeString("val", new RGBColor(scheme.Fills, RGBColor.ByteOrder.RedFirst).SixDigitHexCode);
            this._writer.WriteEndElement(); // srgbClr
            this._writer.WriteEndElement(); // accent1

            this._writer.WriteStartElement("a", "accent2", OpenXmlNamespaces.DrawingML);
            this._writer.WriteStartElement("a", "srgbClr", OpenXmlNamespaces.DrawingML);
            this._writer.WriteAttributeString("val", new RGBColor(scheme.Accent, RGBColor.ByteOrder.RedFirst).SixDigitHexCode);
            this._writer.WriteEndElement(); // srgbClr
            this._writer.WriteEndElement(); // accent2

            this._writer.WriteStartElement("a", "accent3", OpenXmlNamespaces.DrawingML);
            this._writer.WriteStartElement("a", "srgbClr", OpenXmlNamespaces.DrawingML);
            this._writer.WriteAttributeString("val", new RGBColor(scheme.Background, RGBColor.ByteOrder.RedFirst).SixDigitHexCode);
            this._writer.WriteEndElement(); // srgbClr
            this._writer.WriteEndElement(); // accent3

            this._writer.WriteStartElement("a", "accent4", OpenXmlNamespaces.DrawingML);
            this._writer.WriteStartElement("a", "srgbClr", OpenXmlNamespaces.DrawingML);
            this._writer.WriteAttributeString("val", new RGBColor(scheme.Accent, RGBColor.ByteOrder.RedFirst).SixDigitHexCode);
            this._writer.WriteEndElement(); // srgbClr
            this._writer.WriteEndElement(); // accent4

            this._writer.WriteStartElement("a", "accent5", OpenXmlNamespaces.DrawingML);
            this._writer.WriteStartElement("a", "srgbClr", OpenXmlNamespaces.DrawingML);
            this._writer.WriteAttributeString("val", new RGBColor(scheme.Accent, RGBColor.ByteOrder.RedFirst).SixDigitHexCode);
            this._writer.WriteEndElement(); // srgbClr
            this._writer.WriteEndElement(); // accent5

            this._writer.WriteStartElement("a", "accent6", OpenXmlNamespaces.DrawingML);
            this._writer.WriteStartElement("a", "srgbClr", OpenXmlNamespaces.DrawingML);
            this._writer.WriteAttributeString("val", new RGBColor(scheme.Accent, RGBColor.ByteOrder.RedFirst).SixDigitHexCode);
            this._writer.WriteEndElement(); // srgbClr
            this._writer.WriteEndElement(); // accent6

            this._writer.WriteStartElement("a", "hlink", OpenXmlNamespaces.DrawingML);
            this._writer.WriteStartElement("a", "srgbClr", OpenXmlNamespaces.DrawingML);
            this._writer.WriteAttributeString("val", new RGBColor(scheme.AccentAndHyperlink, RGBColor.ByteOrder.RedFirst).SixDigitHexCode);
            this._writer.WriteEndElement(); // srgbClr
            this._writer.WriteEndElement(); // hlink

            this._writer.WriteStartElement("a", "folHlink", OpenXmlNamespaces.DrawingML);
            this._writer.WriteStartElement("a", "srgbClr", OpenXmlNamespaces.DrawingML);
            this._writer.WriteAttributeString("val", new RGBColor(scheme.AccentAndFollowedHyperlink, RGBColor.ByteOrder.RedFirst).SixDigitHexCode);
            this._writer.WriteEndElement(); // srgbClr
            this._writer.WriteEndElement(); // folHlink

            this._writer.WriteEndElement(); // clrScheme
        }
Ejemplo n.º 6
0
        public static string getRGBColorFromOfficeArtCOLORREF(uint value, RegularContainer slide, DIaLOGIKa.b2xtranslator.OfficeDrawing.ShapeOptions so, ref string SchemeType)
        {
            byte[] bytes         = BitConverter.GetBytes(value);
            bool   fPaletteIndex = (bytes[3] & 1) != 0;
            bool   fPaletteRGB   = (bytes[3] & (1 << 1)) != 0;
            bool   fSystemRGB    = (bytes[3] & (1 << 2)) != 0;
            bool   fSchemeIndex  = (bytes[3] & (1 << 3)) != 0;
            bool   fSysIndex     = (bytes[3] & (1 << 4)) != 0;

            List <ColorSchemeAtom> colors       = slide.AllChildrenWithType <ColorSchemeAtom>();
            ColorSchemeAtom        MasterScheme = null;

            foreach (ColorSchemeAtom color in colors)
            {
                if (color.Instance == 1)
                {
                    MasterScheme = color;
                }
            }

            if (fSysIndex)
            {
                UInt16 val    = BitConverter.ToUInt16(bytes, 0);
                string result = "";
                switch (val & 0x00ff)
                {
                case 0xF0:     //shape fill color
                    if (so.OptionsByID.ContainsKey(DIaLOGIKa.b2xtranslator.OfficeDrawing.ShapeOptions.PropertyId.fillColor))
                    {
                        result = getRGBColorFromOfficeArtCOLORREF(so.OptionsByID[DIaLOGIKa.b2xtranslator.OfficeDrawing.ShapeOptions.PropertyId.fillColor].op, slide, so);
                    }
                    else
                    {
                        result = new RGBColor(MasterScheme.Fills, RGBColor.ByteOrder.RedFirst).SixDigitHexCode;      //TODO: find out which color to use in this case
                    }
                    break;

                case 0xF1:     //shape line color if it is a line else shape fill color TODO!!
                    if (so.FirstAncestorWithType <OfficeDrawing.ShapeContainer>().FirstChildWithType <OfficeDrawing.Shape>().Instance == 1)
                    {
                        if (so.OptionsByID.ContainsKey(DIaLOGIKa.b2xtranslator.OfficeDrawing.ShapeOptions.PropertyId.fillColor))
                        {
                            result = getRGBColorFromOfficeArtCOLORREF(so.OptionsByID[DIaLOGIKa.b2xtranslator.OfficeDrawing.ShapeOptions.PropertyId.fillColor].op, slide, so);
                        }
                        else
                        {
                            result = new RGBColor(MasterScheme.Fills, RGBColor.ByteOrder.RedFirst).SixDigitHexCode;      //TODO: find out which color to use in this case
                        }
                    }
                    else
                    {
                        if (so.OptionsByID.ContainsKey(DIaLOGIKa.b2xtranslator.OfficeDrawing.ShapeOptions.PropertyId.lineColor))
                        {
                            result = getRGBColorFromOfficeArtCOLORREF(so.OptionsByID[DIaLOGIKa.b2xtranslator.OfficeDrawing.ShapeOptions.PropertyId.lineColor].op, slide, so);
                        }
                        else
                        {
                            result = new RGBColor(MasterScheme.TextAndLines, RGBColor.ByteOrder.RedFirst).SixDigitHexCode;     //TODO: find out which color to use in this case
                        }
                    }
                    break;

                case 0xF2:     //shape line color
                    if (so.OptionsByID.ContainsKey(DIaLOGIKa.b2xtranslator.OfficeDrawing.ShapeOptions.PropertyId.lineColor))
                    {
                        result = getRGBColorFromOfficeArtCOLORREF(so.OptionsByID[DIaLOGIKa.b2xtranslator.OfficeDrawing.ShapeOptions.PropertyId.lineColor].op, slide, so);
                    }
                    else
                    {
                        result = new RGBColor(MasterScheme.TextAndLines, RGBColor.ByteOrder.RedFirst).SixDigitHexCode;     //TODO: find out which color to use in this case
                    }
                    break;

                case 0xF3:     //shape shadow color
                    result = getRGBColorFromOfficeArtCOLORREF(so.OptionsByID[DIaLOGIKa.b2xtranslator.OfficeDrawing.ShapeOptions.PropertyId.shadowColor].op, slide, so);
                    break;

                case 0xF4:     //current or last used color
                case 0xF5:     //shape fill background color
                    result = getRGBColorFromOfficeArtCOLORREF(so.OptionsByID[DIaLOGIKa.b2xtranslator.OfficeDrawing.ShapeOptions.PropertyId.fillBackColor].op, slide, so);
                    break;

                case 0xF6:     //shape line background color
                    result = getRGBColorFromOfficeArtCOLORREF(so.OptionsByID[DIaLOGIKa.b2xtranslator.OfficeDrawing.ShapeOptions.PropertyId.lineBackColor].op, slide, so);
                    break;

                case 0xF7:     //shape fill color if shape contains a fill else line color
                    result = getRGBColorFromOfficeArtCOLORREF(so.OptionsByID[DIaLOGIKa.b2xtranslator.OfficeDrawing.ShapeOptions.PropertyId.fillColor].op, slide, so);
                    break;

                case 0xFF:     //undefined
                    return("");
                }

                if (result.Length == 0)
                {
                    return("");
                }

                int red   = int.Parse(result.Substring(0, 2), System.Globalization.NumberStyles.HexNumber);
                int green = int.Parse(result.Substring(2, 2), System.Globalization.NumberStyles.HexNumber);
                int blue  = int.Parse(result.Substring(4, 2), System.Globalization.NumberStyles.HexNumber);
                int v     = (int)bytes[2];
                int res;
                return(result);
                //switch (val & 0xff00)
                //{
                //    case 0x100:
                //        if (blue == 0xff) return result;
                //        if (blue == 0x00) return "000000";

                //        res = int.Parse(result, System.Globalization.NumberStyles.HexNumber);
                //        if (!so.OptionsByID.ContainsKey(DIaLOGIKa.b2xtranslator.OfficeDrawing.ShapeOptions.PropertyId.ShadowStyleBooleanProperties))
                //        res -= v; //this is wrong for shadow17
                //        if (res < 0) res = 0;
                //        return res.ToString("X").PadLeft(6, '0');
                //    case 0x200:
                //        if (blue == 0xff) return result;
                //        if (blue == 0x00) return "FFFFFF";

                //        res = int.Parse(result, System.Globalization.NumberStyles.HexNumber);
                //        res += v;
                //        return res.ToString("X").PadLeft(6, '0');
                //    case 0x300:
                //        red += v;
                //        green += v;
                //        blue += v;
                //        if (red > 0xff) red = 0xff;
                //        if (green > 0xff) green = 0xff;
                //        if (blue > 0xff) blue = 0xff;
                //        return red.ToString("X").PadLeft(2, '0') + green.ToString("X").PadLeft(2, '0') + blue.ToString("X").PadLeft(2, '0');
                //    case 0x400:
                //        red -= v;
                //        green -= v;
                //        blue -= v;
                //        if (red < 0) red = 0x0;
                //        if (green < 0) green = 0x0;
                //        if (blue < 0) blue = 0x0;
                //        return red.ToString("X").PadLeft(2, '0') + green.ToString("X").PadLeft(2, '0') + blue.ToString("X").PadLeft(2, '0');
                //    case 0x500:
                //        red = v - red;
                //        green = v - green;
                //        blue = v - blue;
                //        if (red < 0) red = 0x0;
                //        if (green < 0) green = 0x0;
                //        if (blue < 0) blue = 0x0;
                //        return red.ToString("X").PadLeft(2, '0') + green.ToString("X").PadLeft(2, '0') + blue.ToString("X").PadLeft(2, '0');
                //    default:
                //        break;
                //}
            }

            if (fSchemeIndex)
            {
                //red is the index to the color scheme
                //List<ColorSchemeAtom> colors = slide.AllChildrenWithType<ColorSchemeAtom>();
                //ColorSchemeAtom MasterScheme = null;
                //foreach (ColorSchemeAtom color in colors)
                //{
                //    if (color.Instance == 1) MasterScheme = color;
                //}

                switch (bytes[0])
                {
                case 0x00:     //background
                    SchemeType = "bg1";
                    return(new RGBColor(MasterScheme.Background, RGBColor.ByteOrder.RedFirst).SixDigitHexCode);

                case 0x01:     //text
                    SchemeType = "tx1";
                    return(new RGBColor(MasterScheme.TextAndLines, RGBColor.ByteOrder.RedFirst).SixDigitHexCode);

                case 0x02:     //shadow
                    return(new RGBColor(MasterScheme.Shadows, RGBColor.ByteOrder.RedFirst).SixDigitHexCode);

                case 0x03:     //title
                    return(new RGBColor(MasterScheme.TitleText, RGBColor.ByteOrder.RedFirst).SixDigitHexCode);

                case 0x04:     //fill
                    SchemeType = "accent1";
                    return(new RGBColor(MasterScheme.Fills, RGBColor.ByteOrder.RedFirst).SixDigitHexCode);

                case 0x05:     //accent1
                    SchemeType = "accent2";
                    return(new RGBColor(MasterScheme.Accent, RGBColor.ByteOrder.RedFirst).SixDigitHexCode);

                case 0x06:     //accent2
                    SchemeType = "hlink";
                    return(new RGBColor(MasterScheme.AccentAndHyperlink, RGBColor.ByteOrder.RedFirst).SixDigitHexCode);

                case 0x07:     //accent3
                    return(new RGBColor(MasterScheme.AccentAndFollowedHyperlink, RGBColor.ByteOrder.RedFirst).SixDigitHexCode);

                case 0xFE:     //sRGB
                    return(bytes[0].ToString("X").PadLeft(2, '0') + bytes[1].ToString("X").PadLeft(2, '0') + bytes[3].ToString("X").PadLeft(2, '0'));

                case 0xFF:     //undefined
                    break;
                }
            }
            return(bytes[0].ToString("X").PadLeft(2, '0') + bytes[1].ToString("X").PadLeft(2, '0') + bytes[2].ToString("X").PadLeft(2, '0'));
        }