XOR 두 흑백 이미지


28

도전:

두 개의 흑백 (흑백) 이미지와 첫 번째의 각 픽셀을 입력하고 두 번째의 각 픽셀을 새 이미지에 추가하고 새 이미지를 출력합니다.

몇 가지 설명 :

사진의 크기는 중요하지 않습니다. 확장명 / 이미지 형식은 중요하지 않습니다. 확장 기능을 사용하여 디지털 이미지를 저장하는 한 확장명을 입력하고 확장명을 출력 할 수 있습니다. 그래픽을 사용하여 원하는 경우 그림 상자와 같은 출력을 그릴 수도 있습니다. 그렇지 않으면 출력을 파일로 저장하십시오. 이미지의 경로 또는 URL로 입력을 취할 수 있습니다.

그러나 당신이 할 수없는 한 가지는 예를 들어 I / O 배열입니다. 트리플렛 (R, G, B).

알파를 조작하지 마십시오 . xored해서는 안되며 모든 픽셀에 대해 255 (최대 값)이어야합니다.

각 픽셀이 무엇을 의미합니까?

이 방법으로 할 필요는 없지만 두 픽셀을 xor하는 한 가지 방법은 RGB 값과 xor R1을 R2로, G1을 G2로, B1을 B2로 가져 와서 결과를 얻는 것입니다.

우리는 두 가지 색상 만 가지고 있기 때문에 분명히 색상이 같을 때 결과는 (0,0,0)이고 다른 경우 (흰색은 255,255,255, 검은 색은 0,0,0), 결과는 255,255,255입니다.

따라서 두 픽셀이 다르면 결과는 흰색 픽셀이되고 그렇지 않으면 검은 픽셀이됩니다.

예제 I / O :


입력 1 : 입력 2 :

입력 1 입력 2


산출:

산출


이것은 이므로 가장 짧은 코드가 승리합니다.


입력 이미지를 URL로 가져올 수 있습니까?
Kritixi Lithos

@KritixiLithos yup, 나는 더 이상의 시청자를 위해 도전 과제에서 편집했습니다.
P. Ktinos

5
보너스 챌린지 : i.imgur.com/a0M6o9e.pngi.imgur.com/bP1TsjQ.png .
orlp


@orlp 나는 qr 코드에
도달

답변:


20

Fx 표현 언어 (ImageMagick) 8 4 바이트

EDITS

  • u!=v-4 바이트로 단순화

으로 "FX는 표현 언어" 분명히 완전한 튜링되고, 내가 내 대답을 재 - 프로파일했습니다 (유닉스 쉘 + 이미지 마법 (magick)이었다).

골프

u!=v

Fx 는 비트 XOR 또는 비트 NOT을 지원하지 않으므로 !=대신 사용 했습니다 (순수한 BW 이미지에는 잘 작동합니다).

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

입력 및 출력은 내재적입니다 (통역사가 제어 함).

용법

ImageMagick 변환 유틸리티는 -fx아래 그림과 같이로 호출 할 때 "Fx Expression Language"인터프리터 역할을합니다 .

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

인수는 다음과 같습니다.

  1. 입력 이미지 A
  2. 입력 이미지 B
  3. 출력 이미지 O (A ^ B).

샘플 출력

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

enter image description here


15

Mathematica, 37 34 15 바이트

바이트 수를 절반 이상 줄인 Ian Miller에게 감사합니다!

ImageDifference

결국에는 항상 내장되어 있습니다. 이 기능은 두 개의 이미지를 입력으로 가져 와서 이미지를 출력합니다. 컬러 이미지에는 더 복잡한 작업을 수행하지만 흑백에는 정확히 XOR입니다.

이전 제출물 :

3 바이트를 절약 한 JungHwan Min에게 감사합니다!

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

(호환되는 크기의) 정렬 된 이미지 쌍을 입력으로 받아서 표시된 이미지를 반환하는 이름이없는 함수입니다. ImageData모든 래퍼 / 메타 데이터가없는 픽셀 데이터 만 가져옵니다. 불행히도 실수를 반환하므로 Chop정수로 처리하는 데 도움이됩니다. BitXor주석에 대해 정확히 말하고 중첩 목록에 스레드를 표시 Image하고 결과 RGB를 이미지로 다시 변환합니다.

