Sắp xếp các pixel


35

Nhiệm vụ của bạn là tạo ra một chương trình, sẽ đưa ra một hình ảnh đầu vào, tạo ra một hình ảnh đầu ra có cùng kích thước, trong đó tất cả các pixel được sắp xếp theo giá trị hex.

Chương trình của bạn có thể:

  • Sắp xếp các pixel từ trái sang phải rồi xuống hoặc đầu tiên sắp xếp theo cột và sau đó phải. Trong mọi trường hợp, pixel trên cùng bên trái là nhỏ nhất và dưới cùng bên phải là lớn nhất.
  • Sử dụng tính minh bạch, nhưng điều này là không bắt buộc.
  • Sắp xếp theo RGB, nhưng bạn có thể sử dụng CMY hoặc bất kỳ định dạng nào khác có ít nhất 3 giá trị. Bạn có thể chọn những giá trị để sắp xếp. (HSV có thể cung cấp một số hình ảnh đẹp)
  • Sử dụng bất kỳ định dạng hình ảnh nổi tiếng mà hầu hết các máy tính có thể mở.

Quy tắc:

  • Đầu ra phải được ghi vào đĩa hoặc có thể chuyển thành tập tin.
  • Đầu vào được đưa ra dưới dạng đối số dòng lệnh, dưới dạng đường dẫn tương đối đến hình ảnh hoặc được lấy từ dòng lệnh.
  • Đây là mã golf, vì vậy mã ngắn nhất trong byte thắng!

Câu trả lời:


20

Pyth - 10 byte

Đọc hình ảnh, thu gọn bitmap, sắp xếp và sau đó phân tách bitmap một lần nữa, sau đó viết.

.wclK'zSsK

Không làm việc trực tuyến vì lý do rõ ràng. Lấy đầu vào là đường dẫn tương đối đến tệp hình ảnh và xuất ra o.png.

Đầu ra từ American Gothic:


3
Tôi hy vọng tôi không phải là người duy nhất có ấn tượng rằng bức ảnh đang chuyển động ...
Quentin

Nó trông giống như gỗ.
Joe Z.

19

JavaScript (ES6), 383 377 354 byte

f=s=>{d=document,i=new Image,i.src=s,i.onload=$=>{c=d.createElement`canvas`,x=c.getContext`2d`,c.width=w=i.width,c.height=h=i.height,x.drawImage(i,0,0),D=x.getImageData(0,0,w,h),t=D.data,t.set([].concat(...[...t].map((v,i,T)=>i%4?[,,,0]:T.slice(i,i+4)).sort((a,b)=>a.some((v,i)=>k=v-b[i])&&k)).slice(12*w*h)),x.putImageData(D,0,0),d.body.appendChild(c)}}

đầu ra mẫu

Bản chạy thử:

Cách mã này hoạt động là sử dụng getImageDatađể có được một mảng của biểu mẫu

[R,G,B,A,
 R,G,B,A,
 R,G,B,A,
 ...]

mapnó đến một mảng của mẫu

[[R,G,B,A],[0,0,0,0],[0,0,0,0],[0,0,0,0],
 [R,G,B,A],[0,0,0,0],[0,0,0,0],[0,0,0,0],
 [R,G,B,A],[0,0,0,0],[0,0,0,0],[0,0,0,0],
 ...]

Vì vậy, các giá trị R được ánh xạ tới các mảng của tập RGBA và các giá trị B, G và A biến thành các mảng 0 có giá trị tối thiểu. Khi chúng ta sắp xếp mảng này, tất cả các [0,0,0,0]mảng sắp xếp ở dưới cùng và các mảng giá trị thực sắp xếp bình thường ở trên cùng:

[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],
 [0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],
 [0,0,0,0],..., [R,G,B,A],[R,G,B,A],[R,G,B,A],...]
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
               extract & flatten these sorted pixels

Chúng tôi lướt qua phần tư trên cùng của mảng (để mất các giá trị trống mà chúng tôi đã tạo), làm phẳng nó [].concat.applyvà kết thúc với một mảng của biểu mẫu đầu tiên, nhưng lần này, nó đã được sắp xếp.

Hơi thất vọng với khoảng trắng và bình luận:

