2,073,600のユニークな色で1920 x 1080のグラフィックを生成


24

チャレンジ:

幅1920ピクセル、高さ1080ピクセルのグラフィックファイルを出力するプログラムを作成します。グラフィック内の2,073,600ピクセルはすべて一意の色である必要があり、色の値は繰り返さないでください。色はRGBで指定し、0,0,0で開始し、255,255,255に向かって順番にカウントします。1920 x 1080ピクセルの画像には、黒、青、緑のみが多く含まれています。

たとえば、(より小さなカットダウンバージョン)。高さが5に設定され、幅が5に設定された場合、25ピクセルの正方形のグラフィックが出力され、各ピクセルは一意の色になります。RGBカラー配列は次のようになります。

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)

  • 色の値を表すテキストとしての出力はカウントされません。コードはグラフィックファイルを出力する必要があります。

  • 出力画像のファイルサイズは重要ではありません。

  • クロムWebブラウザーでグラフィックとして出力を開いて、出力を表示できる必要があります。

非常に短いコードでこれを行うように管理すると、プログラムは連続したピクセルにオーバーレイされた画像自体に埋め込まれた画像を生成するのに要した時間を経過秒で出力し、プログラムは10秒以内に画像を出力します。あなたのプログラムが1秒以内に画像を出力した場合、私は本当に感銘を受けるでしょう。


3
これがコードゴルフの場合、ボーナスはどのように考慮されますか?10文字のボーナスは、将来を(効果的に)予測するコード非常に小さいようです。
ケンドールフレイ14年

1
ボーナス値はありません!これらのボーナスをどのように受け取るべきですか?それらを無視しますか?
ケンドールフレイ14年

3
簡潔な言語と簡潔なPNG API(クリティカル!)を選択し、2,073,600にカウントします。@BenPatonが非常に重要であることを申し訳ありませんが、ここでは言語とAPIの選択が最大の要因であり、巧妙なプログラミングの表示ではないと予測しています。しかし、私はしばしば間違っていて、賢くはありません。:
ダレンストーン14年

2
の黒いピクセルの要件x==y==0は少しbit意的です。いずれにせよ、これらの座標は画像の左上隅または左下隅を参照する可能性があるため、あいまいです。
squeamish ossifrage 14年

3
すべての色画像の複製。唯一の違いは、カラーパレットで、すべてではなく青と緑のみに制限されていることです。これにより、問題に大きな違いが生じることはありませんが、出力がきれいになりません。

回答:


40

Python-660バイト以上

増分バージョン

フルサイズ:http ://www.pictureshack.net/images/57626_all_colors.png(4.52MB)

これは、ジュリアセットフラクタルに基づく画像です。かなりの量の事前計算がありますが、各色は徐々に画像に追加されます。


輝度バージョン

フルサイズ:http ://www.pictureshack.net/images/95389_all_colors4.png(5.24MB)

インデックスではなく、明度で各色を繰り返すオプションを追加しました。これはゼロからの「カウントアップ」とはみなされませんが、これは緩い要件のようです。これらの2つの順序が、イメージ内の完全に異なる構造を公開しているのは興味深いことです。これを使用するには、use_luminosityフラグをに設定しTrueます。


ソース

PILが必要です。

警告:これは実行に数分かかります。PillowでPyPyを使用すると、PILでCPythonを使用した場合の約5分の1で実行されるため、可能であれば、それをお勧めします。

from PIL import Image, ImageDraw

use_luminosity = True

dim = (1920,1080)

img = Image.new('RGB', dim)
draw = ImageDraw.Draw(img)

xstart = -.776707
ystart = -.134663

a = []

xd = 1.6 / 8192 / dim[0]
yd = 0.9 / 8192 / dim[1]

for x in range(dim[0]):
  print x
  for y in range(dim[1]):
    z = d = complex(xstart + x*xd, ystart + y*yd)
    c = 0
    while abs(z) < 2 and c < 5000:
      z = z*z + d
      c += 1
    a += [(c, -abs(z), x, y)]

a = a[1:]
a.sort(reverse = True)

t = [(i>>16, 255&i>>8, 255&i) for i in range(1, dim[0]*dim[1])]
if use_luminosity:
  t.sort(key = lambda c: c[0]*3 + c[1]*10 + c[2], reverse = True)

