XOR hai hình ảnh đơn sắc


28

Thử thách:

Lấy đầu vào của hai hình ảnh đen trắng (đơn sắc) và xor từng pixel của cái đầu tiên, với mỗi pixel của cái thứ hai, thêm chúng vào một hình ảnh mới và xuất ra hình ảnh mới.

Một số làm rõ:

Kích thước của hình ảnh không quan trọng. Định dạng mở rộng / hình ảnh không thành vấn đề. Bạn có thể làm cho nó nhận đầu vào bất kỳ tiện ích mở rộng và đầu ra bất kỳ tiện ích mở rộng nào, miễn là tiện ích mở rộng được sử dụng để lưu trữ hình ảnh kỹ thuật số. Bạn cũng có thể sử dụng đồ họa để vẽ đầu ra trong ví dụ: một hình ảnh nếu bạn muốn. Nếu không, lưu đầu ra dưới dạng một tập tin. Đầu vào có thể được lấy làm đường dẫn đến hình ảnh hoặc url.

Tuy nhiên, một điều bạn không thể làm là mảng I / O, vd. của bộ ba (R, G, B).

KHÔNG làm xáo trộn alpha . Không nên xored, nó phải là 255 (giá trị tối đa) cho mỗi pixel.

Bạn có ý nghĩa gì xor mỗi pixel?

Bạn không cần phải làm theo cách này, nhưng một cách để xor hai pixel là lấy các giá trị RGB của chúng và xor R1 với R2, G1 với G2, B1 với B2 và lấy kết quả, đó là màu mới của bạn

Vì chúng ta chỉ có hai màu, rõ ràng khi các màu giống nhau thì kết quả sẽ là (0,0,0) và khi chúng khác nhau (màu trắng là 255,255,255 và màu đen là 0,0,0) trong trường hợp này, kết quả sẽ là được 255.255.255.

Do đó, khi hai pixel khác nhau, kết quả là pixel trắng, khác pixel đen

Ví dụ I / O:


Đầu vào 1: Đầu vào 2:

Đầu vào 1 Đầu vào 2


Đầu ra:

Đầu ra


Đây là nên mã ngắn nhất sẽ thắng.


Chúng ta có thể lấy hình ảnh đầu vào làm URL không?
Kritixi Lithos

@KritixiLithos yup, tôi đã chỉnh sửa nó trong thử thách cho bất kỳ người xem nào khác.
P. Ktinos

5
Thử thách tiền thưởng: i.imgur.com/a0M6o9e.pngi.imgur.com/bP1TsjQ.png .
orlp


@orlp Tôi đã nhận được mã qr
Kritixi Lithos

Câu trả lời:


20

Ngôn ngữ biểu thức Fx (ImageMagick), số 8 4 byte

EDITS

  • Đơn giản hóa thành u!=v, -4 byte

"Ngôn ngữ biểu hiện Fx" dường như đã hoàn tất, tôi đã tóm tắt lại câu trả lời của mình cho nó (là Unix Shell + Image Magick).

Chơi gôn

u!=v

Fx không hỗ trợ XOR bitwise cũng như bitwise KHÔNG , vì vậy tôi đã sử dụng !=thay thế (hoạt động tốt đối với các hình ảnh BW thuần túy).

u=> stands for "first image in list"
v=> "second image in list"

Đầu vào và đầu ra là ẩn (được điều khiển bởi trình thông dịch).

Sử dụng

Tiện ích chuyển đổi ImageMagick , đóng vai trò là trình thông dịch "Ngôn ngữ biểu thức Fx", khi được gọi với -fx, như minh họa dưới đây:

convert $1 $2 -fx u!=v $3

Các đối số là:

  1. Hình ảnh đầu vào A
  2. Hình ảnh đầu vào B
  3. Hình ảnh đầu ra O (A ^ B).

Sản lượng mẫu

convert a.png b.png -fx u!=v o.png

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


15

Toán học, 37 34 15 byte

Cảm ơn Ian Miller vì đã cắt giảm hơn một nửa số byte!

ImageDifference

Cuối cùng, luôn có một nội dung. Hàm này lấy hai hình ảnh làm đầu vào và đầu ra một hình ảnh; nó làm một cái gì đó phức tạp hơn đối với các hình ảnh màu, nhưng đối với đen trắng thì chính xác là XOR.

