XOR dua gambar monokrom

28

Tantangan:

Ambil input dari dua gambar hitam-putih (satu warna) dan xor setiap piksel yang pertama, dengan masing-masing piksel yang kedua, tambahkan ke gambar baru dan hasilkan gambar baru.

Beberapa klarifikasi:

Ukuran gambar tidak masalah. Ekstensi / format gambar tidak masalah. Anda dapat membuatnya mengambil input ekstensi apa pun dan output ekstensi apa saja, selama ekstensi tersebut digunakan untuk menyimpan gambar digital. Anda juga dapat menggunakan grafik untuk menggambar output di misalnya: kotak gambar jika Anda inginkan. Jika tidak, simpan output sebagai file. Input dapat diambil sebagai jalur ke gambar, atau url.

Satu hal yang tidak dapat Anda lakukan adalah array I / O, mis. kembar tiga (R, G, B).

JANGAN mengutak-atik alpha . Seharusnya tidak xored, itu harus 255 (nilai maksimal) untuk setiap piksel.

Apa maksudmu untuk setiap piksel?

Anda tidak harus melakukannya dengan cara ini, tetapi satu cara untuk xor dua piksel adalah dengan mengambil nilai RGB dan xor R1 dengan R2, G1 dengan G2, B1 dengan B2, dan ambil hasilnya, yang merupakan warna baru Anda

Karena kita hanya memiliki dua warna, jelas ketika warnanya sama hasilnya akan (0,0,0) dan ketika mereka berbeda (putih adalah 255.255.255 dan hitam adalah 0,0,0) dalam kasus ini, hasilnya akan menjadi 255.255.255.

Jadi ketika dua piksel berbeda, hasilnya adalah piksel putih, atau piksel hitam

Contoh I / O:


Input 1: Input 2:

Input 1 Input 2


Keluaran:

Keluaran


Ini adalah sehingga kode terpendek menang.

P. Ktinos
sumber
Bisakah kita mengambil gambar input sebagai URL?
Kritixi Lithos
@KritixiLithos ya, saya mengeditnya dalam tantangan untuk pemirsa lebih lanjut.
P. Ktinos
5
Tantangan bonus: i.imgur.com/a0M6o9e.png dan i.imgur.com/bP1TsjQ.png .
orlp
@ orlp Saya bangun dengan kode qr
Kritixi Lithos

Jawaban:

20

Bahasa Ekspresi Fx (ImageMagick), 8 4 byte

EDIT

  • Disederhanakan menjadi u!=v, -4 byte

Karena "Bahasa Ekspresi Fx" tampaknya Turing lengkap, saya telah memprofil ulang jawaban saya untuk itu (adalah Unix Shell + Image Magick).

Golf

u!=v

Fx tidak mendukung bitor XOR atau bitwise TIDAK , jadi saya telah menggunakan !=sebagai gantinya (yang berfungsi dengan baik untuk gambar BW murni).

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

Input dan output bersifat implisit (dikendalikan oleh penerjemah).

Pemakaian

Utilitas konversi ImageMagick , berfungsi sebagai penerjemah "Bahasa Ekspresi Fx", ketika dipanggil dengan -fx, seperti yang diilustrasikan di bawah ini:

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

Argumennya adalah:

  1. Masukkan gambar A
  2. Input gambar B
  3. Keluarkan gambar O (A ^ B).

Output sampel

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

masukkan deskripsi gambar di sini

zeppelin
sumber
15

Mathematica, 37 34 15 byte

Terima kasih kepada Ian Miller karena telah memotong jumlah byte lebih dari setengah!

ImageDifference

Pada akhirnya, selalu ada builtin. Fungsi ini mengambil dua gambar sebagai input dan output gambar; itu melakukan sesuatu yang lebih rumit untuk gambar berwarna, tetapi untuk hitam-putih itu persis XOR.

Pengajuan sebelumnya:

Terima kasih kepada JungHwan Min karena telah menghemat 3 byte!

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

