예제 #1
0
        public FormGraphicImport(MainForm Main, Types.GraphicType ImportType, GR.Image.FastImage IncomingImage)
        {
            m_MainForm = Main;
            InitializeComponent();

            m_CurPalette = Main.ActivePalette;

            m_ColorValues[0]  = 0xff000000;
            m_ColorValues[1]  = 0xffffffff;
            m_ColorValues[2]  = 0xff8B4131;
            m_ColorValues[3]  = 0xff7BBDC5;
            m_ColorValues[4]  = 0xff8B41AC;
            m_ColorValues[5]  = 0xff6AAC41;
            m_ColorValues[6]  = 0xff3931A4;
            m_ColorValues[7]  = 0xffD5DE73;
            m_ColorValues[8]  = 0xff945A20;
            m_ColorValues[9]  = 0xff5A4100;
            m_ColorValues[10] = 0xffBD736A;
            m_ColorValues[11] = 0xff525252;
            m_ColorValues[12] = 0xff838383;
            m_ColorValues[13] = 0xffACEE8B;
            m_ColorValues[14] = 0xff7B73DE;
            m_ColorValues[15] = 0xffACACAC;
            m_ColorValues[16] = 0xff80ff80;

            comboBackground.Items.Add("[Any]");
            comboMulticolor1.Items.Add("[Any]");
            comboMulticolor2.Items.Add("[Any]");
            for (int i = 0; i < 16; ++i)
            {
                m_Colors[i]       = GR.Color.Helper.FromARGB(m_ColorValues[i]);
                m_ColorBrushes[i] = new System.Drawing.SolidBrush(m_Colors[i]);

                comboBackground.Items.Add(i.ToString("d2"));
                comboMulticolor1.Items.Add(i.ToString("d2"));
                comboMulticolor2.Items.Add(i.ToString("d2"));
            }

            comboBackground.SelectedIndex  = 0;
            comboMulticolor1.SelectedIndex = 0;
            comboMulticolor2.SelectedIndex = 0;

            picOriginal.DisplayPage.Create(picOriginal.ClientSize.Width, picOriginal.ClientSize.Height, System.Drawing.Imaging.PixelFormat.Format32bppRgb);

            picPreview.DisplayPage.Create(picPreview.ClientSize.Width, picPreview.ClientSize.Height, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
            //picPreview.SetImageSize( 320, 200 );
            for (int j = 0; j < 17; ++j)
            {
                picPreview.DisplayPage.SetPaletteColor(j,
                                                       (byte)((Types.ConstantData.Palette.ColorValues[j] & 0x00ff0000) >> 16),
                                                       (byte)((Types.ConstantData.Palette.ColorValues[j] & 0x0000ff00) >> 8),
                                                       (byte)(Types.ConstantData.Palette.ColorValues[j] & 0xff));
                m_ImportImage.SetPaletteColor(j,
                                              (byte)((Types.ConstantData.Palette.ColorValues[j] & 0x00ff0000) >> 16),
                                              (byte)((Types.ConstantData.Palette.ColorValues[j] & 0x0000ff00) >> 8),
                                              (byte)(Types.ConstantData.Palette.ColorValues[j] & 0xff));
            }


            foreach (Types.GraphicType importType in System.Enum.GetValues(typeof(Types.GraphicType)))
            {
                comboImportType.Items.Add(GR.EnumHelper.GetDescription(importType));
            }
            comboImportType.SelectedIndex = (int)ImportType;

            foreach (ColorMatchType matchType in System.Enum.GetValues(typeof(ColorMatchType)))
            {
                comboColorMatching.Items.Add(GR.EnumHelper.GetDescription(matchType));
            }
            comboColorMatching.SelectedIndex = (int)ColorMatchType.CIE76_DISTANCE;

            OpenImage(IncomingImage);
        }
예제 #2
0
        int MatchColor(byte R, byte G, byte B, Types.Palette Palette)
        {
            int bestMatchDistance = 50000000;
            int bestMatch         = -1;

            ColorMatchType matchType = (ColorMatchType)comboColorMatching.SelectedIndex;

            ColorSystem.RGB origColor = new ColorSystem.RGB(R, G, B);

            for (int k = 0; k < 16; ++k)
            {
                switch (matchType)
                {
                case ColorMatchType.RGB_DISTANCE:
                {
                    int distR = R - (int)((Palette.ColorValues[k] & 0xff0000) >> 16);
                    int distG = G - (int)((Palette.ColorValues[k] & 0x00ff00) >> 8);
                    int distB = B - (int)(Palette.ColorValues[k] & 0xff);
                    //int distance = (int)( distR * distR * 0.3f + distG * distG * 0.6f + distB * distB * 0.1f );
                    int distance = (int)(distR * distR + distG * distG + distB * distB);

                    if (distance < bestMatchDistance)
                    {
                        bestMatchDistance = distance;
                        bestMatch         = k;
                    }
                }
                break;

                case ColorMatchType.HUE_DISTANCE:
                {
                    ColorSystem.HSV myHSV    = ColorSystem.RGBToHSV(origColor);
                    ColorSystem.HSV otherHSV = ColorSystem.RGBToHSV(new ColorSystem.RGB((byte)((Palette.ColorValues[k] & 0xff0000) >> 16), (byte)((Palette.ColorValues[k] & 0x00ff00) >> 8), (byte)(Palette.ColorValues[k] & 0xff)));

                    int distance = Math.Abs((int)(otherHSV.H - myHSV.H));
                    distance = Math.Min(distance, Math.Abs((int)(otherHSV.H + 360.0 - myHSV.H)));
                    distance = Math.Min(distance, Math.Abs((int)(otherHSV.H - 360.0 - myHSV.H)));

                    distance *= distance;
                    distance += (int)(255.0f * Math.Abs(myHSV.V - otherHSV.V)) * (int)(255.0f * Math.Abs(myHSV.V - otherHSV.V));
                    distance += (int)(255.0f * Math.Abs(myHSV.S - otherHSV.S)) * (int)(255.0f * Math.Abs(myHSV.S - otherHSV.S));

                    if (distance < bestMatchDistance)
                    {
                        bestMatchDistance = distance;
                        bestMatch         = k;
                    }
                }
                break;

                case ColorMatchType.CIE76_DISTANCE:
                {
                    ColorSystem.CIELab myLab    = ColorSystem.RGBToCIELab(origColor);
                    ColorSystem.CIELab otherLab = ColorSystem.RGBToCIELab(new ColorSystem.RGB((byte)((Palette.ColorValues[k] & 0xff0000) >> 16), (byte)((Palette.ColorValues[k] & 0x00ff00) >> 8), (byte)(Palette.ColorValues[k] & 0xff)));

                    float distL = (myLab.L - otherLab.L) * (myLab.L - otherLab.L);
                    float dista = (myLab.a - otherLab.a) * (myLab.a - otherLab.a);
                    float distb = (myLab.b - otherLab.b) * (myLab.b - otherLab.b);

                    int distance = (int)(distL + dista + distb);

                    if (distance < bestMatchDistance)
                    {
                        bestMatchDistance = distance;
                        bestMatch         = k;
                    }
                }
                break;
                }
            }
            return(bestMatch);
        }