c#迭代5个字母的可能组合

本文关键字:组合 迭代 5个 | 更新日期: 2023-09-27 18:14:27

我正在创建一种称为DIF(字典图像格式)的图像格式,其中图像指定图像内的调色板(字典),或者可以选择加载外部调色板。

我正试图为RGB光谱中的所有可能值创建一个颜色字典。我已经找到了如何通过RGB频谱迭代,但我在如何通过所有可能的字典键迭代的损失。

每个字典键将由5个字母的大写或小写字母(如aAaAB)组成。这提供了380204032种可能的组合,足以在RGB中编码1670万种颜色。

这将如何工作,以及我如何将它与我现有的RGB代码集成,这是下面:

Dictionary<string,Color> rgb = new Dictionary<string,Color>();
for(int r = 0; r <= 255; r++)
{
   for(int g = 0; g <= 255; g++)
   {
        for(int b = 0; b <= 255; b++)
        {
            //Add colors to dictionary here
        }
   }
}

c#迭代5个字母的可能组合

我建议你根本不需要字典。

相反,您可以根据需要将每种颜色转换为基数52 (a- za -z)表示法。

这里有一个例子。它使用了一些base转换代码从这里:最快的方式转换一个10进制数到任何base在。net ?

using System;
using System.Drawing;
namespace Demo
{
    internal class Program
    {
        private void run()
        {
            // As an example, iterate through all known colours and demonstrate
            // that we can convert each colour to a 5 character string and back.
            var colors = Enum.GetValues(typeof(KnownColor));
            foreach (KnownColor knowColor in colors)
            {
                Color colour = Color.FromKnownColor(knowColor);
                string colourString = ColourToBase52(colour);
                Color decodedColour = ColourFromBase52(colourString);
                if (colour.ToArgb() != decodedColour.ToArgb())
                    Console.WriteLine("ERROR with colour " + colour); // Expect this to complain about TRANSPARENT.
                else
                    Console.WriteLine("{0,-30} is represented by {1}", colour, colourString);
            }
        }
        public static string ColourToBase52(Color colour)
        {
            int value = colour.ToArgb() & 0x00FFFFFF; // Mask off the alpha channel.
            return ToBase52(value);
        }
        public static Color ColourFromBase52(string colour)
        {
            int value = FromBase52(colour);
            return Color.FromArgb(unchecked((int)(0xFF000000 | value)));
        }
        public static string ToBase52(int value)
        {
            char[] baseChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
            int targetBase = baseChars.Length;
            int i = 32;
            char[] buffer = new char[i];
            do
            {
                buffer[--i] = baseChars[value % targetBase];
                value = value / targetBase;
            }
            while (value > 0);
            char[] result = new char[32 - i];
            Array.Copy(buffer, i, result, 0, 32 - i);
            return new string(result).PadLeft(5, 'a');
        }
        public static int FromBase52(string value)
        {
            char[] baseChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
            int targetbase = baseChars.Length;
            int multiplier = 1;
            int result = 0;
            for (int i = value.Length-1; i >= 0; --i)
            {
                int digit = Array.IndexOf(baseChars, value[i]);
                result += digit*multiplier;
                multiplier *= targetbase;
            }
            return result;
        }
        public static void Main()
        {
            new Program().run();
        }
    }
}