Bài dự thi trước:

Cảm ơn JungHwan Min vì đã tiết kiệm 3 byte!

Image[BitXor@@Chop[ImageData/@#]]&

Hàm chưa được đặt tên sẽ lấy một cặp hình ảnh được đặt hàng (có kích thước tương thích) làm đầu vào và trả về hình ảnh được hiển thị. ImageDatachỉ nhận dữ liệu pixel mà không có tất cả các trình bao bọc / siêu dữ liệu; Thật không may, nó trả về số thực, vì vậy Chopcần thiết để giúp coi chúng là số nguyên. BitXorthực hiện chính xác những gì nó nói trên hộp thiếc (và các luồng trên các danh sách lồng nhau) và Imagebiến RGB kết quả trở lại thành một hình ảnh.

Gửi ban đầu, đã lấy một cặp URL hoặc tên tệp theo thứ tự đầu vào:

Image[BitXor@@(#~Import~"Data"&/@#)]&

4
Đối với hình ảnh nhị phân bạn có thể sử dụng ImageDifference[#,#2]&
Ian Miller

10

Java, 336 335 328 byte

import static javax.imageio.ImageIO.*;import java.io.*;public class M{static void main(String[]y)throws Exception{java.awt.image.BufferedImage a=read(new File("a.png"));for(int i=0,j;i<a.getHeight();i++)for(j=0;j<a.getWidth();)a.setRGB(j,i,a.getRGB(j,i)^read(new File("b.png")).getRGB(j++,i));write(a,"png",new File("c.png"));}}

Ung dung:

import static javax.imageio.ImageIO.*;

import java.io.*;

class M {
    public static void main(String[]y) throws Exception {
        java.awt.image.BufferedImage a = read(new File("a.png"));
        for (int i = 0, j; i < a.getHeight(); i++)
            for (j = 0; j < a.getWidth(); ) a.setRGB(j, i, a.getRGB(j, i) ^ read(new File("b.png")).getRGB(j++, i));
        write(a, "png", new File("c.png"));
    }
}

1
Bạn có thể lưu một byte bằng cách loại bỏ khoảng trắng giữa String[] y. Chỉ là một sân golf nhỏ.
HyperNeutrino

Oh bạn đúng rồi. Gần đây không chơi golf, hoàn toàn bỏ qua cái đó. Chúc mừng.
Marv

3
Bạn có thể xóa publictừ public class Mđể lưu 7 byte
Kritixi Lithos

Phần mở rộng tập tin .pngkhông cần thiết
Huntro

Bạn có thể lưu một byte bằng cách thực hiện ... "i ++ <a.getHeight ();)"
Tatarize

9

Python, 64 60 57 byte

Tôi mới chơi golf nên có chút thương xót!

from cv2 import*
r=imread;lambda a,b:imshow('c',r(a)^r(b))

Cảm ơn @Blender và @FlipTack đã tiết kiệm cho tôi 7 byte!


1
Sử dụng from cv2 import*nên cạo 4 ký tự.
Máy xay sinh tố

1
Ở đây, lambdas không tên được phép cho câu trả lời chức năng, vì vậy bạn có thể bỏ d=:) cũng vậy, thực hiện r=imreadvà sau đó sử dụng rhai lần có thể ngắn hơn
FlipTack

7

Octave, 43 38 34 byte

@(a,b)imshow(imread(a)~=imread(b))

Nhờ flawr đã tiết kiệm cho tôi 5 byte.

Nhờ Luis Mendo đã lưu cho tôi 4 byte được đề xuất để sử dụng a~=bthay vì xor(a,b).

Một hàm lấy tên tệp đầu vào của hai hình ảnh đầu vào a,bvà hiển thị kết quả.

Câu trả lời trước đó ghi vào một tập tin:

@(a,b,c)imwrite(imread(a)~=imread(b),c)

Một hàm lấy tên tệp đầu vào của hai ảnh đầu vào a,bvà tên tệp của ảnh đầu ra c.

Sử dụng:

#two test images that used in the question
#https://i.stack.imgur.com/UbbfM.png
#https://i.stack.imgur.com/YyZG2.png
A = "UbbfM.png"; 
B = "YyZG2.png"; 
C = "out.png";
(@(a,b,c)imwrite(imread(a)~=imread(b),c))(A,B,C)

Kết quả được lưu trong out.png


1
Bạn không thể sử dụng imshow()thay vì imwrite()?
flawr

@flawr Tất nhiên là sẽ tiết kiệm được một số byte :)
rahnema1

1
Bạn không thể sử dụng imread(a)~=imread(b)(hoặc +(imread(a)~=imread(b))nếu đầu vào logic không được phép imshow) thay vì xor(...)?
Luis Mendo

1
@LuisMendo Cảm ơn, tôi luôn học hỏi từ ý kiến ​​của bạn!
rahnema1

7

JavaScript (ES6), 333 320 308 299 297 byte

- 12 20 byte được lưu bởi Ismael Miguel
- 2 byte được lưu bởi user2428118

Mong đợi các hình ảnh đã được tải, lấy kích thước đầu vào đầu tiên làm kích thước đầu ra và trả về một phần tử canvas.

(i,j)=>{c=i=>{with(document.createElement(C='canvas')){width=i.width,height=i.height;return getContext`2d`}},g=i=>{x=c(i);x.drawImage(i,0,0);return x.getImageData(0,0,i.width,i.height)},a=g(i),b=g(j).data,d=a.data,r=c(i);d.forEach((e,i)=>{d[i]=i%4>2?255:e^b[i]});r.putImageData(a,0,0);return r[C]}

let func = (i,j)=>{c=i=>{with(document.createElement(C='canvas')){width=i.width,height=i.height;return getContext`2d`}},g=i=>{x=c(i);x.drawImage(i,0,0);return x.getImageData(0,0,i.width,i.height)},a=g(i),b=g(j).data,d=a.data,r=c(i);d.forEach((e,i)=>{d[i]=i%4>2?-1:e^b[i]});r.putImageData(a,0,0);return r[C]}

window.onload =_=>{
  document.body.appendChild(func(img1, img2));
  }
<img id="img1" crossOrigin="anonymous" src="https://dl.dropboxusercontent.com/s/nnfkzpvabk77pnl/UbbfM.png">
<img id="img2" crossOrigin="anonymous" src="https://dl.dropboxusercontent.com/s/58euf43vcb9pvpa/YyZG2.png">

Bị đánh cắp

(i, j) => {
  c = i => { // an helper to create a canvas object
      with(document.createElement(C='canvas')) {
        width= i.width,
        height= i.height;
        return getContext`2d`
      }
    },
    g = i => { // an helper to get an imageData object
      x = c(i);
      x.drawImage(i, 0, 0);
      return x.getImageData(0, 0, i.width, i.height)
    },
    a = g(i),
    b = g(j).data,
    d = a.data,
    r = c(i);
  d.forEach((e, i) => { // loop through all rgba values
    d[i] = i % 4 > 2 ? 255 : e ^ b[i] // we need to avoid alpha channel...
  });
  r.putImageData(a, 0, 0);
  return r[C]
}

Ps: Lần đầu tiên chơi golf, vì vậy nó có thể được đánh gôn nhiều hơn và số lượng của tôi có thể bị sai.

PP: bối cảnh 2D canvas có xor[chế độ tổng hợp ( https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompổngOperation ), nhưng nó hoạt động trên các giá trị alpha ...

Thậm chí có thể được đánh gôn thêm (251 byte) với kích thước 300 * 150px cố định (tất cả còn lại là màu đen) như trong câu trả lời Xử lý

(i,j)=>{c=i=>{return document.createElement(C='canvas').getContext('2d')},g=i=>{x=c(i);x.drawImage(i,0,0);return x.getImageData(0,0,W=300,W)},a=g(i),b=g(j).data,d=a.data,r=c(i);d.forEach((e,i)=>{d[i]=i%4>2?W:e^b[i]});r.putImageData(a,0,0);return r[C]}


1
Thay thế chức năng cbằng c=i=>{with(document.createElement('canvas')){width=i.width,height=i.height;return getContext`2d`}}và bạn lưu 16 byte.
Ismael Miguel

Bạn có thể không xorhình chữ nhật màu đen trên xorhai hình ảnh để quay lại 255 alpha không?
Neil

@IsmaelMiguel, cảm ơn, Không được sử dụng withnhưng có vẻ khá tốt cho việc chơi gôn ;-) Ngoài ra, quên mẫu theo nghĩa đen tiết kiệm 2 byte ...
Kaiido

@Neil, tôi không chắc chắn, ở đây chúng tôi đã có một mảng 8 bit, có thể với 32 bit, có thể làm điều đó, nhưng sẽ mất nhiều thời gian hơn ...
Kaiido

1
Lưu 4 byte:(i,j)=>{c=i=>{with(document.createElement(C='canvas')){width=i.width,height=i.height;return getContext`2d`}},g=i=>{x=c(i);x.drawImage(i,0,0);return x.getImageData(0,0,i.width,i.height)},a=g(i),b=g(j).data,d=a.data,r=c(i);d.forEach((e,i)=>{d[i]=i%4>2?255:e^b[i]});r.putImageData(a,0,0);return r[C]}
user2428118

7

Đang xử lý, 124 118 117 byte

void m(PImage a,PImage q){for(int i=0,j;i<400;i++)for(j=0;j<400;point(i,j++))stroke((a.get(i,j)^q.get(i,j))<9?0:-1);}

Sử dụng:

Lưu ý: mã này có thể hỗ trợ hình ảnh tối đa 400px(với sửa đổi có thể hỗ trợ tối đa 999 cho cùng một mã số). Bất kỳ không gian "còn lại" nào cũng sẽ được tô màu đen, vì vậy để có kết quả tốt nhất, kích thước hình ảnh phải có cùng kích thước với kích thước trong mã (cũng size()cần thay đổi theo kích thước được cập nhật)

m(loadImage("http://i.imgur.com/a0M6o9e.png"),loadImage("http://i.imgur.com/bP1TsjQ.png"));

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

m(loadImage("https://i.stack.imgur.com/UbbfM.png"),loadImage("https://i.stack.imgur.com/YyZG2.png"));

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

Bị đánh cắp

void Q106945(PImage a,PImage q){     // takes two images as input
  for(int i=0,j;i<400;i++)           // looping through the x-coordinates
    for(j=0;j<400;point(i,j++))      // looping through the y-coordinates
      stroke((a.get(i,j)^q.get(i,j))<9?0:-1);
/*
Here we have to colour the point according to the xor. So we do a simple 
a.get(i,j)^q.get(i,j). But since the alpha gets xored, instead of outputting white, this
outputs a colour with alpha 0 (completely invisible). So to fix this I have a ternary that
checks the value and changes the colour accordingly. At the end of all this, the third 
statement of the for-loop with j gets triggered since all this code is in this for-loop. 
Now we draw a point over the coordinate with the colour we have chosen before.
*/
}

7

MATL , 10 byte

YiiYiY~1YG

Giải trình

Đây là câu trả lời cơ bản giống như hiện tại giải pháp Octave : Nó lấy tên tệp hoặc URL của cả hai hình ảnh làm đầu vào và hiển thị kết quả trên màn hình.

Yi    % Read first image from the URL or filename (implicit input)
i     % Get the second URL or filename as input
Yi    % Read that second image
Y~    % XOR the two images
1     % Push 1 (needed to make YG act as imagesc)
YG    % Display result using the MATLAB imagesc function

Sử dụng

>> matl
 > YiiYiY~1YG
 > 
> 'https://i.stack.imgur.com/UbbfM.png'
> 'https://i.stack.imgur.com/YyZG2.png'

1
Đây là 10 byte.
Erik the Outgolfer

3

Perl, 260 byte

251 byte mã + 9 byte cho -MImager.

($i,$j)=map{new Imager(file,pop)}0,1;$p=getpixel;for$x(0..$i->getwidth()-1){$i->setpixel(x=>$x,y=>$_,color=>[map{($j->$p(%t)->rgba)[$c++%3]^$_?0:255}($i->$p(%t=(x=>$x,y=>$_,type=>'8bit'))->rgba)[0..2]])for 0..$i->getheight()-1}$i->write(file=>'a.png')

Tôi không chắc Perl là ngôn ngữ tốt nhất cho thử thách này, nhưng tôi muốn biết hình ảnh của bình luận của @ orlp là gì. Và nó khiến tôi sử dụng một chút các mô-đun đồ họa đó, đó là một điều tốt. Và tôi rất thích mã hóa nó!

Một phiên bản dễ đọc hơn:

sử dụng Imager ; 
$ img1 = Trình chụp ảnh mới ( tệp => $ ARGV [ 1 ] ); 
$ img2 = Trình chụp ảnh mới ( tệp => $ ARGV [ 0 ] );   

với $ x ( 0 .. $ img1 -> getwidth () - 1 ) { với $ y ( 0 .. $ img1 -> getheight () - 1 ) { ( $ r1 , $ g1 , $ b1 ) = $ img1 - > getpixel ( x => $ x , y => $ y , loại => "8 bit" ) -> rgba (); ( $ r2 , $ g2    
        
       
    , $ b2 ) = $ img2 -> getpixel ( x => $ x , y => $ y , loại => "8 bit" ) -> rgba (); 
    $ r = $ r1 ^ $ r2 ? 0 : 255 ; 
    $ g = $ g1 ^ $ g2 ? 0 : 255 ; 
    $ b = $ b1 ^ $ b2 ? 0 : 255 ; 
    $ img1               -> setpixel (x => $ x , y => $ y , màu => [ $ r , $ g , $ b ] ); } } 
$ img1 -> write ( tệp => 'a.png' )  
    
  

Bạn sẽ cần cài đặt Imager nếu bạn muốn dùng thử, nhưng nó khá đơn giản: chỉ cần chạy (echo y;echo) | perl -MCPAN -e 'install Imager'trong thiết bị đầu cuối của bạn.


3

LÖVE2D , 199 byte

u,c=... i=love.image.newImageData a=math.abs X=i(u)Y=i(c)Z=i(X:getDimensions())Z:mapPixel(function(x,y)r,g,b=X:getPixel(x,y)R,G,B=Y:getPixel(x,y)return a(r-R),a(g-G),a(b-B)end)Z:encode("png","Z")

Đủ đơn giản, lấy hai tệp hình ảnh trên dòng lệnh, xuất ra một tệp có tên "Z" vào thư mục Love. Cũng hoạt động cho hình ảnh đầy đủ màu sắc!


1
@MDXF love2d.org
ATaco

2

J, 54 byte

load'bmp'
'o'writebmp~256#.255*~:&*&((3#256)#:readbmp)

Có hai đối số trong đó mỗi đối số là đường dẫn đến một hình ảnh đầu vào ở bmpđịnh dạng. Mỗi hình ảnh được đọc dưới dạng ma trận gồm các số nguyên RGB 24 bit và được phân tích thành một bộ ba giá trị RGB 8 bit, dấu của mỗi giá trị được lấy và hai ma trận là XOR'd với nhau. Kết quả sau đó được chia tỷ lệ 255, được chuyển đổi trở lại từ bộ ba gồm 256 số cơ bản thành một số nguyên và được ghi vào một bmptệp đầu ra có tên o.


2

C, 189 byte

#include<stdio.h>
s,t[9];
#define o(f,p)int*f=fopen(p,"ab+");
#define f(p,q,r)o(a,p)o(b,q)o(c,r)fscanf(a,"%*s %*d %*d %n",&s);for(fwrite(t,1,fread(t,1,s,b),c);s=~getc(a);putc(~s^getc(b),c))

Hoạt động trên hình ảnh PBM. Gọi điệnf(a, b, out) với tên của cả tệp đầu vào và tệp đầu ra.

Giả định:

  • Cả hai tiêu đề hình ảnh đầu vào là giống hệt nhau (bao gồm khoảng trắng) và nhỏ hơn 9 * sizeof(int)ký tự.

  • Chúng tôi đang sử dụng một hệ điều hành tốt để xóa và đóng các tệp bị rò rỉ.

  • EOF == -1

Ungolfed và giải thích: (bỏ qua dấu gạch chéo ngược)

// Scratch variable and "big enough" buffer
s, t[9];

// Opens a file in read/append binary mode
#define o(f,p)int*f=fopen(p,"ab+");

#define f(p, q, r)

    // Open the three file pointers a, b, c from the paths p, q, r
    o(a, p)
    o(b, q)
    o(c, r)

    // Read from a to locate the end of the PBM header
    fscanf(a, "%*s %*d %*d %n", &s);

    for(
        // Read the header from b into the buffer,
        // then write it back from the buffer to c
        fwrite(t, 1, fread(t, 1, s, b), c);

        // Loop condition: get the next byte from a
        // and check for EOF with a bitwise-not
        // (Assumes that EOF == -1)
        s = ~getc(a);

        // Loop increment: get the next byte from b,
        // flip s back, xor and write to c
        putc(~s ^ getc(b), c)

    ) // Snatch the semicolon from the call syntax :)

C (uốn cụ thể), 149 byte

#include<stdio.h>
t[7];
#define o(f,p,u)int*f=fopen(p,"ab+");u(t,1,7,f);
#define f(p,q,r)o(a,p,fread)o(b,q,fread)o(c,r,fwrite)putc(getc(a)^getc(b),c)

Vẫn sử dụng tệp PBM, nhưng bây giờ:

  • Hình ảnh phải cao một pixel và rộng 8 pixel trở xuống, vì PBM gói 8 pixel trong một byte.

  • Tiêu đề phải có 7 byte (ví dụ: P4 8 1có dấu cách).

Cả hai tệp được tìm kiếm chuyển tiếp trong khi điền tvào tiêu đề của chúng, sau đó các byte cuối cùng được đọc, xor'd và viết lại. Tận dụng lợi thế freadfwritecó các danh sách tham số tương tự để tính cả ba thao tác trên tiêu đề phía sau cùng một macro.


2

R, 45 byte

p=png::readPNG;plot(as.raster(+(p(a)!=p(b))))

abđại diện cho tên tệp của hai tệp hình ảnh.

Thí dụ:

a <- "YyZG2.png"
b <- "UbbfM.png"
p=png::readPNG;plot(as.raster(+(p(a)!=p(b))))

Đầu ra:

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


2

Đang xử lý, 82 byte

void x(PImage a,PImage b){int x=b.width;b.blend(a,0,0,x,x,0,0,x,x,32);set(0,0,b);}

Lạm dụng các chức năng vẽ rộng rãi của Xử lý để tránh thực sự thực hiện bất kỳ XORing nào. Trộn hai hình ảnh với nhau với DIFFERENCEchế độ và vẽ chúng lên màn hình.

Sử dụng

x(loadImage("http://i.imgur.com/a0M6o9e.png"),loadImage("http://i.imgur.com/bP1TsjQ.png"));

Bị đánh cắp

void xor(PImage a, PImage b) {
  int x = a.width;
  b.blend(a, 0, 0, x, x, 0, 0, x, x, DIFFERENCE);
  set(0, 0, b);
}

Chơi golf tốt Nó thực sự thông minh mà bạn đã sử dụng 32thay vì DIFFERENCE. Đây sẽ là một mẹo hay để chơi gôn: codegolf.stackexchange.com/questions/26809/iêu :)
Kritixi Lithos

2

C #, 233 byte

using System.Drawing;class C{static void Main(){Bitmap
a=new Bitmap("a"),b=new Bitmap("b");for(int
x=0,y=0;;)try{a.SetPixel(x,y,a.GetPixel(x,y)==b.GetPixel(x,y)?Color.Black:Color.White);x++;}catch{if(x<1)break;x=0;++y;}a.Save("c");}}

Nhờ Unknown6656 cho mẹo mà các đối số dòng lệnh là không cần thiết. Chương trình hiện đọc từ các tệp "a" và "b" và ghi vào tệp "c" có cùng định dạng với "a". Tắt bởi một lỗi cũng được sửa.

Nó đặt từng pixel thành màu đen nếu màu giống nhau, nếu không thì màu trắng.

Để lưu byte, nó bắt được các ngoại lệ giới hạn, thay vì kiểm tra các thuộc tính Chiều rộng và Chiều cao của Bitmap. Mỗi lần x vượt ra khỏi giới hạn, nó được đặt lại về 0 và y được tăng lên. Khi y đi ra khỏi giới hạn, x bằng 0 và vòng lặp ngắt để lưu hình ảnh và thoát.

Ví dụ biên dịch bằng csc và chạy bằng mono:

csc xor.cs

mono xor.exe

Bạn có thể thả mã thông báo (string[] v)bên trong khai báo chính, vì C # không rõ ràng cần nó để chạy một ứng dụng
unknown6656

1

Clojure, 300 byte

(ns s(:import[java.io File][java.awt.image BufferedImage][javax.imageio ImageIO]))(defn -main[](let[a(ImageIO/read(File."a.png"))](doseq[i(range(.getHeight a))j(range(.getWidth a))](.setRGB a j i(bit-xor(.getRGB a j i)(.getRGB(ImageIO/read(File."b.png")) j i))))(ImageIO/write a"png"(File."c.png"))))

Rip-off trắng trợn của câu trả lời Java . Tôi không biết làm thế nào để thực hiện thử thách, nhưng tò mò không biết giải pháp Java được dịch sang Clojure tốt đến mức nào. Nó khá đơn giản. Mã không mã hóa thực sự là loại khá.

Đây là thử thách chơi gôn mã đầu tiên tôi đã thực hiện bao gồm nhập khẩu. Có lẽ có một cách để tối ưu hóa chúng để tiết kiệm một số byte.

Ung dung:

(ns bits.golf.bit-or-picts
  (:import [java.io File]
           [java.awt.image BufferedImage]
           [javax.imageio ImageIO]))

(defn -main []
  (let [^BufferedImage a (ImageIO/read (File. "a.png"))
        ^BufferedImage b (ImageIO/read (File. "b.png"))]
    (doseq [i (range (.getHeight a))
            j (range (.getWidth a))]
      (.setRGB a j i
                (bit-xor (.getRGB a j i)
                         (.getRGB b j i))))
    (ImageIO/write a "png" (File. "c.png"))))

1

PHP 246 243 byte

Tôi có thể chơi golf này xuống nhiều hơn.

$o=imagecreatetruecolor($w=max(imagesx($a=($i=imagecreatefrompng)($argv[1])),imagesx($b=$i($argv[2]))),$h=max(imagesy($a),imagesy($b)));for(;$k<$w*$h;)imagesetpixel($o,$x=$k%$w,$y=$k++/$w,($t=imagecolorat)($a,$x,$y)^$t($b,$x,$y));imagepng($o);

Chạy nó từ dòng lệnh như thế này:

php -d error_reporting=0 -r "$o=imagecreatetruecolor($w=max(imagesx($a=($i=imagecreatefrompng)($argv[1])),imagesx($b=$i($argv[2]))),$h=max(imagesy($a),imagesy($b)));for(;$k<$w*$h;)imagesetpixel($o,$x=$k%$w,$y=$k++/$w,($t=imagecolorat)($a,$x,$y)^$t($b,$x,$y));imagepng($o);" "http://i.stack.imgur.com/UbbfM.png" "http://i.stack.imgur.com/YyZG2.png" > output.png

Xác định các biến tên hàm tại lần xuất hiện đầu tiên của chúng có thể giúp: $i=imagecreatefrompng;$a=$i($argv[1])dài hơn một byte so với $a=($i=imagecreatefrompng)($argv[1]). Và bạn có thể thử hình ảnh bảng màu với một bảng màu hai.
Tít

Tôi đã cố gắng xác định nó ở lần xuất hiện đầu tiên nhưng tôi vẫn nhận được một lỗi nghiêm trọng. Tôi sẽ thử lại sau khi tôi có thời gian. Có lẽ tôi đã không làm điều đó một cách chính xác.
Kodos Johnson

($f=func)(params)yêu cầu PHP 7.
Tít

@Titus ah ok cảm ơn. Điều đó đã đưa tôi xuống 3 byte.
Kodos Johnson

Dưới đây là 7 byte nữa: Thay thế for(;$k<$w*$h;)bằng for(;$y<$h;$y+=1/$w), $x=$k%$w, $y=$k++/$w bằng $x, $yvà cuối cùng $xbằng $x++. (giả sử không có lỗi làm tròn cho bất kỳ kích thước hình ảnh hợp lý nào)
Tít

0

Node.js, 156 135 byte

(a,b)=>(f=require('fs')).writeFile(a+b,((s=f.readFileSync)(a)+'').replace(/\d+$/,(c,d)=>[...c].map((e,f)=>+!(e^(s(b)+b)[f+d])).join``))

Các tệp hình ảnh đầu vào và đầu ra phải ở định dạng PBM (P1), trong đó dòng đầu tiên P1 [width] [height]và dòng thứ hai là các giá trị b / w ascii không có khoảng trắng.

Đây là hình ảnh đầu vào theo sau là đầu ra xor (32x32 pixel):

Đầu vào số 1 Đầu vào số 2 Đầu ra

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.