XOR zwei monochrome Bilder


28

Herausforderung:

Nehmen Sie die Eingabe von zwei Schwarzweißbildern (einfarbig) und xoder jedes Pixel des ersten mit jedem Pixel des zweiten, fügen Sie sie zu einem neuen Bild hinzu und geben Sie das neue Bild aus.

Einige Klarstellungen:

Die Größe der Bilder spielt keine Rolle. Erweiterung / Bildformat spielt keine Rolle. Sie können festlegen, dass eine beliebige Erweiterung eingegeben und eine beliebige Erweiterung ausgegeben wird, sofern die Erweiterung zum Speichern digitaler Bilder verwendet wird. Sie können auch Grafiken verwenden, um die Ausgabe zu zeichnen, z. B. in einer Bildbox, wenn Sie dies wünschen. Speichern Sie andernfalls die Ausgabe als Datei. Die Eingabe kann als Pfad zum Bild oder als URL verwendet werden.

Eine Sache, die Sie jedoch nicht tun können, sind E / A-Arrays, z. von Tripletts (R, G, B).

Verändern Sie Alpha NICHT . Es sollte nicht xored sein, es sollte 255 (maximaler Wert) für jedes Pixel sein.

Was meinst du mit xoder jedem Pixel?

Sie müssen es nicht so machen, aber eine Möglichkeit, zwei Pixel zu xen, besteht darin, ihre RGB-Werte und xor R1 mit R2, G1 mit G2, B1 mit B2 zu nehmen und das Ergebnis zu nehmen, das Ihre neue Farbe ist

Da wir nur zwei Farben haben, wäre in diesem Fall das Ergebnis offensichtlich (0,0,0), wenn die Farben gleich sind, und wenn sie unterschiedlich sind (Weiß ist 255,255,255 und Schwarz ist 0,0,0), das Ergebnis 255,255,255 sein.

Wenn also zwei Pixel unterschiedlich sind, ist das Ergebnis ein weißes Pixel, sonst ein schwarzes Pixel

Beispiel I / O:


Eingang 1: Eingang 2:

Eingang 1 Eingang 2


Ausgabe:

Ausgabe


Das ist also gewinnt der kürzeste Code.


Können wir das eingegebene Bild als URL verwenden?
Kritixi Lithos

@KritixiLithos yup, ich habe es in der Challenge für alle weiteren Zuschauer bearbeitet.
P. Ktinos



@orlp Ich bin zum QR-Code
aufgestiegen

Antworten:


20

Die FX-Ausdruckssprache (ImageMagick), 8 4 Bytes

EDITS

  • Vereinfacht auf u!=v-4 Bytes

Da "Fx Expression Language" anscheinend vollständig ist, habe ich meine Antwort darauf neu profiliert (war Unix Shell + Image Magick).

Golf gespielt

u!=v

Fx unterstützt weder bitweises XOR noch bitweises NOT , daher habe ich !=stattdessen verwendet (was für reine BW-Bilder gut funktioniert).

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

Eingabe und Ausgabe sind implizit (vom Interpreter gesteuert).

Verwendung

Das ImageMagick- Konvertierungsprogramm dient beim Aufrufen wie folgt als Interpreter für die "FX-Ausdruckssprache" -fx:

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

Die Argumente sind:

  1. Eingabebild A
  2. Eingabebild B
  3. Ausgabebild O (A ^ B).

Beispielausgabe

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

Bildbeschreibung hier eingeben


15

Mathematica, 37 34 15 Bytes

Vielen Dank an Ian Miller, der die Anzahl der Bytes um mehr als die Hälfte reduziert hat!

ImageDifference

Am Ende gibt es immer ein eingebautes. Diese Funktion nimmt zwei Bilder als Eingabe und gibt ein Bild aus. Bei Farbbildern ist dies etwas komplizierter, bei Schwarzweiß ist es jedoch genau XOR.

Bisherige Einsendungen:

Vielen Dank an JungHwan Min für die Einsparung von 3 Bytes!

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

Unbenannte Funktion, die ein bestelltes Bildpaar (mit kompatiblen Abmessungen) als Eingabe verwendet und ein angezeigtes Bild zurückgibt. ImageDataRuft nur die Pixeldaten ohne alle Wrapper / Metadaten ab. Leider gibt es reelle Zahlen zurück, daher Chopwird es benötigt, um sie als ganze Zahlen zu behandeln. BitXorTut genau das, was es verspricht (und fädelt verschachtelte Listen ein) und Imagewandelt das resultierende RGB wieder in ein Bild um.