Fungsi tanpa nama yang mengambil pasangan gambar yang dipesan (dimensi yang kompatibel) sebagai input, dan mengembalikan gambar yang ditampilkan. ImageDatahanya mendapatkan data piksel tanpa semua pembungkus / metadata; sayangnya ia mengembalikan bilangan real, sehingga Chopdiperlukan untuk membantu memperlakukannya sebagai bilangan bulat. BitXortidak persis apa yang tertulis di kaleng (dan benang di atas daftar bersarang), dan Imagemengubah RGB yang dihasilkan kembali menjadi gambar.

Pengajuan asli, yang mengambil input dari sepasang URL atau nama file:

Image[BitXor@@(#~Import~"Data"&/@#)]&
Greg Martin
sumber
4
Untuk gambar biner, Anda dapat menggunakan 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"));}}

Tidak Terkumpul:

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"));
    }
}
Marv
sumber
1
Anda dapat menghemat satu byte dengan menghapus spasi di antaranya String[] y. Hanya sedikit golf kecil.
HyperNeutrino
Oh, sial kau benar. Belum banyak bermain golf akhir-akhir ini, benar-benar mengabaikan golf itu. Tepuk tangan.
Marv
3
Anda dapat menghapus publicdari public class Muntuk menyimpan 7 byte
Kritixi Lithos
Ekstensi file .pngtidak perlu
Huntro
Anda dapat menghemat satu byte dengan melakukan ... "i ++ <a.getHeight ();)"
Tatarize
9

Python, 64 60 57 byte

Saya baru bermain golf, jadi ampunilah!

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

Terima kasih kepada @Blender dan @FlipTack karena telah menyelamatkan saya 7 byte!

hashcode55
sumber
1
Penggunaan from cv2 import*harus mencukur 4 karakter.
Blender
1
Di sini, lambdas yang tidak disebutkan namanya diizinkan untuk jawaban fungsi, sehingga Anda dapat menghapus d=:) juga, melakukan r=imreaddan kemudian menggunakan rdua kali mungkin lebih pendek
FlipTack
7

Oktaf, 43 38 34 byte

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

Terima kasih kepada flawr, menyelamatkan saya 5 byte.

Berkat Luis Mendo menyelamatkan saya 4 byte disarankan untuk menggunakan a~=bbukan xor(a,b).

Fungsi yang mengambil sebagai nama file input dari dua gambar input a,bdan menunjukkan hasilnya.

Jawaban sebelumnya yang menulis ke file:

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

Fungsi yang mengambil sebagai nama file input dari dua gambar input a,bdan nama file dari gambar output c.

Pemakaian:

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

Hasil disimpan dalam out.png

rahnema1
sumber
1
Tidak bisakah Anda menggunakan imshow()bukan imwrite()?
flawr
@ flawr Tentu saja itu akan menghemat beberapa byte :)
rahnema1
1
Tidak bisakah Anda menggunakan imread(a)~=imread(b)(atau +(imread(a)~=imread(b))jika input logis tidak diizinkan imshow), bukan xor(...)?
Luis Mendo
1
@LuisMendo Terima kasih, saya selalu belajar dari komentar Anda!
rahnema1
7

JavaScript (ES6), 333 320 308 299 297 byte

- 12 20 byte disimpan oleh Ismael Miguel
- 2 byte disimpan oleh user2428118

Mengharapkan gambar yang sudah dimuat, mengambil ukuran input pertama sebagai ukuran output dan mengembalikan elemen kanvas.

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

Tidak disatukan

(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: Pertama kali di kode-golf, jadi mungkin bisa golf lebih dan hitungan saya mungkin salah.

PP: kanvas konteks 2D memiliki xor[mode penulisan ( https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation ), tetapi bekerja pada nilai alpha ...

Bisa lebih jauh di-golf (251 bytes) dengan ukuran tetap 300 * 150px (semua yang tersisa berwarna hitam) seperti pada jawaban Pemrosesan

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

Kaiido
sumber
1
Ganti fungsi cdengan c=i=>{with(document.createElement('canvas')){width=i.width,height=i.height;return getContext`2d`}}dan Anda menghemat 16 byte.
Ismael Miguel
Tidak bisakah Anda xorpersegi panjang hitam di atas xordua gambar untuk kembali ke 255 alpha?
Neil
@IsmaelMiguel, terima kasih, Tidak digunakan untuk digunakan withtetapi tampaknya cukup bagus untuk bermain golf ;-) Juga, lupa bahwa templat literalnya menghemat 2 byte ...
Kaiido
@Neil, saya tidak yakin, di sini kita punya array 8bit, mungkin dengan 32bit, yang bisa melakukannya, tetapi akan membutuhkan lebih banyak karakter ...
Kaiido
1
Menghemat 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

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

Pemakaian:

Catatan: kode ini dapat mendukung gambar hingga 400px(dengan modifikasi dapat mendukung hingga 999 untuk bytecount yang sama). Setiap ruang "sisa" akan berwarna hitam, jadi untuk hasil terbaik, ukuran gambar harus sama dengan dimensi dalam kode (juga size()kebutuhan untuk diubah dengan dimensi yang diperbarui)

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

masukkan deskripsi gambar di sini

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

masukkan deskripsi gambar di sini

Tidak disatukan

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.
*/
}
Kritixi Lithos
sumber
7

