Tạo đồ họa 1920 x 1080 với 2.073.600 màu độc đáo


24

Thử thách:

Viết chương trình xuất ra tệp đồ họa rộng 1920 pixel cao 1080 pixel. Mỗi một trong số 2.073.600 pixel trong đồ họa phải là một màu duy nhất và không được lặp lại các giá trị màu. Các màu nên được chỉ định trong RGB và bắt đầu ở 0,0,0 và đếm ngược lên theo thứ tự theo hướng 255,255,255. Bạn sẽ tìm thấy hình ảnh 1920 x 1080 pixel sẽ chỉ chứa nhiều màu đen, xanh lam và xanh lục.

Ví dụ: (một phiên bản cắt giảm nhỏ hơn). Nếu chiều cao được đặt thành 5 và chiều rộng được đặt thành 5, đồ họa hình vuông 25 pixel sẽ được xuất ra và mỗi pixel sẽ là một màu duy nhất. Mảng màu RGB sẽ trông như thế này:

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
    )

)

Quy tắc:

  • Bất kỳ ngôn ngữ lập trình có thể được sử dụng để tạo ra hình ảnh.

  • Câu trả lời với hầu hết các chiến thắng.

  • Màu sắc chỉ được sử dụng một lần.

  • Pixel ở vị trí 0,0 phải bắt đầu bằng màu 0,0,0

  • Màu sắc phải nằm trong phạm vi màu thật 24 bit.

  • Hình ảnh phải có kích thước 1920 x 1080 pixel.

  • Màu sắc phải ở định dạng RGB.

  • Sử dụng một thư viện để xuất hình ảnh là ok.

  • Đầu ra phải ở định dạng của tệp đồ họa, ví dụ output.png

  • Đầu ra dưới dạng văn bản đại diện cho các giá trị màu không được tính, mã phải xuất ra một tệp đồ họa.

  • Kích thước tệp của hình ảnh đầu ra không quan trọng.

  • Bạn phải có thể xem đầu ra bằng cách mở nó dưới dạng đồ họa trong trình duyệt web chrome.

Tôi sẽ rất ấn tượng nếu bạn thực hiện điều này với mã thực sự ngắn, chương trình của bạn cũng xuất ra thời gian tính bằng giây để tạo hình ảnh được nhúng trong chính hình ảnh được phủ lên trên các pixel liên tiếp, chương trình của bạn xuất ra hình ảnh trong vòng 10 giây. Tôi sẽ thực sự ấn tượng nếu chương trình của bạn xuất hình ảnh trong vòng 1 giây.


3
Nếu đây là mã golf, làm thế nào để các yếu tố tiền thưởng trong? Phần thưởng 10 ký tự dường như rất rất nhỏ đối với mã (có hiệu quả) dự đoán tương lai.
Kendall Frey

1
Bây giờ không có giá trị tiền thưởng! Làm thế nào chúng ta phải có được những phần thưởng đó? Mặc kệ họ?
Kendall Frey

3
Chọn một ngôn ngữ ngắn gọn và API PNG ngắn gọn (quan trọng!) Và sau đó đếm đến 2.073.600. Xin lỗi vì quá quan trọng, @BenPaton, nhưng tôi dự đoán sự lựa chọn ngôn ngữ và API sẽ là yếu tố lớn nhất ở đây, không phải là sự hiển thị của lập trình thông minh. Nhưng tôi thường sai và thậm chí ít thông minh hơn. :-)
Darren Stone

2
Yêu cầu cho một pixel đen x==y==0có vẻ hơi tùy tiện. Trong mọi trường hợp, điều này không rõ ràng vì các tọa độ này có thể đề cập đến góc trên cùng bên trái hoặc góc dưới bên trái của hình ảnh.
squossish ossifrage

3
Bản sao của hình ảnh với tất cả các màu sắc ; sự khác biệt duy nhất là giới hạn trong bảng màu chỉ là màu xanh lam và màu xanh lá cây, chứ không phải tất cả chúng, điều này không tạo ra sự khác biệt lớn cho vấn đề nhưng làm cho đầu ra kém đẹp.

