XOR deux images monochromes

28

Défi:

Saisissez deux images en noir et blanc (monochrome) et xou chaque pixel de la première, avec chaque pixel de la seconde, ajoutez-les à une nouvelle image et sortez la nouvelle image.

Quelques clarifications:

La taille des images n'a pas d'importance. L'extension / le format d'image n'a pas d'importance. Vous pouvez lui demander de saisir n'importe quelle extension et de sortir n'importe quelle extension, tant que l'extension est utilisée pour stocker des images numériques. Vous pouvez également utiliser des graphiques pour dessiner la sortie, par exemple dans une boîte à images si vous le souhaitez. Sinon, enregistrez la sortie dans un fichier. L'entrée peut être considérée comme un chemin vers l'image ou l'URL.

Une chose que vous ne pouvez pas faire cependant, ce sont les tableaux d'E / S, par exemple. de triplets (R, G, B).

Ne modifiez PAS l' alpha . Il ne doit pas être xoré, il doit être de 255 (valeur maximale) pour chaque pixel.

Que voulez-vous dire pour chaque pixel?

Vous n'avez pas à le faire de cette façon, mais une façon de xor deux pixels est de prendre leurs valeurs RVB et xor R1 avec R2, G1 avec G2, B1 avec B2 et prendre le résultat, qui est votre nouvelle couleur

Puisque nous n'avons que deux couleurs, évidemment lorsque les couleurs sont les mêmes, le résultat serait (0,0,0) et quand elles sont différentes (le blanc est 255,255,255 et le noir est 0,0,0) dans ce cas, le résultat serait être 255.255.255.

Ainsi, lorsque deux pixels sont différents, le résultat est un pixel blanc, sinon un pixel noir

Exemple d'E / S:


Entrée 1: Entrée 2:

Entrée 1 Entrée 2


Sortie:

Sortie


C'est le donc le code le plus court gagne.

P. Ktinos
la source
Pouvons-nous prendre l'image d'entrée comme URL?
Kritixi Lithos du
@KritixiLithos yup, je l'ai édité dans le défi pour tous les téléspectateurs supplémentaires.
P. Ktinos
@orlp J'ai appris le code qr
Kritixi Lithos

Réponses:

20

Le langage d'expression Fx (ImageMagick), 8 4 octets

MODIFICATIONS

  • Simplifié à u!=v, -4 octets

Comme "Fx Expression Language" est apparemment Turing complet, j'ai re-profilé ma réponse (était Unix Shell + Image Magick).

Golfé

u!=v

Fx ne prend pas en charge XOR au niveau du bit ni le NOT au niveau du bit , j'ai donc utilisé à la !=place (ce qui fonctionne très bien pour les images BW pures).

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

L'entrée et la sortie sont implicites (contrôlées par l'interpréteur).

Usage

L' utilitaire de conversion ImageMagick sert d'interprète "Fx Expression Language" lorsqu'il est invoqué avec -fx, comme illustré ci-dessous:

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

Les arguments sont les suivants:

  1. Image d'entrée A
  2. Image d'entrée B
  3. Image de sortie O (A ^ B).

Exemple de sortie

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

enter image description here

Zeppelin
la source
15

Mathematica, 37 34 15 octets

Merci à Ian Miller d'avoir réduit le nombre d'octets de plus de la moitié!

ImageDifference

En fin de compte, il y a toujours une fonction intégrée. Cette fonction prend deux images en entrée et sort une image; cela fait quelque chose de plus compliqué pour les images en couleur, mais pour le noir et blanc, c'est exactement XOR.

Soumissions précédentes:

Merci à JungHwan Min pour avoir économisé 3 octets!

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

Fonction sans nom qui prend en entrée une paire ordonnée d'images (de dimensions compatibles) et renvoie une image affichée. ImageDataobtient uniquement les données de pixels sans tous les wrappers / métadonnées; malheureusement, il renvoie des nombres réels, il Chopest donc nécessaire pour les traiter comme des nombres entiers. BitXorfait exactement ce qu'il dit sur l'étain (et passe sur les listes imbriquées), et Imagetransforme le RVB résultant en une image.