MATL , 10 byte

YiiYiY~1YG

Penjelasan

Ini pada dasarnya jawaban yang sama, seperti solusi Oktaf yang ada : Dibutuhkan nama file atau URL dari kedua gambar sebagai input dan menampilkan hasilnya di layar.

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

Pemakaian

>> matl
 > YiiYiY~1YG
 > 
> 'https://i.stack.imgur.com/UbbfM.png'
> 'https://i.stack.imgur.com/YyZG2.png'
hbaderts
sumber
1
Ini 10 byte.
Erik the Outgolfer
3

Perl, 260 byte

251 byte kode + 9 byte untuk -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')

Saya tidak yakin Perl adalah bahasa terbaik untuk tantangan ini, tetapi saya ingin tahu apa gambar komentar @ orlp. Dan itu membuat saya menggunakan sedikit dari modul grafis itu, itu hal yang baik. Dan saya menikmati mengkodekannya!

Versi yang lebih mudah dibaca:

gunakan Imager ; 
$ img1 = Imager baru ( file => $ ARGV [ 1 ] ); 
$ img2 = Imager baru ( file => $ ARGV [ 0 ] );   

untuk $ x ( 0 .. $ img1 -> getwidth () - 1 ) { untuk $ y ( 0 .. $ img1 -> getheight () - 1 ) { ( $ r1 , $ g1 , $ b1 ) = $ img1 - > getpixel ( x => $ x , y => $ y , ketik => "8bit" ) -> rgba (); ( $ r2 , $ g2    
        
       
    , $ b2 ) = $ img2 -> getpixel ( x => $ x , y => $ y , ketik => "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' )  
    
  

Anda harus menginstal Imager jika ingin mencobanya, tetapi cukup sederhana: jalankan saja (echo y;echo) | perl -MCPAN -e 'install Imager'di terminal Anda.

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

Cukup sederhana, mengambil dua file gambar pada baris perintah, menampilkan file bernama "Z" ke direktori Love. Juga berfungsi untuk gambar penuh warna!

ATaco
sumber
1
@MDXF love2d.org
ATaco
2

J, 54 byte

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

Membawa dua argumen di mana masing-masing adalah jalur ke gambar input dalam bmpformat. Setiap gambar dibaca sebagai matriks bilangan bulat RGB 24-bit dan diuraikan menjadi triplet nilai RGB 8-bit, tanda masing-masing diambil, dan dua matriks XOR bersama-sama. Hasilnya kemudian diskalakan oleh 255, dikonversi kembali dari triplet basis 256 angka menjadi bilangan bulat, dan ditulis ke bmpfile output bernama o.

mil
sumber
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))

Beroperasi pada gambar PBM. Panggil f(a, b, out)dengan nama file input dan file output.

Asumsi:

  • Kedua header gambar input identik (termasuk spasi), dan lebih kecil dari 9 * sizeof(int)karakter.

  • Kami menggunakan OS yang bagus yang membersihkan dan menutup file yang bocor.

  • EOF == -1

Tidak diikat dan dijelaskan: (garis miring terbalik dihilangkan)

// 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 (spec-bending), 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)

Masih menggunakan file PBM, tetapi sekarang:

  • Gambar harus satu piksel tinggi dan lebar 8 piksel atau kurang, karena PBM mengemas 8 piksel dalam satu byte.

  • Header harus 7 byte (mis. P4 8 1Dengan spasi tambahan).

Kedua file dicari ke depan sambil mengisi tdengan header mereka, kemudian byte terakhir dibaca, di-xor dan ditulis kembali. Mengambil keuntungan dari freaddan fwritememiliki daftar parameter yang mirip dengan faktor ketiga operasi pada header di belakang makro yang sama.

Quentin
sumber
2

R, 45 byte

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

adan bmewakili nama file dari dua file gambar.

Contoh:

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

Keluaran:

masukkan deskripsi gambar di sini

Sven Hohenstein
sumber
2

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

Abuse Memproses fungsi menggambar yang luas untuk menghindari melakukan XOR. Memadukan dua gambar bersama dengan DIFFERENCEmode dan menariknya ke layar.

Pemakaian

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

Tidak disatukan

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);
}
quat
sumber
Golf yang bagus! Ini benar-benar cerdas yang digunakan 32bukan DIFFERENCE. Ini akan menjadi tip yang bagus untuk bermain golf: codegolf.stackexchange.com/questions/26809/… :)
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");}}