Câu trả lời:


40

Python - 660+ byte

Phiên bản tăng dần

Kích thước đầy đủ: http://www.pictureshack.net/images/57626_all_colors.png (4.52MB)

Đây là một hình ảnh dựa trên fractal Julia Set . Mỗi màu được thêm vào hình ảnh tăng dần, mặc dù có một lượng tính toán trước đáng kể.


Phiên bản độ chói

Kích thước đầy đủ: http://www.pictureshack.net/images/95389_all_colors4.png (5.24MB)

Tôi đã thêm một tùy chọn để lặp lại từng màu theo độ sáng, thay vì theo chỉ số. Điều này không đủ điều kiện là "đếm ngược" từ số không, nhưng đây dường như là một yêu cầu lỏng lẻo. Thật thú vị khi hai thứ tự này phơi bày các cấu trúc hoàn toàn khác nhau trong hình ảnh. Để sử dụng, đặt use_luminositycờ thành True.


Nguồn

Yêu cầu PIL .

Được cảnh báo : điều này sẽ mất vài phút để thực thi. Sử dụng PyPy với Gối chạy trong khoảng 1/5 thời gian của CPython với PIL, vì vậy tôi sẽ khuyên bạn nên, nếu có thể.

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()

Chỉnh sửa : cập nhật sao cho #000000ở phía trên bên trái, như được chỉ định.
Chỉnh sửa : thêm một cờ để lặp lại màu sắc bằng độ sáng.
Chỉnh sửa : chuyển sang tính toán phức tạp riêng và trọng số độ sáng nguyên, nhanh hơn một chút.


Các giải pháp tôi đã thực hiện trước khi tiêu chí chính trở thành

PHP - 161 byte

<?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();

Điều này sẽ cho đầu ra nhanh nhất có thể. Không có thư viện nào được sử dụng, chỉ có một tiêu đề được tính toán trước và đầu ra byte trực tiếp. Chạy trong ít hơn 2 giây trên comp của tôi. Bằng cách tăng thêm 256 thay vì 1 , nó tạo ra hiệu ứng giả độ dốc, không cần tính toán thực sự. Sự sụp đổ duy nhất là ( 0, 0 ) không phải là màu đen, nhưng kết quả trông đẹp hơn rất nhiều.

ob_start();ob_end_flush();không thực sự cần thiết, nhưng việc đệm đầu ra làm cho nó chạy nhanh hơn rất nhiều.

Các mức tăng thú vị khác bao gồm:

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

Và nhiều người khác. Mặc dù, hầu hết các mẫu trông giống như bất cứ thứ gì giống như sọc


PHP - 105 byte

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

Phiên bản coi thường liều lĩnh.

  • Đưa ra một Content-typetiêu đề bị hỏng , Chrome sẽ cố gắng hết sức để tìm ra những gì nó được gửi. Trong trường hợp này, nó xác định chính xác nó là image/bmp. Các phiên bản mới nhất của FireFox và IE cũng có thể sửa tiêu đề bị hỏng.
  • Các barewords BM, I5S2CSsẽ tạo ra một NOTICElỗi. Để ngăn chặn tham nhũng của hình ảnh, báo cáo lỗi trong php.inisẽ cần phải được thiết lập để ngăn chặn điều này (ví dụ error_reporting = E_ALL & ~E_NOTICE).
  • Không có bộ đệm đầu ra. Hình ảnh được xây dựng 3 byte mỗi lần, chậm hơn đáng kể.
  • Điểm ( 0, 0 ) được coi là phía dưới bên trái, thay vì phía trên bên trái.


PHP-CLI - 83 byte

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

Chạy trực tiếp từ dòng lệnh và được dẫn đến một tệp (ví dụ $ php all-colors.php > out.bmp), không cần Content-typetiêu đề. Tệp kết quả giống hệt với phiên bản 105 byte và có thể được xem trong Chrome.


3
Tôi thực sự thích các mô hình, rất trippy!
Ben Paton