r = 0
for c,d,x,y in a:
  draw.point((x,y), t[r])
  r += 1

img.show()

編集:指定されたよう#000000に、左上にあるように更新されます。
編集:明度で色を反復するフラグを追加しました。
編集:ネイティブの複雑な計算、および整数の明度の重みに切り替えました。


主な基準がなる前に取り組んだソリューション

PHP-161バイト

<?header('Content-type: image/bmp');
ob_start();
echo'BM'.pack('I5S2',0,0,26,12,70780800,1,24);
for(;$i=($i-256)%2073601;)echo pack('CS',~$i,~$i>>8);
ob_end_flush();

これにより、最速の出力が可能になります。ライブラリは使用されず、事前に計算されたヘッダーと直接バイト出力のみが使用されます。コンプで2秒未満で実行されます。1ではなく256ずつインクリメントすることにより、実際の計算を必要とせずに擬似勾配効果を生成します。唯一の欠点は、(0、0)が黒ではないことですが、結果はずっと良く見えます。

ob_start();そしてob_end_flush();厳密には必要ではないですが、出力をバッファリングすることは、はるかに高速に実行できます。

その他の興味深い増分には次のものがあります。

17:http : //i.stack.imgur.com/ieyyZ.png
103:http : //i.stack.imgur.com/WD2wa.png
326:http : //i.stack.imgur.com/c4DSF。 png
557:http : //i.stack.imgur.com/eTTWE.png
943:http : //i.stack.imgur.com/7rrmR.png
2125:http : //i.stack.imgur.com/Ct1kM .png

そして、他の多くの。ただし、何かのように見えるほとんどのパターンは、ある種のストライプに似ています


PHP-105バイト

<?=BM.pack(I5S2,header('Content-type:'),0,26,12,70780800,1,24);
for(;$i<2073600;)echo pack(CS,$i,$i++>>8);

無謀なバージョンを無視します。

  • 破損したContent-typeヘッダーがある場合、Chromeは送信されたものを把握するために最善を尽くします。この場合、それはとして正しく識別されimage/bmpます。FireFoxおよびIEの最新バージョンでも、破損したヘッダーを修正できます。
  • 裸の単語BMI5S2およびCS生成されますNOTICEエラーを。イメージの破損を防ぐには、エラー報告をphp.ini設定してこれを防ぐ必要があります(例:)error_reporting = E_ALL & ~E_NOTICE
  • 出力バッファリングなし。イメージは一度に3バイトで構成されますが、これは明らかに遅いです。
  • ポイント(0、0)は、左上ではなく左下と見なされます。


PHP-CLI-83バイト

<?=BM.pack(I5S2,0,0,26,12,70780800,1,24);
for(;$i<2073600;)echo pack(CS,$i,$i++>>8);

コマンドラインから直接実行し、ファイル(例:)にパイプします。ヘッダーは必要あり$ php all-colors.php > out.bmpませんContent-type。結果のファイルは105バイトバージョンと同じで、Chromeで表示できます。


3
私はパターンがとても好きで、とても奇抜です!
ベンパトン14年

私は最初の画像が大好きですが、ピクセル0,0をRGB 0,0,0にすることを求める規則に違反しているようです。
イジィ14年

@primoは今、私には良さそうです。
イッツィ14年

1
私は自分のデスクトップの壁紙として設定した明るさバージョンがとても好きです:)
ベンパトン14年

24

CとGDグラフィックライブラリ(エラー、約2.5 KB?)

ルールは、既存の画像の変更を禁止していません。私はからシーケンシャルRGB値を持つ画像のピクセルのすべてを置き換えるためにプログラムなさ#000000のを#1fa3ff、私は非常に結果に満足しています。Michael Carian(cc-by-sa 2.0によってFlickrに投稿さた写真から生成されたものを次に示します

テスト結果の640x360ピクセルのサムネイル

(生の出力イメージはかなり大きい(5.6 MB)

左上隅の拡大図(400%に拡大):

左上隅の拡大図

このサイズの画像の処理時間は約3秒です。

$ time ./a.out foodface.png outfile.png
File accepted; 1920x1080 pixels
Saving...
Finished

real    0m3.251s
user    0m2.392s
sys 0m0.169s

はい、すべてのピクセルは異なる色です:

$ identify -format %k outfile.png
2073600

identify ImageMagickユーティリティです。この-format %kオプションは、画像内の一意の色の数をカウントします)