Terima kasih kepada Unknown6656 untuk tip yang tidak perlu argumen baris perintah. Program sekarang membaca dari file "a" dan "b" dan menulis ke file "c" dalam format yang sama dengan "a". Dinonaktifkan oleh satu kesalahan yang diperbaiki juga.

Ini menetapkan setiap piksel menjadi hitam jika warnanya sama, jika tidak putih.

Untuk menghemat byte, ia menangkap pengecualian batas, daripada memeriksa properti Width dan Height dari Bitmap. Setiap kali x keluar dari batas itu diatur ulang ke 0, dan y bertambah. Ketika y keluar dari batas, x adalah 0 dan loop terputus untuk menyimpan gambar dan berhenti.

Contoh kompilasi menggunakan csc dan jalankan menggunakan mono:

csc xor.cs

mono xor.exe
Simon Biber
sumber
Anda bisa meletakkan token (string[] v)di dalam deklarasi utama, karena C # tidak secara eksplisit membutuhkannya untuk menjalankan aplikasi
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 terang-terangan dari jawaban Java . Saya tidak tahu bagaimana melakukan tantangan, tetapi ingin tahu seberapa baik solusi Java diterjemahkan ke dalam Clojure. Itu cukup mudah. Kode ungolfed sebenarnya agak cantik.

Ini adalah tantangan kode-golf pertama yang saya lakukan termasuk impor. Mungkin ada cara untuk mengoptimalkannya untuk menghemat beberapa byte.

Tidak Terkumpul:

(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"))))
Carcigenicate
sumber
1

PHP, 246 243 byte

Saya mungkin bisa menurunkan ini lebih banyak.

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

Jalankan dari baris perintah seperti ini:

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
Kodos Johnson
sumber
Mendefinisikan variabel nama fungsi pada kemunculan pertamanya dapat membantu: $i=imagecreatefrompng;$a=$i($argv[1])satu byte lebih panjang dari $a=($i=imagecreatefrompng)($argv[1]). Dan Anda bisa mencoba gambar palet dengan palet dua warna.
Titus
Saya mencoba mendefinisikannya pada kejadian pertama tetapi saya terus mendapatkan kesalahan fatal. Saya akan coba lagi nanti kalau ada waktu. Mungkin saya tidak melakukannya dengan benar.
Kodos Johnson
($f=func)(params)membutuhkan PHP 7.
Titus
@Itus ah ok terima kasih. Itu membuat saya turun 3 byte.
Kodos Johnson
Berikut adalah 7 byte lagi: Ganti for(;$k<$w*$h;)dengan for(;$y<$h;$y+=1/$w), $x=$k%$w, $y=$k++/$w dengan $x, $ydan yang terakhir $xdengan $x++. (dengan asumsi tidak ada kesalahan pembulatan untuk ukuran gambar yang masuk akal)
Titus
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``))

File gambar input dan output harus dalam format PBM (P1), di mana baris pertama P1 [width] [height], dan baris kedua adalah nilai ascii b / w tanpa spasi.

Berikut adalah gambar input yang diikuti oleh output xor (32x32 piksel):

Masukan # 1 Masukan # 2 Keluaran

Mwr247
sumber