Tôi thích hình ảnh đầu tiên, nhưng nó dường như vi phạm quy tắc gọi pixel 0,0 là RGB 0,0,0.
Iszi

@primo Có vẻ tốt với tôi bây giờ.
Iszi

1
Tôi thích phiên bản độ sáng rất nhiều, tôi đã đặt nó làm hình nền máy tính của mình :)
Ben Paton

24

C với thư viện đồ họa GD (err, khoảng 2,5 KB?)

Các quy tắc đã không cấm sửa đổi một hình ảnh hiện có. Tôi đã tạo một chương trình để thay thế tất cả các pixel của hình ảnh bằng các giá trị RGB liên tiếp từ #000000đến #1fa3ffvà tôi khá hài lòng với kết quả. Đây là những gì nó được tạo ra từ một bức ảnh được đăng lên Flickr bởi Michael Carian ( cc-by-sa 2.0 ):

Hình thu nhỏ 640x360 pixel của kết quả thử nghiệm

(Ảnh đầu ra thô khá lớn (5,6 MB) )

Đây là cận cảnh của góc trên cùng bên trái (tăng tỷ lệ 400%):

Chế độ xem mở rộng của góc trên cùng bên trái

Thời gian xử lý là khoảng 3 giây cho một hình ảnh có kích thước này:

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

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

và có, tất cả các pixel là các màu khác nhau:

$ identify -format %k outfile.png
2073600

( identifylà một tiện ích ImageMagick; -format %ktùy chọn đếm số lượng màu duy nhất trong một hình ảnh)

Đây là mã nguồn:

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

Ái chà, thật tuyệt vời! : D +1 Ngoài ra, 2,463 KB: P
Doorknob

16

C ++, 750 byte

Bộ Mandelbrot PNG độ phân giải đầy đủ (5.1MB)

Mã này tạo ra một tập hợp tất cả các số nguyên từ 0-1080 * 1920, sau đó sắp xếp chúng theo độ sáng tổng thể. Sau đó, nó tạo ra một bộ Mandelbrot và sắp xếp các vị trí dựa trên giá trị lặp và giá trị thoát của chúng. Sau đó, nó đi qua cả hai bộ, gán các màu theo thứ tự từ tối đến sáng cho các giá trị Mandelbrot nhỏ nhất đến lớn nhất. Cuối cùng, nó ghi một hình ảnh BMP 32 bit cho mỗi pixel vào tên tệp đầu ra được chỉ định làm tham số dòng lệnh.

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

Mã không được đánh gôn hoàn toàn, nhưng nó sẽ không trở nên nhỏ hơn nhiều.


11

C - 854 byte (khi được nén)

Ban đầu tôi có một cái gì đó với các góc màu lục lam, đỏ tươi và vàng và sự chuyển màu mượt mà trông rất đẹp, nhưng nó không đáp ứng được thông số kỹ thuật.

Sau đây đáp ứng các thông số kỹ thuật: sử dụng 2.073.600 màu "đầu tiên", không lặp lại và màu đen ở góc trên cùng bên trái.

Ôi!

Làm thế nào nó hoạt động là loại mát mẻ. Nó xây dựng một mảng với các màu sắc, sau đó sắp xếp theo chiều dọc và chiều ngang theo các tiêu chí khác nhau một vài lần. Kết quả cuối cùng là sự chuyển tiếp dễ chịu giữa màu xanh lam và màu xanh lá cây và giữa bóng tối và ánh sáng. Mất khoảng 1,5 giây để chạy. Biên dịch bằng cách sử dụng: gcc -o many many.c -lmvà chạy bằng:./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;
}

FYI, đây là hình ảnh gốc ...

Ôi!

Và đối với những người quan tâm đến mã được sử dụng để tạo hình ảnh này:

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

Việc tốt nghiệp của màu sắc trong này là thực sự tốt đẹp. Tôi thấy đầu ra từ hình ảnh được tính toán này thực sự khá thẩm mỹ. Tôi có thể dễ dàng sử dụng nó như một hình nền máy tính. Làm tốt!
Ben Paton