URL 또는 파일 이름을 순서대로 입력 한 원본 제출 :

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

4
이진 이미지의 경우 ImageDifference[#,#2]&
Ian Miller

10

자바, 336 335 328 바이트

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

언 골프 드 :

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
사이의 공백을 제거하여 바이트를 저장할 수 있습니다 String[] y. 사소한 작은 골프.
HyperNeutrino

오, 네 말이 맞아 최근에 골프를 타지 않았으며, 그 골프를 완전히 간과했습니다. 건배.
Marv

3
public에서 public class M바이트를 제거하여 7 바이트를 절약 할 수 있습니다
Kritixi Lithos

파일 확장자 .png는 필요하지 않습니다
Huntro

... "i ++ <a.getHeight ();)"를 수행하여 바이트를 절약 할 수 있습니다.
Tatarize

9

파이썬, 64 60 57 바이트

나는 골프가 처음이므로 자비를 베푸소서!

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

7 바이트를 절약 해 준 @Blender와 @FlipTack에게 감사드립니다!


1
를 사용하면 from cv2 import*4자를 깎아야합니다.
블렌더

1
여기서 이름이없는 람다는 함수 응답에 허용되므로 d=:)을 삭제하고 두 번 r=imread사용 하는 r것이 더 짧을 수 있습니다.
FlipTack

7

옥타브, 43 38 34 바이트

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

flawr 덕분에 5 바이트를 절약했습니다.

Luis Mendo 덕분에 a~=b대신 4 바이트를 사용하도록 제안했습니다 xor(a,b).

두 입력 이미지의 입력 파일 이름으로 사용 a,b하고 결과를 보여주는 함수입니다.

파일에 쓰는 이전 답변 :

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

두 개의 입력 이미지의 입력 a,b파일 이름과 출력 이미지의 파일 이름 을 취하는 함수입니다 c.

용법:

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

결과가 저장됩니다 out.png


1
imshow()대신 사용할 수 imwrite()없습니까?
flawr

@flawr 물론 바이트를 절약 할 수 있습니다 :)
rahnema1

1
대신에 imread(a)~=imread(b)(또는 +(imread(a)~=imread(b))논리 입력이 허용되지 않는 경우) 사용할 수 없습니까 ? imshowxor(...)
Luis Mendo

1
@LuisMendo 감사합니다, 나는 항상 당신의 의견에서 배웁니다!
rahnema1

7

자바 스크립트 (ES6), 333 320 308 299 297 바이트

- 12 이스마엘 미구엘에 의해 저장된 20 바이트
- 2 바이트 user2428118에 의해 저장

이미로드 된 이미지를 예상하고 첫 번째 입력의 크기를 출력 크기로 사용하고 캔버스 요소를 반환합니다.

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

언 골프

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

추신 : 코드 골프에서 처음으로 골프를 더 많이 타거나 내 카운트가 잘못되었을 수 있습니다.