ソースコードは次のとおりです。

#include <stdio.h>
#include <stdlib.h>
#include <gd.h>

#define FIRST_PIXEL_MUST_BE_BLACK 1

#define luminance(rgb) (((rgb>>16)&0xff)*77+((rgb>>8)&0xff)*150+(rgb&0xff)*29)

typedef struct { int lum; int rgb; } pal;      /* Colour palette */
typedef struct { int lum; int x; int y; } pix; /* Pixel list */

/* Callback function for qsort */
int pcomp(const void *a, const void *b) {
  return ((pal *)(a))->lum-((pal *)(b))->lum;
}

int main(int argv, char *argc[]) {
  FILE        *infile,*outfile;
  gdImagePtr  img;
  int         img_width;
  int         img_height;
  int         npixels;
  int         x,y,i;
  int         rgb,colour_ref,c;
  pal         *palette;
  pix         *pixels;

  if (argv!=3) return printf("Usage: %s <source> <destination>\n",argc[0]);

  if (!(infile=fopen(argc[1],"r"))) {
    return printf("Can't open source file <%s>\n",argc[1]);
  }
  if (!(img=gdImageCreateFromPng(infile))) {
    return printf("Bad PNG file <%s>\n",argc[1]);
  }
  fclose(infile);

  img_width=img->sx;
  img_height=img->sy;
  npixels = img_width * img_height;
  printf("File accepted; %dx%d pixels\n",img_width,img_height);

  /* Allocate storage for palette and pixel data */
  palette = malloc(npixels * sizeof(pal));
  if (!palette) return printf("Out of memory\n");
  pixels = malloc(npixels * sizeof(pix));
  if (!pixels) return printf("Out of memory\n");

  /* Create palette and sort by luminance */
  for (i=0; i<npixels; i++) {
    palette[i].rgb=i;
    palette[i].lum=luminance(i);
  }
  qsort(palette,npixels,sizeof(pal),pcomp);

  /* Sort image pixels by luminance */
#if FIRST_PIXEL_MUST_BE_BLACK == 1
  colour_ref = gdImageColorAllocate(img,0,0,0);
  gdImageSetPixel(img,0,0,colour_ref);
#endif

  for (x=y=i=0;i<npixels;i++) {
    rgb = gdImageGetTrueColorPixel(img,x,y);
    pixels[i].x=x;
    pixels[i].y=y;
    pixels[i].lum=luminance(rgb);
    if (!(x=++x%img_width)) y++;
  }
#if FIRST_PIXEL_MUST_BE_BLACK == 1
  qsort(pixels+1,npixels-1,sizeof(pix),pcomp);
#else
  qsort(pixels,npixels,sizeof(pix),pcomp);
#endif

  /* Now use the palette to redraw all the pixels */
  for (i=0;i<npixels;i++) {
    c = palette[i].rgb;
    colour_ref = gdImageColorAllocate(img,c>>16,(c>>8)&0xff,c&0xff);
    gdImageSetPixel(img,pixels[i].x,pixels[i].y,colour_ref);
  }

  printf("Saving...\n");
  if (!(outfile=fopen(argc[2],"w"))) {
    return printf("Can't open <%s> for writing\n",argc[2]);
  }
  gdImagePng(img,outfile);
  fclose(outfile);
  gdImageDestroy(img);
  printf("Finished\n");
  return 0;
}

うわー、それはすごい!:D +1また、2.463キロバイト:P
ドアノブ

16

C ++、750バイト

マンデルブロ集合 フル解像度のPNG(5.1MB)

このコードは、0〜1080 * 1920のすべての整数のコレクションを作成し、全体の明るさで並べ替えます。次に、マンデルブロ集合を作成し、エスケープの反復と値に基づいて位置を並べ替えます。次に、両方のセットを順に調べて、暗い色から明るい色、マンデルブロ値の最小から最大の順に色を割り当てます。最後に、コマンドラインパラメーターとして指定された出力ファイル名に32ビット/ピクセルのBMPイメージを書き込みます。

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

コードは完全にゴルフされていませんが、あまり小さくなりません。


11

C-854バイト(圧縮時)