Nhìn đẹp, nhưng có một số vấn đề (1) giá trị pixel không duy nhất (dễ dàng kiểm tra: ./a.out | hexdump | headhiển thị 7d ff denhiều lần), (2) không sử dụng các giá trị RGB liên tiếp từ 000000thông qua 1dffffvà (3) pixel tại (x = 0, y = 0) không phải là màu đen. (Mặc dù tôi không thể nhìn thấy quan điểm của (3) bản thân mình.)
ossifrage squeamish

@squeamishossifrage Vâng, tôi nghĩ rằng thông số kỹ thuật bị hạn chế quá mức và đồng thời không cho phép các định dạng tệp có nhiều hơn 8 bit trên mỗi kênh chính hoặc 4 kênh trên mỗi pixel, nếu tôi sử dụng 16 bit cho mỗi chính, sẽ đảm bảo tính duy nhất. Vì đây là một cuộc thi phổ biến, tôi sẽ bỏ qua nó, có thể nó sẽ được một hoặc hai phiếu ...

@squeamishossifrage Điều đó không nói rằng bạn cần lặp từ 0 đến x1dffff, chỉ có điều nó bắt đầu bằng màu đen và đi lên về phía màu trắng nhưng không chính xác như thế nào.
Sylwester

@Sylwester Nó nói rằng bạn phải đếm theo thứ tự và câu tiếp theo nói rằng bạn sẽ tìm thấy hình ảnh 1920 x 1080 pixel sẽ chỉ chứa nhiều màu đen, xanh lam và xanh lục . Mà tôi đã hiểu lầm? (Ngoài việc nhận được 0x1dffff sai; đáng lẽ phải là 0x1fa3ff.)
ossifrage squeamish

8

Hồng ngọc, 109

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

EDIT: Tôi nên lưu ý rằng tôi đã gửi câu hỏi này khi câu hỏi vẫn được gắn thẻ , trước khi nó trở thành một vì vậy tôi sẽ viết mã ngắn. Đây không phải là rất giàu trí tưởng tượng nhưng tôi tin rằng nó là một đệ trình hợp lệ.

Giá trị màu nằm trong khoảng từ 00 00 00đến 1f a3 ff, incrementing bởi 1, do đó thiếu redtrong kết quả là không đáng ngạc nhiên.

đầu ra1

Đối với chi phí thêm 1 ký tự vào độ dài mã nguồn (thay thế <<8bằng <<11), có thể có đầu ra sau. Điều này bao gồm nhiều phạm vi phổ hơn với chi phí bluephân giải. Nó tăng qua không gian RGB với tốc độ gấp tám lần. Giá trị màu nằm trong khoảng từ 00 00 00đến fd 1f f8.

nhập mô tả hình ảnh ở đây


2
Mục nhập của bạn là thực sự tốt. Hình ảnh đầu tiên của bạn trông giống hệt như tôi đang mong đợi. Cũng được thực hiện và cảm ơn vì đã đi. Ấn tượng bạn đã làm điều này rất nhanh và với rất ít mã.
Ben Paton

7

Vợt

Chưa bao giờ sử dụng lập trình hướng đối tượng vợt trước đó (tin nhắn truyền qua) vì vậy tôi không chắc điều này là tối ưu, nhưng dường như nó đã hoàn thành công việc.

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

Hình ảnh với nhiều màu sắc

Bằng cách không sử dụng 3 bit đầu tiên trong kênh màu đỏ, tôi có được cả ba màu trong hình ảnh kết quả của mình.

Brainfuck

Mã này in ra một hình ảnh BMP 24 bit thành STDOUT cho trình thông dịch BF ô 8 bit. Nó tạo ra hình ảnh giống như phiên bản vợt. Nó dựa trên phiên bản pnm.

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

Ubuntu bfcó các ô có 8 bit:

bf img.bf > image.bmp