f=s=>{ 
  // first, load image, then do everything else onload
  i=new Image,
  i.src = s,
  i.onload=$=>{
    // set up the canvas
    d=document,
    c=d.createElement`canvas`,
    w=c.width=i.width,
    h=c.height=i.height,
    x=c.getContext`2d`,

    // draw image to canvas and capture pixel data
    x.drawImage(i,0,0),
    D=x.getImageData(0,0,w,h),
    t=D.data,

    // set pixel data to...
    t.set(
      // the flattened array...
      [].concat(...
        // that is a mapping of the pixel data...
        [...t].map(
          // that clumps RGBA families into subarrays
          // by replacing every fourth value with [R,G,B,A]
          // and all other values to [0,0,0,0]...
          (v,i,T)=>i%4?[,,,0]:T.slice(i,i+4)
        )
        // and is then sorted...
        .sort(
          // by reducing each array to a positive, negative, or zero
          // by comparing R,G,B,& A until the first nonzero difference
          (a,b)=>a.some((v,i)=>k=v-b[i])&&k
        )
      )
      // then eliminate the low-sorted empty [0,0,0,0] values we created,
      // leaving only the top fourth, with real values
      // (note that 3*4*w*h is the same as 3*t.length)
      .slice(3*4*w*h)
    ),

    // now that `t` is set, store `D` in canvas
    x.putImageData(D,0,0),

    // show canvas
    d.body.appendChild(c)
  }
}

Lưu ý rằng hầu hết các trình duyệt có thể không chạy mã này cho các hình ảnh lớn, vì nó chuyển một số lượng lớn các đối số vào [].concat. Khi môi trường trình duyệt không cho phép đủ bộ nhớ cho tất cả các đối số, một cách tiếp cận khác là ánh xạ lại các giá trị RGBA ra khỏi mảng thứ tư hàng đầu trở lại mảng, với tổng số điểm là 361 byte :

f=s=>{d=document,i=new Image,i.src=s,i.onload=$=>{c=d.createElement`canvas`,x=c.getContext`2d`,c.width=w=i.width,c.height=h=i.height,x.drawImage(i,0,0),D=x.getImageData(0,0,w,h),t=D.data,t.set([...t].map((v,i,T)=>i%4?[,,,0]:T.slice(i,i+4)).sort((a,b)=>a.some((v,i)=>k=v-b[i])&&k).map((v,i,A)=>A[3*w*h+(i>>2)][i%4])),x.putImageData(D,0,0),d.body.appendChild(c)}}

Chúng tôi chỉ cần thay thế [].concat(...{stuff}).slice(12*w*h)bằng {stuff}.map((v,i,A)=>A[3*w*h+(i>>2)][i%4]).)


Bạn có thể bao gồm một đầu ra ví dụ?
Paŭlo Ebermann

@ PaŭloEbermann Xong.
apsillers

@insertusernamehere Oh, dang, tôi chỉ thử nghiệm trên những hình ảnh nhỏ. Cuộc concat.applygọi của tôi đang cung cấp quá nhiều đối số concatvà công cụ JS đang từ chối nó. D:Cảm ơn! Tôi sẽ sửa nó và ghi chú hai điểm. (Và tôi rất vui vì tôi có thể giúp!)
apsillers

@insertusernamehere Cảm ơn bạn đã giới thiệu về giới hạn kích thước; Bây giờ tôi cũng đã xuất bản một phiên bản dài hơn một chút, hoạt động trên các hình ảnh lớn hơn.
apsillers

@apsillers Công việc tốt. Không thể upvote một lần nữa không may. :)
insertusernamehere

14

