首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >生成带有2,073,600种独特颜色的1920 x 1080图形

生成带有2,073,600种独特颜色的1920 x 1080图形
EN

Code Golf用户
提问于 2014-01-22 21:32:30
回答 8查看 12.8K关注 0票数 25

挑战:

编写一个程序,输出1920年像素宽1080像素的图形文件。图形中的每一个2,073,600像素必须是唯一的颜色,不应重复颜色值。颜色应该在RGB中指定,从0,0,0开始,然后向上数到255,255。你会发现一个1920年x 1080像素的图像将包含大量的黑人,蓝色和绿色只。

例如,(较小的缩减版本)。如果高度设置为5,宽度设置为5,则输出25像素的正方形图形,每个像素将是唯一的颜色。RGB颜色数组如下所示:

代码语言:javascript
复制
Array (
[0] => Array
    (
        [0] => 0
        [1] => 0
        [2] => 0
    )

[1] => Array
    (
        [0] => 0
        [1] => 0
        [2] => 1
    )

[2] => Array
    (
        [0] => 0
        [1] => 0
        [2] => 2
    )

[3] => Array
    (
        [0] => 0
        [1] => 0
        [2] => 3
    )

[4] => Array
    (
        [0] => 0
        [1] => 0
        [2] => 4
    )

[5] => Array
    (
        [0] => 0
        [1] => 0
        [2] => 5
    )

[6] => Array
    (
        [0] => 0
        [1] => 0
        [2] => 6
    )

[7] => Array
    (
        [0] => 0
        [1] => 0
        [2] => 7
    )

[8] => Array
    (
        [0] => 0
        [1] => 0
        [2] => 8
    )

[9] => Array
    (
        [0] => 0
        [1] => 0
        [2] => 9
    )

[10] => Array
    (
        [0] => 0
        [1] => 0
        [2] => 10
    )

[11] => Array
    (
        [0] => 0
        [1] => 0
        [2] => 11
    )

[12] => Array
    (
        [0] => 0
        [1] => 0
        [2] => 12
    )

[13] => Array
    (
        [0] => 0
        [1] => 0
        [2] => 13
    )

[14] => Array
    (
        [0] => 0
        [1] => 0
        [2] => 14
    )

[15] => Array
    (
        [0] => 0
        [1] => 0
        [2] => 15
    )

[16] => Array
    (
        [0] => 0
        [1] => 0
        [2] => 16
    )

[17] => Array
    (
        [0] => 0
        [1] => 0
        [2] => 17
    )

[18] => Array
    (
        [0] => 0
        [1] => 0
        [2] => 18
    )

[19] => Array
    (
        [0] => 0
        [1] => 0
        [2] => 19
    )

[20] => Array
    (
        [0] => 0
        [1] => 0
        [2] => 20
    )

[21] => Array
    (
        [0] => 0
        [1] => 0
        [2] => 21
    )

[22] => Array
    (
        [0] => 0
        [1] => 0
        [2] => 22
    )

[23] => Array
    (
        [0] => 0
        [1] => 0
        [2] => 23
    )

[24] => Array
    (
        [0] => 0
        [1] => 0
        [2] => 24
    )

)

规则:

  • 任何编程语言都可以用来生成图像。
  • 得票率最高的是答案。
  • 颜色只能使用一次。
  • 位置为0,0的像素必须以颜色0,0,0开始。
  • 颜色必须在真正的颜色24位范围内。
  • 图像大小必须为1920 x 1080像素。
  • 颜色必须采用RGB格式。
  • 使用库输出图像是可以的。
  • 输出必须是图形文件的格式,例如output.png
  • 输出为表示颜色值的文本不算数,代码必须输出图形文件。
  • 输出图像的文件大小并不重要。
  • 您必须能够通过在chrome web浏览器中以图形形式打开输出来查看它。

如果你能用非常短的代码来做这件事,你的程序也会给我留下深刻的印象,你的程序还会输出以秒为单位的时间来生成嵌入在顺序像素上的图像,你的程序在10秒内输出图像。如果你的程序在1秒内输出图像,我会印象深刻的。

EN

回答 8

Code Golf用户

发布于 2014-01-25 17:06:46

C++,750个字节

全分辨率PNG (5.1MB)

该代码从0-1080*1920创建一个所有整数的集合,然后按总体亮度对它们进行排序。然后创建Mandelbrot集,并根据它们的转义迭代和值对位置进行排序。然后,它通过两组,分配颜色从黑暗到明亮的曼德尔布洛特值最小到最大。最后,它将每像素BMP图像32位写入作为命令行参数指定的输出文件名。