Phiên bản cũ vi phạm khả năng mở từ Chrome. Nó tạo ra một tệp .pnm tương thích với hầu hết người xem hình ảnh.

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

6

Đã cập nhật, phiên bản đầu tiên không có tất cả các màu duy nhất trong không gian 24 bit:

Toán học: 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}]]

màu sắc độc đáo

Xác minh quy tắc:

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}]

Pixel đầu tiên có màu đen:

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

Tất cả các màu sắc là duy nhất:

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

Toán học: 146

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

màu sắc

Mất 14,778 giây.

Xác minh quy tắc:

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

Pixel đầu tiên có màu đen:

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

Tất cả các màu sắc là duy nhất:

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


Hình ảnh của bạn chỉ có 394.460 màu độc đáo. Chuyển đổi giá trị RGB của bạn thành số nguyên 8 bit trước khi làm phẳng và bạn sẽ thấy lý do tại sao.
squossish ossifrage

@squeamishossifrage được cập nhật.
nhún

6

Con trăn - 104

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

Đây là phiên bản dành cho thử thách chơi gôn. Vì nó chỉ tăng giá trị từ 0 lên đến 2073599, nên nó chỉ chứa các màu duy nhất.

phiên bản ngắn

Con trăn - 110

Vì tôi không thích phiên bản trên (colorrange không được sử dụng đầy đủ), tôi đã thử một cái gì đó như sau:

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

phiên bản mở rộng, nhưng tìm kiếm tốt hơn

Con trăn - 122

Một phần mở rộng khác ở trên:

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")

thậm chí đẹp hơn


i.show()có thể được sử dụng để mở hình ảnh trong trình xem mặc định. Không có yêu cầu nghiêm ngặt rằng nó phải được lưu vào một tệp.
primo

tốt. đó là, khi nó vẫn còn là một thử thách chơi gôn. nhưng cảm ơn vì gợi ý :)
Dave J

cũng .show()không làm việc cho tôi. Dunno tại sao. : P
Dave J

5

Xử lý, 301
Đây không phải là một nỗ lực ở giải pháp ngắn gọn nhất, nhưng nó duy trì tất cả các điều khiển để đạt được sự sắp xếp màu sắc mong muốn. Vâng, màu sắc không liên tiếp, nhưng đó không phải là niềm vui. 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");
}

Thử thách đòi hỏi pixel 0,0phải là RGB 0,0,0. Tôi thấy 31,31,31. Trong thực tế, toàn bộ cột số 0 dường như là màu đó.
Iszi

3

Visual Basic .NET, 273 byte

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

Điều này xuất ra một tệp 5,61 MB:

putput.png

Mã ở trên là phiên bản nén của mã dễ đọc hơn này. Dấu cách đã được xóa để lưu byte.

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

Liên kết đến hình ảnh: http: // hè.pw / k


2

ImageMagick - Chuyển đổi 119

Cho phép sử dụng converttừ hộp công cụ ImageMagick để tạo hình ảnh. Nó chạy trong 0 giây. Nó được đánh gôn tới 119 ký tự. Tôi phủ hai gradient (đỏ-xanh và đen-trắng) chuyển đổi chúng thành HSL và trở lại RGB.

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

Đầu ra2

Ví dụ về lớp phủ gradient có thể được tìm thấy trong các trang hướng dẫn ImageMagick .


1
Nó đẹp, nhưng màu sắc không độc đáo. Hãy thử điều này : identify -format %k o.png. Tôi đã nhận được 1762920, không phải là 2073600
ossifrage

thnx. một điểm khác là hình ảnh không bắt đầu bằng RGB (0,0,0) ở phía trên bên trái. Làm việc trên một bản sửa lỗi ...
CousinCocaine

@squeamishossifrage, cảm ơn vì lệnh xác định. Đã sửa nó ngay bây giờ.
CousinCocaine

1

PHP, 507

Hình ảnh đầu ra

Bạn có thể sẽ cần tăng dung lượng bộ nhớ được phân bổ cho PHP để chạy. Sử dụng GD. Mất khoảng 9 giây để tạo hình ảnh.