Toán học 86 83 72 byte

 f=Flatten;Image[f[Sort[f[s=ImageData@#1,1]]]~ArrayReshape~Dimensions@s]&

Với 14 byte được lưu nhờ vào @Martin Buttner.


Thí dụ

Hình ảnh chính nó là đầu vào. Ngoài ra, một biến chứa hình ảnh có thể được sử dụng.

gothic


Thử thách xác định rằng các pixel được sắp xếp theo giá trị hex, nhưng nếu tôi đọc chính xác, bạn sử dụng sắp xếp mặc định của Mathicala cho các danh sách {R, G, B} hoặc {R, G, B, alpha}. Tôi không rõ ràng rằng những điều này là tương đương.
Michael Stern

@MichaelStern Tôi không biết Mathicala, nhưng nếu nó sắp xếp các bộ dữ liệu theo từng phần tử như hầu hết các ngôn ngữ, thì chúng tương đương nhau: Các số như hex được sắp xếp theo từng chữ số, hai trong số đó được đại diện bởi mỗi phần tử trong bộ dữ liệu.
Maltysen

@MichaelStern, Maltysen là chính xác. Sắp xếp RGB và sắp xếp Hex tương đương: sắp xếp theo R, sau đó là G, sau đó giá trị B hoạt động giống như sắp xếp giá trị địa điểm trong Hex.
DavidC

OK, +1 từ tôi.
Michael Stern

ImageDataArrayReshapecó thể sử dụng ký hiệu infix. Flattenlà đủ dài để lưu một vài byte bằng cách gán nó vào f. Và bạn có thực sự cần "Byte"? Không phải mặc định chỉ chia tỷ lệ các giá trị kênh [0,1]sao cho việc sắp xếp lại và sắp xếp lại hình ảnh vẫn hoạt động tốt?
Martin Ender

5

Javascript ES6, 334 byte

f=s=>{with((d=document).body.appendChild(c=d.createElement`canvas`).getContext`2d`)(i=new Image).src=s,drawImage(i,0,0,w=c.width=i.width,h=c.height=i.height),t=(g=getImageData(0,0,w,h)).data,t.set([...t].map(i=>(0+i.toString(16)).slice(-2)).join``.match(/.{8}/g).sort().join``.match(/../g).map(i=>parseInt(i,16))),putImageData(g,0,0)}

Ung dung:

f=s=>{                                   // create function that accepts image name
 with((d=document).body.appendChild(     // use "with" to exclude having to prepend "<context2d>." to drawImage, getImageData and putImageData
   c=d.createElement`canvas`).getContext`2d`) // create canvas to get pixels from and draw output to
  (i=new Image).src=s,                   // create image, define source filename
  drawImage(i,0,0,w=c.width=i.width,     // draw image to canvas
                  h=c.height=i.height),
  t=(g=getImageData(0,0,w,h)).data,      // get image data from canvas in form of Uint8Array
  t.set([...t]                           // convert image data from Uint8Array to standard array
   .map(i=>(0+i.toString(16)).slice(-2)) // convert R,G,B,A bytes to base16 strings with leading zeros
   .join``.match(/.{8}/g)                // convert array of [R,G,B,A,R,G,B,A,...] to [RGBA,RGBA,...]
   .sort()                               // sort pixel values
   .join``.match(/../g)                  // convert array of [RGBA,RGBA,...] to [R,G,B,A,R,G,B,A,...]
   .map(i=>parseInt(i,16))),             // convert hex strings back to integers, reassign to image data
  putImageData(g,0,0)                    // dump image data onto canvas
}

@insertusernamehere Nó hoạt động trên Firefox mới nhất. Giống như câu trả lời của bạn, nó giả sử có một cơ thể để nối thêm khung vẽ và hình ảnh nguồn là từ cùng một tên miền.
Dendrobium

+1 Giải pháp rất bóng bẩy. Nó cũng xử lý hình ảnh lên tới 1600 x 1900px.
insertusernamehere 4/11/2015

2
Hôm nay tôi đã học được rằng appendChildtrả về đối số của nó. Rất hữu dụng! Bạn đã truyền cảm hứng cho tôi để giảm bớt mục nhập của tôi từ 377 đến 354, nhưng tôi không thể đánh bại bạn :). (Khi tôi sử dụng kỹ thuật appendChildvà độ bền của bạn , withtôi có thể giảm xuống còn 347, nhưng vẫn còn 13!) Công việc tuyệt vời!
apsillers 04/11/2015

5

C (sử dụng SDL1.2), 333 322 315 byte

C có lẽ không phải là "con dao sắc bén nhất trong kệ" cho loại công việc này, dù sao tôi cũng muốn thử. Lời khuyên để cải thiện câu trả lời của tôi đều được chào đón. Chương trình lấy tên của tệp hình ảnh đầu vào dưới dạng đối số cli.

#include <SDL.h>
#include <SDL_image.h>
#define X SDL_Surface*
#define Y const void*
C(Y a,Y b){return*(Uint32*)a-*(Uint32*)b;}main(int o,char**a){X i=IMG_Load(a[1]);X s=SDL_SetVideoMode(i->w,i->h,32,0);i=SDL_ConvertSurface(i,s->format,0);qsort(i->pixels,i->w*i->h,4,C);SDL_BlitSurface(i,0,s,0);for(;;SDL_Flip(s));}

biên dịch và chạy: gcc -I/usr/include/SDL snippet.c -lSDL -lSDL_image && ./a.out

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

Tôi không thường chơi gôn ở C, nhưng tôi vừa trả lời thử thách này ngày hôm qua và tôi chỉ muốn tiếp tục chơi với món đồ chơi mới đó :)

cảm ơn @ bút danh 117 đã giúp tôi tiết kiệm 5 byte


Có thể tiết kiệm 1 byte bằng cách thay đổi của bạn whileở cuối for(;;SDL_Flip(s));và tôi tin rằng bạn có thể bỏ qua intphương thức Cvà tiết kiệm thêm 4 byte .
bút danh 117

4

JavaScript (ES6), 452 480 484 487 511 byte

Wow, điều này đã lâu hơn dự kiến:

f=u=>{i=new Image;i.src=u;i.onload=_=>{c=(d=document).createElement`canvas`;c.width=w=i.width;c.height=h=i.height;x=c.getContext`2d`;x.drawImage(i,0,0,w,h);p=x.getImageData(0,0,w,h).data;t=[];f=[];for(j=0;j<p.length;++j)t.push([p[j],p[++j],p[++j],p[++j]]);t.sort((a,b)=>a[0]>b[0]||a[0]==b[0]&&a[1]>b[1]||a[0]==b[0]&&a[1]==b[1]&&a[2]>b[2]).map(u=>f.push.apply(f,u));x.putImageData(new ImageData(new Uint8ClampedArray(f),w,h),0,0);d.body.appendChild(c)}}

Hàm lấy một URL làm đầu vào của nó f('test.jpg');và rút kết quả thành một canvasphần được thêm vào body.

Lưu ý rằng nguồn phải nằm trên cùng một tên miền hoặc tập lệnh sẽ tạm dừng với vấn đề bảo mật.


Hạn chế

Tôi đã thử nghiệm nó trong Firefox 42 trên OS X (10.10) trên máy có i7 2,5 GHz và RAM 16 GB. Kích thước hình ảnh tối đa tôi có thể xử lý mà không cần Firefox yêu cầu tiếp tục thực thi tập lệnh là 1600 x 1932 px .


Ung dung

f = u => {
    i = new Image;
    i.src = u;
    i.onload = _ => {
        c = (d = document).createElement`canvas`;
        c.width = w = i.width;
        c.height = h = i.height;

        x = c.getContext`2d`;
        x.drawImage(i, 0, 0, w, h);

        p = x.getImageData(0, 0, w, h).data;

        t = [];
        f = [];

        for (j = 0; j < p.length;++j)
            t.push([p[j], p[++j], p[++j], p[++j]]);

        t.sort( (a,b) => a[0] > b[0] || a[0] == b[0] && a[1] > b[1] || a[0] == b[0] && a[1] == b[1] && a[2] > b[2] )
         .map(u => f.push.apply(f,u));

        x.putImageData( new ImageData( new Uint8ClampedArray(f), w, h), 0, 0);
        d.body.appendChild(c)
    }
}

Đầu ra

Để so sánh tốt hơn, tôi cũng lấy " American Gothic " làm nguồn ví dụ:

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


Chỉnh sửa

  • Đã lưu 24 byte bằng cách sử dụng for (a in b)thay vì for(;;). Cảm ơn ar34z
  • Đã lưu 3 byte bằng cách lưu trữ documenttrong một biến.
  • Đã lưu 4 byte bằng cách bỏ một vài trong số này ().
  • Đã lưu 10 byte bằng cách sử dụng các chuỗi mẫu được gắn thẻ , bỏ qua việc ()tạo đối tượng và loại bỏ một cặp dự phòng khác (). Cảm ơn apsillers .
  • Đã lưu 14 byte bằng cách tái cấu trúc lớn mã làm phẳng mảng màu sau khi sắp xếp. Cảm ơn rất nhiều đến apsillersYpnypn vì đã cắt xén lẫn nhau.
  • Đã lưu 1 byte bằng cách cấu trúc lại for-loop lấy màu của từng pixel.

1
Bạn có thể giảm thiểu các vòng lặp for bằng cách sử dụng for(k in t)sẽ tiết kiệm thêm một vài byte :)
ar34z

1
Công việc tốt đẹp! Một số cải tiến: mất ()trong new Image(); sử dụng các chuỗi mẫu được gắn thẻ cho các đối số chuỗi của bạn ( createElement`canvas`, getContext`2d`), không sử dụng dấu ngoặc đơn cho các tham số chức năng mũi tên đơn (chỉ cần làm f=u=>{...}; parens chỉ dành cho funcs đa tham số hoặc không tham số). Ngoài ra, bạn có thể có một hoặc hai forvòng lặp câu lệnh đơn có dấu ngoặc, không cần thiết.
apsillers

Ồ, thực sự, đối với các mũi tên không có đối số funcs, hãy sử dụng một đối số giả một ký tự thay vì các parens trống hai char. ( i.onload=$=>...thay vì i.onload=()=>...)
apsillers

Tôi nghĩ for(l in u)f.push(u[l]);có thể trở thànhfor(z of u)f.push(z);
Ypnypn

@Ypnypn Nó có thể còn ngắn hơn thế :). - for(u of t)for(z of u)f.push(z)là khá ngắn dang, nhưng nó có thể được rút ngắn hơn nữa t.map(u=>u.map(z=>f.push(z))). Trong rất nhiều trường hợp, việc sử dụng .maphoặc .somevới chức năng mũi tên sẽ ngắn hơn so với sử dụng forvòng lặp. Nếu bạn muốn thực sự phát điên, bạn có thể tiết kiệm nhiều hơn ở đây với t.map(u=>f.push.apply(f,u));nội dung "Với mỗi mảng utrong t, hãy cung cấp udưới dạng danh sách các đối số f.pushthông qua apply(vì pushcó thể chấp nhận số lượng đối số không bị ràng buộc và nó đẩy tất cả chúng theo thứ tự).
apsillers

