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); }
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); }