Ursprüngliche Einreichung, bei der ein bestelltes Paar von URLs oder Dateinamen als Eingabe verwendet wurde:

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

4
Für binäre Bilder können Sie verwenden ImageDifference[#,#2]&
Ian Miller

10

Java, 336 335 328 Bytes

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

Ungolfed:

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
Sie können ein Byte speichern, indem Sie das Leerzeichen dazwischen entfernen String[] y. Nur ein bisschen Golf.
HyperNeutrino

Oh, du hast recht. Habe in letzter Zeit nicht viel golfen, habe das total übersehen. Prost.
Marv

3
Sie können das publicvon entfernen public class M, um 7 Bytes zu sparen
Kritixi Lithos

Die Dateierweiterung .pngsollte nicht notwendig sein
Huntro

Sie können ein Byte speichern, indem Sie ... "i ++ <a.getHeight ();)"
Tatarize

9

Python, 64 60 57 Bytes

Ich bin neu im Golfen, also hab Erbarmen!

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

Vielen Dank an @Blender und @FlipTack für das Speichern von 7 Bytes!


1
Die Verwendung from cv2 import*sollte 4 Zeichen abschneiden.
Blender

1
Hier werden unbenannte lambdas für die Funktion Antworten erlaubt, so dass Sie die fallen kann d=:) auch tun r=imreadund dann mit rzweimal könnte kürzer sein
FlipTack

7

Oktave, 43 38 34 Bytes

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

Dank flawr habe ich 5 Bytes gespart.

Dank Luis hat Mendo mir 4 Bytes gespart, die ich a~=banstelle von verwenden möchte xor(a,b).

Eine Funktion, die den Namen der Eingabedatei der beiden Eingabebilder übernimmt a,bund das Ergebnis anzeigt.

Vorherige Antwort, die in eine Datei schreibt:

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

Eine Funktion, die als Eingabedateinamen die beiden Eingabebilder a,bund den Dateinamen des Ausgabebildes verwendet c.

Verwendung:

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

Ergebnis wird gespeichert in out.png


1
Könnten Sie nicht imshow()anstelle von verwenden imwrite()?
Fehler

@flawr Natürlich werden dadurch einige Bytes gespart :)
rahnema1

1
Kannst du nicht statt verwenden imread(a)~=imread(b)(oder +(imread(a)~=imread(b))wenn logische Eingabe nicht erlaubt ist imshow) xor(...)?
Luis Mendo

1
@ LuisMendo Danke, ich lerne immer aus deinen Kommentaren!
rahnema1

7

JavaScript (ES6), 333 320 308 299 297 Bytes

- 12 20 Bytes gespeichert von Ismael Miguel
- 2 Bytes gespeichert von user2428118

Erwartet bereits geladene Bilder, nimmt die Größe der ersten Eingabe als Ausgabegröße und gibt ein Zeichenflächenelement zurück.

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

Ungolfed