PP : 캔버스 2D 컨텍스트에는 xor[합성 모드 ( https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation )가 있지만 알파 값에서 작동합니다 ...

처리 답변에서 와 같이 고정 300 * 150px 크기 (모두 검은 색임)로 더 골프를 칠 수 있습니다 (251 바이트)

(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
기능을 바꾸기 cc=i=>{with(document.createElement('canvas')){width=i.width,height=i.height;return getContext`2d`}}하고 16 바이트를 저장합니다.
Ismael Miguel

255 알파로 돌아 가기 위해 두 이미지 중 xor검정색 사각형을 사용할 수 없습니까 xor?
Neil

@IsmaelMiguel, 고마워, 사용하는 데 사용 with되지는 않지만 골프에는 꽤 좋은 것 같습니다 ;-) 또한 템플릿 리터럴은 2 바이트를 절약하는 것을 잊었습니다 ...
Kaiido

@Neil, 잘 모르겠습니다. 여기에 32 비트가있는 8 비트 배열이있을 수 있지만 더 많은 문자가 필요합니다.
Kaiido

1
4 바이트를 저장합니다 :(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

처리 124 118 117 바이트

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

용법:

참고 : 이 코드는 최대 이미지를 지원할 수 있습니다 400px(수정 된 동일한 바이트 수에 대해 최대 999 개 지원). "남은"공간은 검은 색으로 표시되므로 최상의 결과를 얻으려면 이미지 크기가 코드의 치수와 크기가 같아야합니다 (또한 size()업데이트 된 치수로 변경해야 함).

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

여기에 이미지 설명을 입력하십시오

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

여기에 이미지 설명을 입력하십시오

언 골프

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 바이트

YiiYiY~1YG

설명

이것은 기존 Octave 솔루션 과 기본적으로 같은 대답 입니다. 두 이미지의 파일 이름 또는 URL을 입력으로 사용하여 결과를 화면에 표시합니다.

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

용법

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

1
이것은 10 바이트입니다.
Outgolfer Erik

3

펄, 260 바이트

코드 + 9의 251 바이트에 대한 바이트 -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')

나는 Perl이이 도전에 가장 적합한 언어인지 잘 모르겠지만, @orlp의 의견 이미지가 무엇인지 알고 싶었다. 그리고 그것은 저 그래픽 모듈을 약간 사용하게합니다. 그것은 좋은 것입니다. 그리고 나는 그것을 코딩하는 것을 즐겼습니다!

더 읽기 쉬운 버전 :

이미 저 사용 ; 
$ img1 = 새로운 이미 저 ( file => $ ARGV [ 1 ] ); 
$ img2 = 새로운 이미 저 ( file => $ ARGV [ 0 ] );   

위한 $ X ( 0 .. $ img1로 -> getwidth - (+) 1 ) { 대한 $ Y ( 0 .. $ img1로 -> getheight () - 1 ) { ( $ R1 , $ G1 , $ B1 ) = $ img1로 - > getpixel ( x => $ x , y => $ y , type => "8bit" )-> rgba (); ( $ R2 , ,    
        
       
     $ g2$ b2 ) = $ img2- > getpixel ( x => $ x , y => $ y , type => "8bit" )-> rgba (); 
    $ r = $ r1 ^ $ r2 ? 0 : 255 ; 
    $ g = $ g1 ^ $ g2 ? 0 : 255 ; 
    $ b = $ b1 ^ $ b2 ? 0 : 255 ;                
    $ img1-> setpixel ( x => $ x , y => $ y , color => [ $ r , $ g , $ b ] ); } } 
$ img1- > write ( file => 'a.png' )  
    
  

시도해 보려면 Imager를 설치해야하지만 (echo y;echo) | perl -MCPAN -e 'install Imager'터미널에서 실행하면 매우 간단 합니다.


3

LÖVE2D , 199 바이트

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

충분히 간단하고, 명령 행에서 두 개의 이미지 파일을 가져 와서 "Z"라는 파일을 Love 디렉토리에 출력합니다. 풀 컬러 이미지에도 적용됩니다!


1
@MDXF love2d.org
ATaco

2

J, 54 바이트

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

bmp형식이 입력 이미지의 경로 인 두 개의 인수를 사용 합니다. 각 이미지는 24 비트 RGB 정수의 행렬로 읽히고 8 비트 RGB 값의 삼중 항으로 구문 분석되고 각각의 부호가 취해지고 두 행렬이 XOR됩니다. 그런 다음 결과는 255로 스케일링되고 기본 256 개 숫자의 트리플렛에서 정수로 다시 변환되어 bmp라는 출력 파일에 기록됩니다 o.


2

C, 189 바이트

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

PBM 이미지에서 작동합니다. f(a, b, out)입력 파일과 출력 파일의 이름으로 전화 하십시오.

가정 :

  • 두 입력 이미지 헤더는 동일하며 (공백 포함) 9 * sizeof(int)문자 보다 작습니다 .

  • 우리는 유출 된 파일을 플러시하고 닫는 멋진 OS를 사용하고 있습니다.

  • EOF == -1

언 골프 및 설명 : (백 슬래시 생략)

// 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 (스펙 벤딩), 149 바이트

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

여전히 PBM 파일을 사용하지만 현재 :

  • PBM은 바이트 당 8 픽셀을 압축하므로 이미지는 높이가 1 픽셀, 폭이 8 픽셀 이하이어야합니다.

  • 헤더는 7 바이트 여야합니다 (예 : P4 8 1후행 공백).

t헤더 를 채우면서 두 파일을 모두 탐색 한 다음 마지막 바이트를 읽거나 xor 한 후 다시 씁니다. 의 활용 freadfwrite같은 매크로 뒤에 헤더 요소로 세 가지 작업을 유사한 매개 변수 목록을 가지고.


2

R, 45 바이트

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

ab 두 개의 이미지 파일의 파일 이름을 나타냅니다.

예:

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

산출:

여기에 이미지 설명을 입력하십시오


2

처리 중, 82 바이트

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

XORing을 실제로 피하기 위해 Processing의 광범위한 그리기 기능을 남용합니다. 두 이미지를 함께 혼합DIFFERENCE 모드와 화면에 그립니다.

용법

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

언 골프

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

좋은 골프! 32대신에 사용 하는 것이 현명합니다 DIFFERENCE. 이것은 골프를위한 좋은 팁이 될 것입니다 : codegolf.stackexchange.com/questions/26809/… :)
Kritixi Lithos

2

C #, 233 바이트

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

명령 줄 인수가 필요하지 않다는 Unknown6656 덕분입니다. 이제 프로그램은 "a"및 "b"파일에서 읽고 "a"와 동일한 형식으로 "c"파일에 씁니다. 하나의 오류로도 해제되었습니다.

색상이 동일하면 각 픽셀을 검은 색으로 설정하고 그렇지 않으면 흰색으로 설정합니다.

바이트를 절약하기 위해 비트 맵의 ​​너비 및 높이 속성을 확인하는 대신 범위 예외를 잡아냅니다. x가 범위를 벗어날 때마다 0으로 재설정되고 y가 증가합니다. y가 범위를 벗어나면 x는 0이고 루프가 중단되어 이미지를 저장하고 종료됩니다.

csc를 사용하여 컴파일하고 mono를 사용하여 실행하는 예제 :

csc xor.cs

mono xor.exe

당신은 토큰을 삭제할 수 있습니다 (string[] v)C #은 명시 적으로 응용 프로그램을 실행하는 데 필요하지 않기 때문에, 주요 선언 내부
unknown6656

1

클로저, 300 바이트

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

자바 답변 의 뻔뻔스러운 격파 . 나는 도전을 수행하는 방법을 몰랐지만 Java 솔루션이 Clojure로 얼마나 잘 번역되었는지 궁금했습니다. 꽤 간단했습니다. ungolfed 코드는 실제로 꽤 예쁩니다.

이것은 수입을 포함하여 내가 한 최초의 코드 골프 과제였습니다. 바이트를 절약하기 위해 최적화하는 방법이있을 것입니다.

언 골프 드 :

(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 바이트

아마 이것보다 더 골프를 칠 수 있습니다.

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

다음과 같이 명령 행에서 실행하십시오.

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

처음 발생시 함수 이름 변수를 정의하면 도움 $i=imagecreatefrompng;$a=$i($argv[1])이 될 수 있습니다 $a=($i=imagecreatefrompng)($argv[1]). 그리고 두 가지 색상 팔레트로 팔레트 이미지를 시험해 볼 수 있습니다.
Titus

처음에 그것을 정의하려고했지만 치명적인 오류가 계속 발생했습니다. 시간이 있으면 나중에 다시 시도하겠습니다. 어쩌면 내가 제대로하지 않았을 수도 있습니다.
Kodos Johnson

($f=func)(params)PHP 7이 필요합니다.
Titus

@Titus 아 괜찮습니다. 그것은 3 바이트를 줄였습니다.
Kodos Johnson

여기에 7 이상의 바이트는 다음과 같습니다 교체 for(;$k<$w*$h;)for(;$y<$h;$y+=1/$w), $x=$k%$w, $y=$k++/$w$x, $y마지막 $x으로 $x++. (적당한 이미지 크기에 대해 반올림 오류가 없다고 가정)
Titus

0

Node.js를, 156 135 바이트

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

입력 및 출력 이미지 파일은 PBM (P1) 형식 이어야하며 첫 번째 행은P1 [width] [height] 이고 두 번째 행은 공백이없는 흑백 ASCII 값입니다.

다음은 입력 이미지와 xor 출력 (32x32 픽셀)입니다.

입력 # 1 입력 # 2 산출

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.