$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);

Liên kết đến hình ảnh đầu ra: http://i.stack.imgur.com/AAKqW.png

Xem nó đang chạy trên web: http://ben-paton.co.uk/port portfolio / pixel.php? W = 1920 & h = 1080


Điều này không xác thực yêu cầu của 2.073.600 màu duy nhất vì văn bản cho thời gian tạo là tất cả màu đen? Hoặc điều đó không được tính vì về mặt kỹ thuật nó là một lớp phủ?
Iszi

Vâng, tôi cho rằng tôi đã không nghĩ về điều đó. Khi tôi lần đầu tiên nghĩ về việc này, tôi nghĩ sẽ rất vui nếu có một hình nền kích thước máy tính để bàn không có hai pixel cùng màu. Sau đó, khi tôi bắt đầu chơi với mã đã làm điều này, tôi đã quan tâm đến tốc độ hình ảnh được tạo ra. Tôi cho rằng một giải pháp thực sự hoàn hảo cũng sẽ sử dụng các pixel màu khác nhau cho văn bản nhưng có thể nói rằng điều đó không dễ dàng hơn vì tôi không chắc nó sẽ dễ đọc.
Ben Paton

Bây giờ tôi mới nhận thấy tôi đã nói "xác nhận" khi tôi có nghĩa là "vi phạm". Ồ, tốt. Bạn đã nhận nó.
Iszi

1

DELPHI / PASCAL (Phiên bản # 1), 361 byte

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
Cảm ơn đã gửi một giải pháp delphi thay thế. Bạn có thể tải lên một hình ảnh ví dụ hình thức đầu ra?
Ben Paton

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

màu sắc


0

Java 411 386 + 24 byte

Chơi gôn

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

Bị đánh cắp

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

Kết quả

102.png

Giải trình

Đây không phải là nỗ lực của tôi ở giải pháp ngắn nhất, mà là di động nhất. Chỉ nhập trái cho BufferedImage vì cái kia không lưu byte. Thay vì tải Hình ảnh vào JPanel và viết lên nó, tôi đã tiết kiệm thời gian từ lúc bắt đầu cho đến khi ghi vào đĩa dưới dạng tên tệp. Đối với tôi, điều này dẫn đến kết quả là tên tệp khoảng ~ 110 ms, trong khi thời gian từ đầu đến cuối thường mất ~ 500ms. Cuối cùng, nó phải độc lập với nền tảng như tôi đã thử nghiệm trong cả Windows và Ubuntu VM và nó đã hoạt động (Nó ghi tệp vào Máy tính để bàn của bạn). Phải có câu lệnh return do rác cú pháp có thể gọi được. Mặc dù tôi đang làm việc xung quanh, tôi nghi ngờ tôi sẽ tự mình thực hiện một triển khai tốt hơn nhờ các khoản tiết kiệm từ việc sử dụng l và w cho các vòng lặp của tôi. Tôi muốn nói rằng nửa giây cho java không quá tệ.

 (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

Nhưng tôi tin rằng nó vẫn được xác nhận vì nó vẫn có thể được mở bằng chrome, nó chỉ tự động mở ra trình xem png mặc định của bạn (phiên bản không được thử nghiệm trên các máy dựa trên Unix).

Tôi biết về việc tiết kiệm byte có thể nhưng chủ yếu đã bỏ qua chúng để đủ điều kiện nhận thưởng. Nếu được yêu cầu tôi có thể tải lên ngắn hơn, ví dụ cụ thể về nền tảng. Cảm ơn bạn.

Chỉnh sửa

Đã xóa khối không cần thiết Hãy thử khối Catch và câu lệnh return được định dạng không đúng để giảm ~ 30 byte.
Xóa BufferedImage.TYPE_INT_RGBbởi vì nó thực sự chỉ là 1.


Nhìn lại điều này tôi không nghĩ rằng tôi cần một khối bắt thử vì phương pháp chính phải ném Ngoại lệ cho lambda có thể gọi được để hoạt động ...
jfh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.