4

Đồ dùng Bash + GNU, 80

s()(sed 1d $1|cut -d\  -f$2)
sed 1q $1
s $1 2-|sort -t_ -k1.16|paste <(s $1 1) -

Giả định này là định dạng đầu vào / đầu ra ở định dạng .txt pixel ImageMagick. Đầu vào được truyền dưới dạng tên tệp và đầu ra chuyển sang STDOUT.


Nếu ở trên không được coi là định dạng hình ảnh nổi tiếng, thì chúng ta có thể thêm vào các chuyển đổi cần thiết:

Bash + GNU utils + ImageMagick, 108

s()(sed 1d t|cut -d\  -f$1)
convert $1 txt:t
(sed 1q t
s 2-|sort -t_ -k1.16|paste <(s 1) -)|convert txt:- $2

Đầu vào và đầu ra được chỉ định là tên tệp. ImageMagick xác định định dạng tệp nào được sử dụng bởi các tiện ích mở rộng tệp đã qua, vì vậy chúng tôi có thể sử dụng bất kỳ định dạng phổ biến nào:

$ ./sortpixels.sh 398px-Grant_Wood_-_American_Gothic_-_Google_Art_Project.jpg o.png
$ 

Kết quả o.png trông giống như:

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


3

Python 2, 128 byte