Soumission d'origine, qui a pris une paire ordonnée d'URL ou de noms de fichiers comme entrée:

Image[BitXor@@(#~Import~"Data"&/@#)]&
Greg Martin
la source
4
Pour les images binaires, vous pouvez utiliser ImageDifference[#,#2]&
Ian Miller
10

Java, 336 335 328 octets

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

Non golfé:

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
la source
1
Vous pouvez enregistrer un octet en supprimant l'espace entre les deux String[] y. Juste un petit golf mineur.
HyperNeutrino
Oh dang tu as raison. Je n'ai pas beaucoup joué au golf ces derniers temps, je l'ai totalement ignoré. À votre santé.
Marv
3
Vous pouvez supprimer le publicde public class Mpour sauver 7 octets
Kritixi Lithos
L'extension de fichier .pngne devrait pas être nécessaire
Huntro
Vous pouvez enregistrer un octet en faisant ... "i ++ <a.getHeight ();)"
Tatarize
9

Python, 64 60 57 octets

Je suis nouveau au golf, alors ayez pitié!

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

Merci à @Blender et @FlipTack de m'avoir sauvé 7 octets!

hashcode55
la source
1
L'utilisation from cv2 import*devrait raser 4 caractères.
Blender
1
Ici, les lambdas sans nom sont autorisés pour les réponses de fonction, vous pouvez donc supprimer d=:) aussi, faire r=imreadet ensuite utiliser rdeux fois peut être plus court
FlipTack
7

Octave, 43 38 34 octets

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

Merci à flawr m'a sauvé 5 octets.

Merci à Luis Mendo m'a sauvé 4 octets suggérés d'utiliser à la a~=bplace de xor(a,b).

Une fonction qui prend comme nom de fichier d'entrée des deux images d'entrée a,bet affiche le résultat.

Réponse précédente qui écrit dans un fichier:

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

Une fonction qui prend comme nom de fichier d'entrée des deux images d'entrée a,bet nom de fichier de l'image de sortie c.

Usage:

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

Le résultat est enregistré dans out.png

rahnema1
la source
1
Ne pourriez-vous pas utiliser à la imshow()place de imwrite()?
flawr
@flawr Bien sûr, cela permettra d'économiser quelques octets :)
rahnema1
1
Ne pouvez-vous pas utiliser imread(a)~=imread(b)(ou +(imread(a)~=imread(b))si l'entrée logique n'est pas autorisée par imshow) à la place de xor(...)?
Luis Mendo
1
@LuisMendo Merci, j'apprends toujours de vos commentaires!
rahnema1
7

JavaScript (ES6), 333 320 308 299 297 octets

- 12 20 octets enregistrés par Ismael Miguel
- 2 octets enregistrés par user2428118

Attend des images déjà chargées, prend la taille de la première entrée comme taille de sortie et renvoie un élément 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">

Non golfé

(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: première fois au code-golf, donc il peut probablement être joué plus et mon décompte peut être erroné.

PPs: le contexte 2D de canevas a un xor[mode de composition ( https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation ), mais il fonctionne sur des valeurs alpha ...

Pourrait être encore plus joué (251 octets) avec une taille fixe de 300 * 150 px (tout le reste est noir) comme dans la réponse de traitement

(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
la source
1
Remplacez la fonction cpar c=i=>{with(document.createElement('canvas')){width=i.width,height=i.height;return getContext`2d`}}et vous économisez 16 octets.
Ismael Miguel
Pouvez-vous pas xorun rectangle noir sur les xordeux images pour revenir à 255 alpha?
Neil
@IsmaelMiguel, merci, pas utilisé withmais semble assez bon pour le golf ;-) De plus, j'ai oublié que le modèle littéral enregistre 2 octets ...
Kaiido
@Neil, je ne suis pas sûr, nous avons ici un tableau 8 bits, peut-être avec un 32 bits, qui pourrait le faire, mais cela prendra plus de caractères ...
Kaiido
1
Enregistre 4 octets:(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

Traitement, 124 118 117 octets

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

Usage:

Remarque: ce code peut prendre en charge des images jusqu'à 400px(avec des modifications peut prendre en charge jusqu'à 999 pour le même octet). Tout espace "restant" sera coloré en noir, donc pour de meilleurs résultats, la taille de l'image doit être la même que les dimensions dans le code (également les size()besoins doivent être modifiés avec les dimensions mises à jour)

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

entrez la description de l'image ici

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

entrez la description de l'image ici

Non golfé

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
la source
7

MATL , 10 octets

YiiYiY~1YG

Explication

Il s'agit essentiellement de la même réponse que la solution Octave existante : elle prend les noms de fichiers ou les URL des deux images en entrée et affiche le résultat à l'écran.

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

Usage

>> matl
 > YiiYiY~1YG
 > 
> 'https://i.stack.imgur.com/UbbfM.png'
> 'https://i.stack.imgur.com/YyZG2.png'
hbaderts
la source
1
C'est 10 octets.
Erik the Outgolfer
3

Perl, 260 octets

251 octets de code + 9 octets pour -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')

Je ne suis pas sûr que Perl soit le meilleur langage pour ce défi, mais je voulais savoir quelle était l'image du commentaire de @ orlp. Et ça me fait utiliser un peu de ces modules graphiques, c'est une bonne chose. Et j'ai aimé le coder!

Une version plus lisible:

utiliser l' imageur ; 
$ img1 = nouvel imageur ( fichier => $ ARGV [ 1 ] ); 
$ img2 = nouvel imageur ( fichier => $ ARGV [ 0 ] );   

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

Vous aurez besoin d'installer Imager si vous voulez l'essayer, mais c'est assez simple: exécutez simplement (echo y;echo) | perl -MCPAN -e 'install Imager'votre terminal.

Dada
la source
3

LÖVE2D , 199 octets

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

Assez simple, prend deux fichiers image sur la ligne de commande, génère un fichier appelé "Z" dans le répertoire Love. Fonctionne également pour les images en couleur!

ATaco
la source
1
@MDXF love2d.org
ATaco
2

J, 54 octets

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

Prend deux arguments où chacun est le chemin d'accès à une image d'entrée au bmpformat. Chaque image est lue comme une matrice d'entiers RVB 24 bits et analysée en un triplet de valeurs RVB 8 bits, le signe de chacune est pris et les deux matrices sont XOR ensemble. Le résultat est ensuite mis à l'échelle par 255, reconverti à partir d'un triplet de nombres de base 256 en un entier, et écrit dans un bmpfichier de sortie nommé o.

miles
la source
2

C, 189 octets

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

Fonctionne sur les images PBM. Appelez f(a, b, out)avec les noms des fichiers d'entrée et du fichier de sortie.

Hypothèses:

  • Les deux en-têtes d'image d'entrée sont identiques (espace inclus) et sont inférieurs à des 9 * sizeof(int)caractères.

  • Nous sommes sur un bon système d'exploitation qui vide et ferme les fichiers ayant fui.

  • EOF == -1

Non golfé et expliqué: (barres obliques inversées omises)

// 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 (flexion des spécifications), 149 octets

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

Utilise toujours des fichiers PBM, mais maintenant:

  • L'image doit avoir une hauteur d'un pixel et une largeur de 8 pixels ou moins, car PBM contient 8 pixels dans un octet.

  • L'en-tête doit être de 7 octets (par exemple P4 8 1avec un espace de fin).

Les deux fichiers sont recherchés vers l'avant tout en remplissant tleur en-tête, puis les derniers octets sont lus, corrigés et réécrits. Profite des listes de paramètres similaires freadet en fwritedispose pour factoriser les trois opérations sur l'en-tête derrière la même macro.

Quentin
la source
2

R, 45 octets

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

aet b représentent les noms de fichier des deux fichiers image.

Exemple:

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

Sortie:

entrez la description de l'image ici

Sven Hohenstein
la source
2

Traitement, 82 octets

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 les fonctions de dessin étendues de Processing pour éviter de faire du XORing. Mélange les deux images avec le DIFFERENCEmode et les dessine à l'écran.

Usage

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

Non golfé

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
la source
Beau golf! C'est vraiment intelligent que vous ayez utilisé à la 32place DIFFERENCE. Ce serait une bonne astuce pour le golf: codegolf.stackexchange.com/questions/26809/… :)
Kritixi Lithos
2

C #, 233 octets

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

Merci à Unknown6656 pour l'astuce que les arguments de ligne de commande ne sont pas nécessaires. Le programme lit maintenant à partir des fichiers "a" et "b" et écrit dans le fichier "c" dans le même format que "a". Éteint d'une erreur également corrigée.

Il définit chaque pixel sur noir si la couleur est la même, sinon blanc.

Pour enregistrer les octets, il intercepte les exceptions hors limites, plutôt que de vérifier les propriétés Width et Height des Bitmaps. Chaque fois que x sort des limites, il est remis à 0 et y est incrémenté. Lorsque y sort des limites, x est égal à 0 et la boucle se rompt pour enregistrer l'image et quitter.

Exemple de compilation à l'aide de csc et d'exécution à l'aide de mono:

csc xor.cs

mono xor.exe
Simon Biber
la source
Vous pouvez déposer le jeton (string[] v)dans la déclaration principale, car C # n'en a pas explicitement besoin pour exécuter une application
unknown6656
1

Clojure, 300 octets

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

Arnaque flagrante de la réponse Java . Je ne savais pas comment relever le défi, mais j'étais curieux de savoir comment la solution Java s'est traduite en Clojure. C'était assez simple. Le code non golfé est en fait assez joli.

Ce fut le premier défi de golf de code que j'ai fait qui comprenait des importations. Il existe probablement un moyen de les optimiser pour économiser quelques octets.

Non golfé:

(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
la source
1

PHP, 246 243 octets

Je peux probablement jouer au golf plus bas.

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

Exécutez-le à partir de la ligne de commande comme ceci:

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
la source
La définition des variables de nom de fonction à leur première occurrence peut aider: $i=imagecreatefrompng;$a=$i($argv[1])est un octet de plus que $a=($i=imagecreatefrompng)($argv[1]). Et vous pouvez essayer des images de palette avec une palette de deux couleurs.
Titus
J'ai essayé de le définir lors de la première occurrence mais j'ai continué à recevoir une erreur fatale. Je réessaierai plus tard quand j'aurai le temps. Peut-être que je ne l'ai pas fait correctement.
Kodos Johnson
($f=func)(params)nécessite PHP 7.
Titus
@Titus ah ok merci. Cela m'a fait descendre de 3 octets.
Kodos Johnson
Voici 7 octets supplémentaires: Remplacez for(;$k<$w*$h;)par for(;$y<$h;$y+=1/$w), $x=$k%$w, $y=$k++/$w par $x, $yet le dernier $xpar $x++. (en supposant qu'il n'y a pas d'erreurs d'arrondi pour toutes les tailles d'image raisonnables)
Titus
0

Node.js, 156 135 octets

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

Les fichiers d'image d'entrée et de sortie doivent être au format PBM (P1), où se trouve la première ligne P1 [width] [height]et la deuxième ligne, les valeurs ascii n / b sans espaces.

Voici les images d'entrée suivies de la sortie xor (32x32 pixels):

Entrée # 1 Entrée # 2 Sortie

Mwr247
la source