(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: Zum ersten Mal beim Code-Golf, also kann wahrscheinlich mehr Golf gespielt werden und meine Zählung könnte falsch sein.

PPs: Canvas-2D-Kontext verfügt über einen xor[Compositing-Modus ( https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation ), funktioniert jedoch mit Alpha-Werten ...

Könnte mit einer festen Größe von 300 * 150px (alles, was übrig bleibt, ist schwarz) wie in der Antwort "Verarbeitung" noch weiter golfen werden (251 Byte)

(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
Ersetzen Sie die Funktion cdurch c=i=>{with(document.createElement('canvas')){width=i.width,height=i.height;return getContext`2d`}}und Sie sparen 16 Bytes.
Ismael Miguel

Können Sie nicht xorein schwarzes Rechteck über das xorder beiden Bilder ziehen, um zu 255 Alpha zurückzukehren?
Neil

@ IsmaelMiguel, danke, nicht verwendet, withaber scheint ziemlich gut zum Golfen ;-) Auch vergessen, das Template-Literal speichert 2 Bytes ...
Kaiido

@Neil, ich bin mir nicht sicher, hier haben wir ein 8-Bit-Array, vielleicht mit 32 Bit, das könnte es, aber es wird mehr Zeichen
brauchen

1
Speichert 4 Bytes:(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

Verarbeitung, 124 118 117 Bytes

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

Verwendung:

Hinweis: Dieser Code unterstützt Bilder bis zu 400px(mit Änderungen können bis zu 999 für das gleiche Bytecount unterstützt werden). Jeder "übrig gebliebene" Bereich wird schwarz gefärbt. Um optimale Ergebnisse zu erzielen, sollte die Bildgröße mit den Abmessungen im Code übereinstimmen (auch die Größe size()muss mit den aktualisierten Abmessungen geändert werden).

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

Bildbeschreibung hier eingeben

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

Bildbeschreibung hier eingeben

Ungolfed

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 Bytes

YiiYiY~1YG

Erläuterung

Dies ist im Grunde die gleiche Antwort wie bei der vorhandenen Octave-Lösung : Sie verwendet die Dateinamen oder URLs beider Bilder als Eingaben und zeigt das Ergebnis auf dem Bildschirm an.

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

Verwendung

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

1
Das sind 10 Bytes.
Erik der Outgolfer

3

Perl, 260 Bytes

251 Byte Code + 9 Byte für -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')

Ich bin nicht sicher, ob Perl die beste Sprache für diese Herausforderung ist, aber ich wollte wissen, wie der Kommentar von @ orlp aussieht. Und es bringt mich dazu, ein bisschen von diesen Grafikmodulen zu verwenden, das ist eine gute Sache. Und ich habe es genossen, es zu programmieren!

Eine lesbarere Version:

benutze Imager ; 
$ img1 = neuer Imager ( Datei => $ ARGV [ 1 ] ); 
$ img2 = neuer Imager ( Datei => $ ARGV [ 0 ] );   

für $ x ( 0 .. $ img1 -> getwidth () - 1 ) { für $ 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' )  
    
  

Sie müssen Imager installieren, wenn Sie es ausprobieren möchten, aber es ist ganz einfach: Führen (echo y;echo) | perl -MCPAN -e 'install Imager'Sie es einfach in Ihrem Terminal aus.


3

LÖVE2D , 199 Bytes

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

Einfach genug, nimmt zwei Bilddateien auf der Kommandozeile auf und gibt eine Datei mit dem Namen "Z" in das Love-Verzeichnis aus. Funktioniert auch für farbige Bilder!


1
@MDXF love2d.org
ATaco

2

J, 54 Bytes

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

Nimmt zwei Argumente an, wobei jedes der Pfad zu einem Eingabebild im bmpFormat ist. Jedes Bild wird als eine Matrix von 24-Bit-RGB-Ganzzahlen gelesen und in ein Triplett von 8-Bit-RGB-Werten zerlegt, das Vorzeichen von jedem wird genommen und die zwei Matrizen werden durch XOR miteinander verknüpft. Das Ergebnis wird dann mit 255 skaliert, von einem Triplett von Basis-256-Zahlen in eine Ganzzahl zurückgewandelt und in eine Ausgabedatei mit dem bmpNamen geschrieben o.


2

C 189 Bytes

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

Funktioniert mit PBM-Bildern. Anruff(a, b, out) mit den Namen der beiden Eingabedateien und der Ausgabedatei auf.

Annahmen:

  • Beide Eingabebild-Header sind identisch (einschließlich Leerzeichen) und bestehen aus weniger als 9 * sizeof(int)Zeichen.

  • Wir haben ein nettes Betriebssystem, das geleakte Dateien löscht und schließt.

  • EOF == -1

Ungolfed und erklärt: (Backslashes weggelassen)

// 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 Bytes

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

Verwendet immer noch PBM-Dateien, aber jetzt:

  • Das Bild muss ein Pixel hoch und 8 Pixel breit oder weniger sein, da PBM 8 Pixel in einem Byte packt.

  • Der Header muss aus 7 Bytes bestehen (z. B. P4 8 1mit einem nachgestellten Leerzeichen).

Beide Dateien werden beim Füllen tmit ihrem Header vorwärts gesucht , dann werden die letzten Bytes gelesen, xor'd und zurückgeschrieben. Nutzt freadund verfügt fwriteüber ähnliche Parameterlisten, um alle drei Operationen in der Kopfzeile hinter demselben Makro zu berücksichtigen.


2

R, 45 Bytes

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

aund brepräsentieren die Dateinamen der beiden Bilddateien.

Beispiel:

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

Ausgabe:

Bildbeschreibung hier eingeben


2

Verarbeitung, 82 Bytes

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

Die umfangreichen Zeichenfunktionen von Missbrauchsverarbeitung verhindern, dass tatsächlich XOR-Operationen ausgeführt werden. Mischt die beiden Bilder mit dem DIFFERENCEModus und zeichnet sie auf den Bildschirm.

Verwendung

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

Ungolfed

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

Schönes Golf! Es ist wirklich klug, dass Sie 32anstelle von verwendet haben DIFFERENCE. Dies wäre ein guter Tipp zum Golfen: codegolf.stackexchange.com/questions/26809/… :)
Kritixi Lithos

2

C #, 233 Bytes

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

Vielen Dank an Unknown6656 für den Tipp, dass Befehlszeilenargumente nicht erforderlich sind. Das Programm liest nun aus den Dateien "a" und "b" und schreibt im gleichen Format wie "a" in die Datei "c". Aus um einen Fehler behoben.

Hiermit wird jedes Pixel auf Schwarz gesetzt, wenn die Farbe identisch ist, andernfalls auf Weiß.

Um Bytes zu sparen, werden Ausnahmen außerhalb des zulässigen Bereichs abgefangen, anstatt die Eigenschaften Width und Height der Bitmaps zu überprüfen. Jedes Mal, wenn x die Grenzen überschreitet, wird es auf 0 zurückgesetzt und y wird inkrementiert. Wenn y außerhalb der Grenzen liegt, ist x 0 und die Schleife wird unterbrochen, um das Bild zu speichern und zu beenden.

Beispiel mit csc kompilieren und mit mono ausführen:

csc xor.cs

mono xor.exe

Sie könnten das Token (string[] v)in der
Hauptdeklaration ablegen

1

Clojure, 300 Bytes

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

Eklatante Abzocke der Java-Antwort . Ich wusste nicht, wie ich die Herausforderung angehen sollte, war aber gespannt, wie gut die Java-Lösung in Clojure übersetzt wurde. Es war ziemlich einfach. Der ungolfed Code ist eigentlich ein bisschen hübsch.

Dies war die erste Code-Golf-Herausforderung, die ich mit Importen durchgeführt habe. Es gibt wahrscheinlich eine Möglichkeit, sie zu optimieren, um einige Bytes zu sparen.

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 Bytes

Ich kann das wahrscheinlich mehr runter spielen.

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

Führen Sie es von der Kommandozeile wie folgt aus:

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

Das Definieren der Funktionsnamenvariablen beim ersten Auftreten kann helfen: Ist $i=imagecreatefrompng;$a=$i($argv[1])ein Byte länger als $a=($i=imagecreatefrompng)($argv[1]). Und Sie könnten Palettenbilder mit einer zweifarbigen Palette ausprobieren.
Titus

Ich habe beim ersten Auftreten versucht, es zu definieren, aber es trat immer wieder ein schwerwiegender Fehler auf. Ich werde es später noch einmal versuchen, wenn ich Zeit habe. Vielleicht habe ich es nicht richtig gemacht.
Kodos Johnson

($f=func)(params)benötigt PHP 7.
Titus

@ Titus ah ok danke. Das hat mich 3 Bytes gekostet.
Kodos Johnson

Hier sind noch 7 Bytes: Ersetze for(;$k<$w*$h;)mit for(;$y<$h;$y+=1/$w), $x=$k%$w, $y=$k++/$w mit $x, $yund das letzte $xmit $x++. (Vorausgesetzt, es gibt keine Rundungsfehler für angemessene Bildgrößen)
Titus

0

Node.js, 156 135 Bytes

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

Eingabe- und Ausgabebilddateien sollten im PBM- Format (P1) vorliegen, wobei sich die erste Zeile befindetP1 [width] [height] und die zweite Zeile die s / w-ASCII-Werte ohne Leerzeichen sind.

Hier sind die Eingabebilder, gefolgt von der xor-Ausgabe (32x32 Pixel):

Eingang Nr. 1 Eingang Nr. 2 Ausgabe

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.