from PIL import*
a=Image.open('a')
b=a.load()
c,d=a.size
a.putdata(sorted(b[e,f]for f in range(d)for e in range(c)))
a.save('b')

Với điều kiện hình ảnh là một tệp có tên akhông có phần mở rộng, đầu ra sẽ là một tệp có tên bkhông có phần mở rộng.

Mỹ gothic American Gothic (được sắp xếp)


Tôi đã không kiểm tra, nhưng bạn sẽ có thể làm một cái gì đó dọc theo dòng a.putdata(sorted(b[f/c,f%d]for f in range(d*c)))thay thế (tôi vừa thức dậy, vì vậy tôi có thể đã trộn lẫn các biến).
Kade

Như bạn đã viết, nó không hoạt động (chỉ mục nằm ngoài phạm vi), nhưng tôi chưa thử chuyển đổi bất kỳ biến nào (hiện tại tôi không có nhiều thời gian). @Shebang
Zach Gates

3

Java, 316 byte

import javax.imageio.*;class C{public static void main(String[]a)throws Exception{java.awt.image.BufferedImage i=ImageIO.read(new java.io.File(a[0]));int w=i.getWidth(),h=i.getHeight(),v[]=i.getRGB(0,0,w,h,null,0,w);java.util.Arrays.sort(v);i.setRGB(0,0,w,h,v,0,w);ImageIO.write(i,"png",new java.io.File("a.png"));}}

Đặt các giá trị thập lục phân của các màu pixel trong một mảng. Mảng được sắp xếp và màu sắc được ánh xạ tới các pixel trong ảnh. Tên của hình ảnh kết quả là a.png.

hoa tulip màu vàng đầu vào sản lượng hoa tulip màu vàng
Đầu vào gothic Mỹ nhập mô tả hình ảnh ở đây


