颜色到图像空间转换中的幻数

时间:2017-04-13 11:04:17

标签: c# image colors bmp procedural

请忽略以下;我忘了整数溢出是如何工作的>。<

this Code Golf问题上看到令人难以置信的答案之后,我想我可能会在C#中生成自己的图像。我偶然发现了一段时间试图制作一个XOR图并发现直接写入组件(例如red = a ^ b)不起作用,但是围绕核心a ^ b编写围绕对数的trig函数;有什么理由吗?

核心颜色生成器(绘制XOR图):

ColorVec currColor = new ColorVec((float)Math.Sin(Math.Log(j ^ i)),
                                  (float)Math.Cos(Math.Log(j ^ i)),
                                  (float)Math.Tan(Math.Log(i ^ j)));

ColorVec的构造函数:

public ColorVec(float xR, float yG, float zB)
{
    red = xR;
    green = yG;
    blue = zB;
}

用于在浮点颜色和Bitmap期望的八位颜色之间进行转换的函数:

public byte GetIntRed()
{
   return (byte)(red * 255);
}

public byte GetIntGreen()
{
   return (byte)(green * 255);
}

public byte GetIntBlue()
{
   return (byte)(blue * 255);
}

程序代码:

class Program
{
    static void Main(string[] args)
    {
        short width = 2048;
        Random rand = new Random();
        Bitmap imageWriting = new Bitmap(width, width);

        for (short i = 0; i < width; i += 1)
        {
            Console.WriteLine(String.Concat("Working... (writing batch ", i, " of ", width, ")"));

            for (short j = 0; j < width; j += 1)
            {
                ColorVec currColor = new ColorVec((float)Math.Sin(Math.Log(j ^ i)),
                                                  (float)Math.Cos(Math.Log(j ^ i)),
                                                  (float)Math.Tan(Math.Log(i ^ j)));

                imageWriting.SetPixel(i, j, Color.FromArgb(1, currColor.GetIntRed(),
                                                              currColor.GetIntGreen(),
                                                              currColor.GetIntBlue()));
            }
        }

        imageWriting.Save("test.bmp", System.Drawing.Imaging.ImageFormat.Bmp);
    }
}

1 个答案:

答案 0 :(得分:1)

我认为这个问题不是很清楚,但仍会尝试提供一些想法。

因此,您在某种意义上尝试绘制3D图:两个变量是ij coodinate,第三个变量是颜色。您的函数i^j(或任何其他此类函数)返回一个整数,现在您需要将该整数映射到某种颜色。这可以通过多种方式完成,最直接的只是:

var color = Color.FromArgb(i ^ j); // will produce more clear plot than your way

这会将结果的一个字节视为aplha,将另外3个字节视为r \ g \ b部分。你正在使用另一种方式,但它没有任何特殊含义。 SinCosTan功能只有范围(-1; 1),所以当你将结果乘以255并转换为字节时(负浮点数转换为字节也可以) - 你得到一个有效的颜色部分。 Log函数不是必需的,但是如果你应用它 - 结果颜色就会不同了。