私はもともと、シアン、マゼンタ、黄色の角と滑らかなグラデーションの色で本当に見栄えがよかったのですが、仕様には合いませんでした。

以下は仕様を満たします。「最初の」2,073,600色を使用し、繰り返しはなく、左上隅に黒を使用します。

ああ!

それがどのように機能するかは一種のクールです。色を使用して配列を作成し、数回異なる基準で垂直および水平に並べ替えます。最終結果は、青と緑の間、および暗いと光の間の心地よい遷移です。実行には約1.5秒かかります。次を使用してコンパイルし、次gcc -o many many.c -lmを使用して実行します。./many > many.ppm

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

参考までに、これは元の画像でした...

ああ!

そして、この画像を生成するために使用されるコードに興味がある人のために:

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

これで色の卒業は本当に素晴らしいです。この計算で生成された画像からの出力は、実際には非常に美しいと思います。これをデスクトップの壁紙として非常に簡単に使用できます。よくやった!
ベンパトン14年

ルックスといい、いくつかの問題(1)非一意画素値が(容易に確認:有し./a.out | hexdump | headショーは7d ff de時間の多くを繰り返す)、(2)から順次RGB値を使用しない000000スルー1dffff、及び(X = 0における(3)画素y = 0)は黒ではありません。(私は自分自身(3)のポイントを確認することはできませんが。)
うるさいossifrage

@squeamishossifrageええ、仕様が過度に制限されていると同時に、プライマリあたり8ビットまたはピクセルあたり4チャネルを超えるファイル形式を許可していないと思いました。プライマリあたり16ビットを使用すると、一意性が保証されます。それは人気コンテストですので、私はそれを残しておきます、多分それは...投票または2を取得します

@squeamishossifrage 0からx1dffffまで反復する必要があるとは言いません。黒で始まり、白に向かって上に行くだけですが、正確にはそうではありません。
シルウェスター14年

@Sylwesterこれは、順番にカウントすることになっていると言い、次の文は、1920 x 1080ピクセルの画像には、黒、青、緑のみがたくさん含まれていることがわかりますどのビットを誤解しましたか?(0x1dffffが間違っていることは別として、0x1fa3ffであるべきでした。)
squeamish ossifrage 14年

8

ルビー、109

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 00からで1f a3 ff、増分は1であるためred、結果がなくても驚くことではありません。

output1

ソースコードの長さに1文字を追加するコスト(代わり<<8<<11)を使用すると、次の出力が得られます。これは、blue解像度を犠牲にして、より広い範囲のスペクトルをカバーします。RGB空間を8倍の速度で増加します。色の値の範囲は00 00 00からfd 1f f8です。

ここに画像の説明を入力してください


2
あなたのエントリーは本当に良いです。最初の画像は、私が期待していた通りです。お疲れ様でした。あなたはこれを非常に迅速かつ非常に少ないコードで行ったことに感銘を受けました。
ベンパトン14年

7

ラケット

ラケットオブジェクト指向プログラミング(メッセージパッシング)を使用したことがないため、これが最適であるかどうかはわかりませんが、仕事は完了したようです。

