Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#迭代5个字母的可能组合_C#_Dictionary_Iteration_Rgb - Fatal编程技术网

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

C#迭代5个字母的可能组合,c#,dictionary,iteration,rgb,C#,Dictionary,Iteration,Rgb,我正在创建一种称为DIF(Dictionary image format)的图像格式,其中图像指定图像中的调色板(Dictionary),或者可以选择加载外部调色板 我试图为RGB光谱中所有可能的值创建一个颜色字典。我已经找到了如何遍历RGB频谱,但是对于如何遍历所有可能的字典键,我感到不知所措 每个字典键将由一个五个字母长的大写或小写字母(如aAaAB)字符串组成。这提供了380204032种可能的组合,足以用RGB编码1670万种颜色 这将如何工作,我将如何将其与我现有的RGB代码集成,如下

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

我试图为RGB光谱中所有可能的值创建一个颜色字典。我已经找到了如何遍历RGB频谱,但是对于如何遍历所有可能的字典键,我感到不知所措

每个字典键将由一个五个字母长的大写或小写字母(如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
        }
   }
}
Dictionary rgb=newdictionary();

对于(int r=0;r,我建议您根本不需要字典

相反,您可以根据需要将每种颜色转换为base 52(a-zA-Z)表示法

下面是一个示例。它使用了下面的一些基本转换代码:


aAaAB
是如何转换成颜色的?听起来你好像在尝试重新设计十六进制颜色在第一个和第二个for循环中
b
的值是多少?@Jesuraja可能从内部
for
循环复制/粘贴失败如上所述听起来很奇怪…但是你需要指定的第一件事是回答你的问题这是int到char的转换吗?0=a,1=b,2=a,3=b或其他。或者,您需要指定在前一个值上添加一个字符时,五个字符的字符串是如何增加的,是a,aa,aaa还是a,ab,abc还是a,a,b?我不明白您想做什么?为什么要将颜色转换为五个字符的字符串?为什么不使用六个字符的十六进制co普遍认可的des?如果您试图使颜色更紧凑以节省内存或其他什么,为什么不使用3字节值作为键?为什么您需要一个字典?生成的值很容易转换为/从十六进制/字节/颜色,而无需字典查找。有可能将alpha通道转换为c吗转换为黑色以外的另一种颜色?如果不是,那没关系。@i或者阿尔法通道实际上被忽略,并且颜色总是被假定为完全实心。
colortobase52()
忽略阿尔法值,而
colorFromBase52()
将其设置为0xff(实心),在那里它有
0xFF000000 |值
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();
        }
    }
}