3

SmileBASIC, 39 35 byte

Giả sử hình ảnh được tải lên trang đồ họa 512 * 512:

DIM A[0]GSAVE A,0SORT A
GLOAD A,0,1

Giải thích:

DIM IMG[0] 'create array
GSAVE IMG,0 'save graphics to array
SORT IMG 'sort
GLOAD IMG,0,1 'load graphics from array

Nó đơn giản mà! Thật không may, chúng tôi phải sử dụng các số nguyên, thêm 4 byte vào kích thước chương trình do các hậu tố loại.


Tôi không thực sự chắc chắn tại sao ints được yêu cầu. Có vẻ như sử dụng phao thực sự nhận được kết quả chính xác. Chạy mã này bằng cách sử dụng ints SYS/DEFSP.GRPđặt một FF000000ở phía trên bên trái và 00101010ở dưới cùng bên phải, điều này trái ngược với câu hỏi. Sử dụng phao đặt 00000000ở trên cùng bên trái và FFF8F8F8dưới cùng bên phải, đó là chính xác. (Tất nhiên, điều này coi các màu hex là kênh không dấu / kênh lớn hơn, điều này có thể đúng.)
snail_

Tôi nghĩ điều đó hợp lệ, vì câu hỏi không chỉ định một thứ tự cụ thể để sắp xếp theo (và vì các giá trị được ký, 0xFF000000nhỏ hơn 0x00101010) nhưng dù sao, tôi thực sự không chắc tại sao tôi lại sử dụng số nguyên ở đây ... Tôi nghĩ tại thời gian tôi không hiểu GLOAD đã sử dụng các giá trị không dấu như thế nào khi bạn sử dụng một mảng float và chỉ cho rằng nó không hoạt động.
12Me21

2

Java, 424 417 404 byte

Chà, đây không phải là ngôn ngữ mà bạn muốn chơi gôn ...

import java.awt.image.*;import java.io.*;import javax.imageio.*;class F{public static void main(String[]x)throws Exception{BufferedImage i,o;i=ImageIO.read(new File(x[0]));o=new BufferedImage(i.getWidth(),i.getHeight(),BufferedImage.TYPE_INT_RGB);o.setData(i.getRaster());int[]p=((DataBufferInt)o.getRaster().getDataBuffer()).getData();java.util.Arrays.sort(p);ImageIO.write(o,"png",new File("o.png"));}}

2

C #, 497 byte

Lần đầu tiên đăng bài, lần đầu tiên chơi golf. Rõ ràng không phải là tốt nhất để chơi golf

Không thực sự tôn trọng đường ống. Lấy một đường dẫn hình ảnh làm đầu vào và xuất nó bằng chữ "o" thêm vào tên.

Hoạt động tốt hơn với bitmap, kết quả tỷ lệ cược với người khác

using System.Linq;using System.Drawing;using System.Runtime.InteropServices;class Program{static void Main(string[]args){using(var im=(Bitmap)Image.FromFile(args[0])){int h=im.Height;int w=im.Width;var b=im.LockBits(new Rectangle(0,0,w,h),System.Drawing.Imaging.ImageLockMode.ReadWrite,System.Drawing.Imaging.PixelFormat.Format32bppRgb);var p=new int[h*w];Marshal.Copy(b.Scan0,p,0,h*w);var q=p.ToList();q.Sort();p=q.ToArray();Marshal.Copy(p,0,b.Scan0,h*w);im.UnlockBits(b);im.Save("o"+args[0]);}}}

1

Haskell, 195 byte

import Data.List
import Graphics.GD
f p=do 
 a<-loadPngFile p;(x,y)<-imageSize a;let l=[(i,j)|j<-[0..y],i<-[0..x]]
 mapM(flip getPixel a)l>>=mapM(\(d,c)->setPixel d c a).zip l.sort;savePngFile"o"a

Điều này sử dụng GDthư viện. Cách sử dụng f <filename>. Các tập tin đầu vào phải ở pngđịnh dạng. Các tập tin đầu ra được đặt tên o.

Cách thức hoạt động: đơn giản, tức là đọc ảnh, đi qua tất cả các tọa độ và lấy các pixel, sắp xếp các pixel, đi qua các tọa độ một lần nữa, nhưng lần này đặt các pixel theo thứ tự chúng xuất hiện trong danh sách được sắp xếp, ghi tệp vào đĩa.

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

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.