#lang racket
(require racket/draw)
(let* ((x 1920) (y 1080) (b 256) (bb (* b b)) (pic (make-object bitmap% x y)))
  (let loop ((c 0) (v 0))
    (when (> (* x y) c)
      (send pic set-argb-pixels (modulo c x)   ; x
                                (quotient c x) ; y
                                1              ; width
                                1              ; height
                                (list->bytes 
                                 (list 0                            ; alpha
                                       (modulo v b)                 ; red
                                       (quotient v bb)              ; green 
                                       (modulo (quotient v b) b)))) ; blue
      (loop (+ c 1) (+ v 8))))
  (send pic save-file "image.png" 'png))

多くの色の画像

赤チャネルの最初の3ビットを使用しないことで、結果画像に3色すべてが表示されます。

ブレインファック

このコードは、8ビットセルBFインタープリターの24ビットBMPイメージをSTDOUTに出力します。ラケットバージョンと同じイメージを作成します。これは、pnmバージョンに基づいています。

>-------->>+>----->-------->+++++++>>---->------>++>--->>++++[-<+++
+>]<[-<+++++<++++<++<+<++++++++<<+++++++++++++<<<<++>>>>>>>>>>>]<<[
.[-]>]++[-<++++>]<[->.<]<<.[-]...<.[-]...<[.[-]<].<.[-].<+[>>>>+<.<
<.>.>++++++++[>-]>[<<+[>>-]>>[<<<+[>>>-]>>>[<<<<->>>>>>>]<]<]<<<<<]

Ubuntuにbfは8ビットのセルが付属しています:

bf img.bf > image.bmp

Chromeから開くことができないという古いバージョン。ほとんどの画像ビューアと互換性のある.pnmファイルを作成します。

>------>+++++>+++++>++>------>>-------->>+>------>>++>------->+>--
---->++++++>>>++++[-<++++>]<[-<+++++<+++<+<+++<++++<+++<+++<+<+++<
+++<++++<+++<+<+++<+++<+++<+>>>>>>>>>>>>>>>>>]<[.[-]<]+[>>>>+<.<<.
>.>++++++++[>-]>[<<+[>>-]>>[<<<+[>>>-]>>>[<<<<->>>>>>>]<]<]<<<<<]

6

更新された最初のバージョンでは、24ビット空間ですべての色が一意ではありませんでした。

Mathematica:110

x = 1920; y = 1080; Image[
 ParallelTable[
  List @@ ColorConvert[Hue[h, 1, (b + h)/2], "RGB"], {h, 0, 1 - 1/y, 
   1/y}, {b, 0, 1 - 1/x, 1/x}]]

ユニークな色

ルール検証:

list = ParallelTable[
  List @@ ColorConvert[Hue[h, 1, (b + h)/2], "RGB"], {h, 0, 1 - 1/y, 
   1/y}, {b, 0, 1 - 1/x, 1/x}]

最初のピクセルは黒です:

list[[1, 1]]
{0., 0., 0.}

すべての色はユニークです:

id = ImageData[Image[list], "Bit16"]]
Length[DeleteDuplicates[Flatten[id, 1]]] == 1920*1080
True

Mathematica:146

x = 1920; Image[
 Partition[
  ParallelTable[
   List @@ ColorConvert[Hue[c, 1, c^.01], "RGB"], {c, 0, 1, 1/(
    x*1080)}], x]]

色

14.778秒かかります。

ルール検証:

list = Partition[
  ParallelTable[
   List @@ ColorConvert[Hue[c, 1, c^.01], "RGB"], {c, 0, 1, 1/(
    x*1080)}], x];

最初のピクセルは黒です:

list[[1, 1]]
{0., 0., 0.}

すべての色はユニークです:

Length[DeleteDuplicates[Flatten[list, 1]]] == 1920*1080
True


あなたの画像にはたった394,460のユニークな色があります。RGB値をフラット化する前に8ビット整数に変換すると、その理由がわかります。
squeamish ossifrage 14年

@squeamishossifrageが更新されました。
shrx 14年

6

Python-104

from PIL import Image
a=list(range(2073600))
i=Image.new("RGB",(1920,1080))
i.putdata(a)
i.save("o.png")

これは、コードゴルフチャレンジ用のバージョンです。値を0から2073599に増やしているだけなので、一意の色のみが含まれています。

短縮版

Python-110

上記のバージョンが気に入らなかったので(色の範囲が完全に使用されていないため)、次のようなことを試しました。

from PIL import Image
a=list(range(0,2073600*8,8))
i=Image.new("RGB",(1920,1080))
i.putdata(a)
i.save("o.png")

拡張バージョン、しかし見栄え

パイソン-122

上記の別の拡張:

from PIL import Image
a=[(i<<3,i)[i%2]for i in range(2073600)]
i=Image.new("RGB",(1920,1080))
i.putdata(a)
i.save("o.png")

さらにいい


i.show()デフォルトのビューアで画像を開くために使用できます。ファイルに保存するという厳密な要件はありません。
プリモ14年

まあ。それはまだコードゴルフの挑戦でした。しかし、ヒントをありがとう:)
デイブJ 14年

.show()私にとっても機能しません。どうしてダノ。:P
デイブJ 14年

5

処理、301
これは、最も簡潔な解決策の試みではありませんが、色の望ましい配置を達成するためのすべての制御を維持します。はい、色は連続していませんが、面白くありません。 uniqe.png