代码语言:javascript
复制
#include <windows.h>
#include <vector>
#include <algorithm>
#define X _complex
#define U int
#define S(j,g)std::sort(j.begin(),j.end(),g);
U w=1920,h=1080;
WORD q[27]={'MB',36918,126,0,0,54,0,40,0,w,0,h,0,1,32,0,0,36864,126};
#define V(a,b)((a>>b)&255)
#define L(z)V(z,16)*.3+V(z,8)*.6+V(z,0)*.1
#define F for(c=0;c<w*h;c++)
U C(U a,U b){return L(a)<L(b);}
U M(X a,X b){return a.x<b.x;}
U main(U c,char**v){
std::vector<U>l;
std::vector<X>D;
F l.push_back(c);
U*i=new U[c];
DWORD p;
F{float r=0,i=0,R;p=0;
for(;p<w&&r*r+i*i<4;p++){R=r*r-i*i;i=2*r*i+(c/w-h/2)/400.;r=R+(c%w-w/2)/400.;}
X d={-p-r*r-i*i,c};
D.push_back(d);}
S(l,C)
S(D,M)
F i[(U)D[c].y]=l[c];
void*f=CreateFileA(v[1],4<<28,0,0,2,0,0);
WriteFile(f,q,54,&p,0);
WriteFile(f,i,w*h*4,&p,0);}

代码并不是完全的黄金,但它不会变得太小。

票数 16
EN

Code Golf用户

发布于 2014-01-24 22:18:15

C-854字节(压缩时)

我最初有一些与青色,洋红和黄色的角和平滑的颜色分级,这看起来真的很好,但它不符合规格。

以下是实现规格:使用“第一”2,073,600种颜色,没有重复,并在左上角黑色。

它的工作原理很酷。它构建一个带有颜色的数组,然后根据不同的标准进行几次垂直和水平排序。最终的结果是令人愉悦的蓝绿之间和暗与光之间的过渡。它大约需要1.5秒才能运行。编译使用:gcc -o many many.c -lm和运行使用:./many > many.ppm

代码语言:javascript
复制
#include <stdlib.h>
#include <stdio.h>

#define W 1920
#define H 1080

typedef struct {unsigned char r, g, b;} RGB;

int S1(const void *a, const void *b)
{
        const RGB *p = a, *q = b;
        int result = 0;

        if (!result)
                result = (p->b + p->g * 6 + p->r * 3) - (q->b + q->g * 6 + q->r * 3);

        return result;
}

int S2(const void *a, const void *b)
{
        const RGB *p = a, *q = b;
        int result = 0;

        if (!result)
                result = p->b - q->b;
        if (!result)
                result = p->g - q->g;
        if (!result)
                result = q->r - p->r;

        return result;
}

int main()
{
        int i, j, n;
        RGB *rgb = malloc(sizeof(RGB) * W * H);
        RGB c[H];

        for (i = 0; i < W * H; i++)
        {
                rgb[i].b = i & 0xff;
                rgb[i].g = (i >> 8) & 0xff;
                rgb[i].r = (i >> 16) & 0xff;
        }

        qsort(rgb, H * W, sizeof(RGB), S1);

        for (n = 0; n < 2; n++)
        {
                for (i = 0; i < W; i++)
                {
                        for (j = 0; j < H; j++)
                                c[j] = rgb[j * W + i];
                        qsort(c, H, sizeof(RGB), S2);
                        for (j = 0; j < H; j++)
                                rgb[j * W + i] = c[j];
                }

                for (i = 0; i < W * H; i += W)
                        qsort(rgb + i, W, sizeof(RGB), S1);
        }

        printf("P6 %d %d 255\n", W, H);
        fwrite(rgb, sizeof(RGB), W * H, stdout);

        free(rgb);

        return 0;
}

这是最初的图像..。

对于那些对生成这个图像所用的代码感兴趣的人:

代码语言:javascript
复制
#include <stdio.h>
#include <math.h>

int main(int argc, char **argv)
{
        int x, y;
        int w = (argc > 1)? atoi(argv[1]): 1920;
        int h = (argc > 2)? atoi(argv[2]): 1080;
        double l = hypot(w, h);

        fprintf(stdout, "P6 %d %d 255\n", w, h);

        for (y = 0; y < h; y++)
        {
                for (x = 0; x < w; x++)
                {
                        unsigned char v[3];
                        v[0] = floor(256 * hypot(0 - x, h - y) / l);
                        v[1] = floor(256 * hypot(w - x, h - y) / l);
                        v[2] = floor(256 * hypot(w - x, 0 - y) / l);
                        fwrite(v, sizeof(unsigned char), 3, stdout);
                }
        }

        return 0;
}
票数 11
EN

Code Golf用户

发布于 2014-01-23 02:28:20

Ruby,109

代码语言:javascript
复制
require'chunky_png';i=ChunkyPNG::Image.new 1920,1080
i.area.times{|v|i[*(v.divmod(1080))]=v<<8|255};i.save ?i

编辑:我应该注意到,我提交这个问题时,问题仍然被标记为密码-高尔夫,在它成为一个人气-竞赛之前,所以我选择了简短的代码。这不是很有想象力,但我相信这是一份有效的意见书。

颜色值从00 00 001f a3 ff不等,由1递增,因此在结果中缺少red并不令人惊讶。

为了在源代码长度中添加一个字符(将<<8替换为<<11),可以获得以下输出。这涵盖了更多的光谱范围,代价是blue分辨率。它通过RGB空间以8倍的速度递增。颜色值从00 00 00fd 1f f8不等。

票数 8
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/19150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档