int w = 1920;
int h = 1080;
void setup(){
  size(w, h);
  int x = 0; int y = 0;
  for(int i=0; i<w*h; i++){
    stroke(
      (i >> 0) & 0xFF,
      (i >> 6) & 0xFF,  
      (i >> 3) & 0xFF
    );
    if (y % h == 0){
      y = 0;
      x++;
    }
    point(x, y);
    y++;
  }
  save("unique.png");
}

課題にはピクセル0,0がRGBであることが必要0,0,0です。なるほど31,31,31。実際、列のゼロ全体がその色のように見えます。
イッツィ14年

3

Visual Basic .NET、273バイト

Imports System.Drawing : Module Module1
    Sub Main()
        Dim b As New Bitmap(1920, 1080) : For i As Integer = 0 To 2073599 : Dim x = 0 : b.SetPixel(Math.DivRem(i, 1080, x), x, Color.FromArgb(i + &HFF000000)) : Next : b.Save("output.png")
    End Sub
End Module

これにより、5.61 MBのファイルが出力されます。

putput.png

上記のコードは、この読みやすいコードの圧縮バージョンです。バイトを節約するためにスペースが削除されました。

Imports System.Drawing
Module Module1
    Sub Main()
        Dim b As New Bitmap(1920, 1080)
        For i As Integer = 0 To 2073599
            Dim x = 0
            b.SetPixel(Math.DivRem(i, 1080, x), x, Color.FromArgb(i + &HFF000000))
        Next
        b.Save("output.png")
    End Sub
End Module

画像へのリンク:http://µ.pw/k


2

ImageMagick-変換 119

使用することができますconvert画像を作成するためのImageMagickツールボックスから。0秒で実行されます。119キャラクターにゴルフされます。2つのグラデーション(赤青と黒白)をオーバーレイして、それらをHSLに変換し、RGBに戻します。

G=gradient;convert -size 900x900 $G:red-blue \( $G: -rotate 90 \) -compose CopyRed -resize 1920x1080\! -composite o.png

出力2

グラデーションオーバーレイの例は、ImageMagickのマニュアルページにあります


1
それは素晴らしいですが、色はユニークではありません。これを試してくださいidentify -format %k o.png。2073600ではなく1762920を取得しました
-squeamish ossifrage

thnx。もう1つの点は、画像が左上がRGB(0,0,0)で始まっていないことです。...修正に取り組ん
CousinCocaine

@ squeamishossifrage、identifyコマンドに感謝します。今すぐ修正しました。
いとこコカイン14年

1

PHP、507

出力の画像

実行するには、おそらくPHPに割り当てられたメモリの量を増やす必要があります。GDを使用します。画像の生成には約9秒かかります。

$a=microtime(true);$c=1920;$d=1080;$e=$c*$d;$f=@imagecreatetruecolor($c,$d);$h=255;$j=2200000;$k=array();$l=1;for($m=0;$m<=$h;$m++){for($n=0;$n<=$h;$n++){for($o=0;$o<=$h;$o++){if($l<=$j){$k[]=array($m,$n,$o);$l++;}else{break;}}}}while($p<=$e){for($q=0;$q<=$c;$q++){for($s=0;$s<=$d;$s++){$t=imagecolorallocate($f,$k[$p][0],$k[$p][1],$k[$p][2]);imagesetpixel($f,$q,$s,$t);$p++;}}}$u=number_format((microtime(true)-$a),4).' seconds';imagestring($f,6,10,10,$u,$v);header('Content-Type: image/png');imagepng($f);

出力画像へのリンク:http : //i.stack.imgur.com/AAKqW.png

Web上で実行されているのをご覧ください:http : //ben-paton.co.uk/portfolio/pixel.php?w=1920&h=1080


生成時のテキストはすべて黒なので、これは2,073,600の一意の色の要件を検証しませんか?それとも、技術的にオーバーレイであるため、カウントされませんか?
イッツィ14年

はい、私はそれについて考えていなかったと思います。これを最初に考えたとき、同じ色の2ピクセルのないデスクトップサイズの壁紙を作成するのは楽しいと思いました。その後、これを行うコードで遊んでいると、画像が生成される速度に興味を持ちました。本当に完璧なソリューションは、テキストにも異なる色のピクセルを使用すると思いますが、読みやすいかどうかわからないので、それは数えられないと言う方が簡単かもしれません。
ベンパトン14年

「違反」を意味するときに「検証」と言ったことがわかりました。しかたがない。わかった。
イッツィ14年

1

DELPHI / PASCAL(バージョン#1)、361バイト

program P;
{$APPTYPE CONSOLE}
uses
  System.SysUtils, Vcl.Imaging.pngimage,System.UITypes;
var a : TPNGObject; h,w: Integer; c : TColor;
begin
   a :=TPNGObject.CreateBlank(COLOR_RGB, 16, 1920, 1080);
   for h := 0 to 1020 do
     for w := 0 to 1920 do
         begin
         a.Pixels[h,w]:= c ;
         inc(c);
         end;
   a.SaveToFile('e:\t.png');
end.

1
別のデルファイソリューションを提出していただきありがとうございます。出力からサンプル画像をアップロードできますか?
ベンパトン14年

0

Tcl / Tk、149

150

set p [image c photo -w 1920 -h 1080]
set y 0
time {set x 0
time {$p p [format #%06x [expr $y*1920+$x]] -t $x $y
incr x} 1920
incr y} 1080
$p w c.png

色


0

Java 411 386 + 24のバイト

ゴルフ

import java.awt.image.*;()->new BufferedImage(1920,1080,1){{long t=System.currentTimeMillis();int q=-1;for(int i=0;i<getWidth();i++)for(int j=0;j<getHeight();j++)setRGB(i,j,q++);java.io.File f=new java.io.File(System.getProperty("user.home"),"Desktop"+System.getProperty("file.separator")+(System.currentTimeMillis()-t)+".png");javax.imageio.ImageIO.write(this,"png",f);java.awt.Desktop.getDesktop().open(f);}}

非ゴルフ

import java.awt.image.*;
() -> new BufferedImage(1920, 1080, 1) {
        {
            long t = System.currentTimeMillis();
            int q = -1;
            for (int i = 0; i < getWidth(); i++)
                for (int j = 0; j < getHeight(); j++)
                    setRGB(i, j, q++);
            java.io.File f = new java.io.File(System.getProperty("user.home"),
                    "Desktop" + System.getProperty("file.separator")
                            + (System.currentTimeMillis() - t) + ".png");
            javax.imageio.ImageIO.write(this, "png", f);
            java.awt.Desktop.getDesktop().open(f);
        }
    }

結果

102.png

説明

これは最短の解決策での私の試みではなく、最も移植性の高いものです。他のものはバイトを保存しなかったため、BufferedImageのインポートのみを残しました。ImageをJPanelに読み込んで書き込むのではなく、ファイル名としてディスクに書き込むまでの時間を節約しました。私にとって、これは約110ミリ秒のファイル名になりましたが、開始から終了までの時間は通常約500ミリ秒かかりました。最後に、WindowsとUbuntu VMの両方でテストし、機能した(プラットフォームにファイルを書き込む)ので、プラットフォームに依存しないはずです。Callable構文ガベージのため、returnステートメントが必要でした。私は回避策に取り組んでいますが、forループにlとwを使用することで節約できるため、自分でより良い実装を見つけることはできません。Javaの0.5秒はそれほど悪くないでしょう。

 (System.getProperty("os.name").toLowerCase().contains("win")) { try { Process
 * p = Runtime.getRuntime() .exec(new String[] { "cmd", "/c", "start chrome " +
 * f }); p.waitFor(); } catch (Exception e) { } } else if
 * (System.getProperty("os.name").toLowerCase().contains("ix")) { try { Process
 * p = Runtime.getRuntime().exec(new String[] { "google-chrome" + f }); } catch

しかし、それはまだchromeで開くことができるので、まだ検証されており、デフォルトのpngビューア(Unixベースのマシンでテストされていないバージョン)を自動的に開くだけだと思います。

私はバイトの節約が可能であることを知っていますが、主にボーナスの資格を得るためにそれらを省いています。リクエストに応じて、より短いプラットフォーム固有の例をアップロードできます。ありがとうございました。

編集

不要なTry Catchブロックと不正な形式のreturnステートメントを削除して、最大30バイト削減しました。文字通り1であるため
削除されましBufferedImage.TYPE_INT_RGBた。


...主な方法は仕事に呼び出し可能なラムダのために例外をスローする必要があるため、私はトライcatchブロックを必要としないと思う、この振り返る
JFH
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.