XOR два монохромных изображения


28

Вызов:

Возьмите ввод двух черно-белых (монохромных) изображений и сделайте xor каждого пикселя первого, каждого пикселя второго, добавьте их к новому изображению и выведите новое изображение.

Некоторые уточнения:

Размер картинок не имеет значения. Расширение / Формат изображения не имеет значения. Вы можете заставить его принимать любое расширение и выводить любое расширение, если оно используется для хранения цифровых изображений. Вы также можете использовать графику, чтобы нарисовать вывод, например: изображение, если хотите. В противном случае сохраните вывод как файл. Входные данные могут быть приняты в качестве пути к изображению или URL.

Одна вещь, которую вы не можете сделать, однако, это массивы ввода / вывода, например. триплетов (R, G, B).

НЕ вмешиваться в альфа . Он не должен быть заштрихован, он должен быть 255 (максимальное значение) для каждого пикселя.

Что вы имеете в виду x или каждый пиксель?

Вам не нужно делать это таким образом, но один из способов xor двух пикселей состоит в том, чтобы взять их значения RGB и xor R1 с R2, G1 с G2, B1 с B2, и взять результат, который является вашим новым цветом

Поскольку у нас есть только два цвета, очевидно, что при одинаковых цветах результат будет (0,0,0), а когда они различаются (в этом случае белый - 255,255,255 и черный - 0,0,0), результат будет быть 255,255,255.

Таким образом, когда два пикселя различаются, в результате получается белый пиксель, иначе черный пиксель

Пример ввода / вывода:


Вход 1: Вход 2:

Вход 1 Вход 2


Выход:

Выход


Это поэтому выигрывает самый короткий код.


Можем ли мы взять входное изображение как URL?
Критиси Литос

@KritixiLithos Да, я отредактировал его в конкурсе для любых других зрителей.
П. Ктинос



@ orlp Я получил код qr
Kritixi Lithos

Ответы:


20

Язык выражения Fx (ImageMagick), 8 4 байта

редактирует

  • Упрощено до u!=v-4 байта

Поскольку «Язык выражений Fx», по-видимому, завершен по Тьюрингу, я перепрофилировал свой ответ на него (был Unix Shell + Image Magick).

Golfed

u!=v

Fx не поддерживает ни побитовое XOR, ни побитовое НЕ , поэтому я использовал !=вместо этого (что прекрасно работает для чистых изображений BW).

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

Ввод и вывод неявны (контролируются интерпретатором).

использование

Утилита преобразования ImageMagick , при вызове которой используется интерпретатор «Язык выражений Fx» -fx, как показано ниже:

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

введите описание изображения здесь


15

Mathematica, 37 34 15 байт

Спасибо Яну Миллеру за сокращение количества байтов более чем наполовину!

ImageDifference

В конце концов, всегда есть встроенный. Эта функция принимает два изображения на вход и выводит изображение; он делает что-то более сложное для цветных изображений, но для черно-белых это точно XOR.

Предыдущие представления:

Спасибо JungHwan Min за сохранение 3 байта!

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

Безымянная функция, которая принимает упорядоченную пару изображений (совместимых размеров) в качестве входных данных и возвращает отображаемое изображение. ImageDataполучает только пиксельные данные без всех оболочек / метаданных; к сожалению, он возвращает действительные числа, поэтому Chopон необходим для обработки их как целых чисел BitXorвыполняет в точности то, что говорит на жесте (и перебирает вложенные списки), и Imageпревращает полученный RGB обратно в изображение.

Исходная отправка, в которую входила упорядоченная пара URL или имен файлов:

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

4
Для двоичных изображений вы можете использовать ImageDifference[#,#2]&
Ian Miller

10

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

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
Вы можете сохранить байт, удалив пробел между ними String[] y. Просто небольшой маленький гольф.
HyperNeutrino

О черт, ты прав. В последнее время много не играл в гольф, полностью упустил из виду. Приветствия.
Марв

3
Вы можете удалить publicиз, public class Mчтобы сохранить 7 байтов
Kritixi Lithos

Расширение файла .pngне должно быть необходимым
Huntro

Вы можете сохранить байт, выполнив ... "i ++ <a.getHeight ();)"
Tatarize

9

Python, 64 60 57 байт

Я новичок в гольф, так что помилуй!

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

Спасибо @Blender и @FlipTack за то, что сэкономили мне 7 байт!


1
Использование from cv2 import*должно сбрить 4 символа.
Блендер

1
Здесь безымянные лямбда-выражения разрешены для ответов на функции, поэтому вы также можете отбросить d=:), выполнение r=imreadи последующее использование rдважды может быть короче
FlipTack

7

Октава, 43 38 34 байта

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

Благодаря flawr сэкономил мне 5 байт.

Благодаря Луису Мендо сэкономил мне 4 байта, которые предложили использовать a~=bвместо 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))если логический ввод не разрешен imshow) вместо xor(...)?
Луис Мендо

1
@ LuisMendo Спасибо, я всегда учусь на ваших комментариях!
rahnema1

7

JavaScript (ES6), 333 320 308 299 297 байт

- 12 20 байтов, сохраненных Исмаэлем Мигелем
- 2 байта, сохраненных пользователем2428118

Ожидает уже загруженные изображения, принимает первый размер ввода в качестве выходного размера и возвращает элемент холста.

(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: Первый раз в код-гольфе, так что, возможно, в него можно играть больше, и мой счет может быть ошибочным

PPs: контекст 2D холста имеет xor[режим композитинга ( https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation ), но он работает с альфа-значениями ...

Может быть еще дальше (251 байт) с фиксированным размером 300 * 150 пикселей (все остальное черное), как в ответе Обработка

(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
Замените функцию cна c=i=>{with(document.createElement('canvas')){width=i.width,height=i.height;return getContext`2d`}}и вы сэкономите 16 байт.
Исмаэль Мигель

Разве вы не можете xorчерный прямоугольник над xorдвумя изображениями, чтобы вернуться к 255 альфа?
Нил

@IsmaelMiguel, спасибо, не используется, withно, кажется, довольно хорош для игры в гольф ;-) Кроме того, забыл, что шаблонный литерал сохраняет 2 байта ...
Kaiido

@Neil, я не уверен, здесь у нас есть 8-битный массив, может быть, с 32-битным, который мог бы это сделать, но это займет больше символов ...
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"));

введите описание изображения здесь

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 байт

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

3

Perl, 260 байт

251 байт кода + 9 байт для -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. И это заставляет меня использовать немного графических модулей, это хорошо. И мне понравилось это кодировать!

Более читаемая версия:

использовать Imager ; 
$ img1 = new Imager ( file => $ ARGV [ 1 ] ); 
$ img2 = new Imager ( 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    
        
       
    ,
    $ img1$ 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 ; -> 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)символов.

  • У нас хорошая ОС, которая сбрасывает и закрывает пропущенные файлы.

  • 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, но сейчас:

  • Изображение должно иметь высоту один пиксель и ширину 8 пикселей или менее, поскольку PBM упаковывает 8 байтов в байт.

  • Заголовок должен быть 7 байтов (например, P4 8 1с завершающим пробелом).

Оба файла ищутся вперед при заполнении tих заголовка, затем последние байты читаются, xor'd и записываются обратно. Использует преимущества freadи fwriteналичие аналогичных списков параметров для учета всех трех операций над заголовком за одним и тем же макросом.


2

R, 45 байт

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

aи bпредставляют имена файлов двух файлов изображений.

Пример:

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. Смешивает два изображения вместе сDIFFERENCE режимом и рисует их на экране.

использование

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

Хороший гольф! Это действительно умно, что вы использовали 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» и записывает в файл «c» в том же формате, что и «a». Отключена одна ошибка исправлена ​​тоже.

Он устанавливает каждый пиксель в черный цвет, если цвет тот же, в противном случае белый.

Чтобы сохранить байты, он перехватывает исключения за пределами границ, а не проверяет свойства ширины и высоты растровых изображений. Каждый раз, когда x выходит за пределы, он сбрасывается в 0, а y увеличивается. Когда у выходит за границы, х равен 0, и цикл прерывается, чтобы сохранить изображение и выйти.

Пример компиляции с использованием csc и запуск с использованием mono:

csc xor.cs

mono xor.exe

Вы можете оставить токен (string[] v)в главном объявлении, так как C # явно не нужен для запуска приложения
unknown6656

1

Clojure, 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-ответа . Я не знал, как справиться с этой задачей, но мне было любопытно, насколько хорошо 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]). И вы можете попробовать палитру изображений с двухцветной палитрой.
Тит

Я попытался определить это при первом появлении, но я продолжал получать фатальную ошибку. Я попробую еще раз позже, когда у меня будет время. Возможно я не сделал это правильно.
Кодос Джонсон

($f=func)(params)требует PHP 7.
Титус

@ Titus ах хорошо, спасибо. Это заняло у меня 3 байта.
Кодос Джонсон

Вот еще 7 байтов: Заменить for(;$k<$w*$h;)на for(;$y<$h;$y+=1/$w), $x=$k%$w, $y=$k++/$w с $x, $yи последний $xна $x++. (при условии отсутствия ошибок округления для любых разумных размеров изображения)
Титус

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 Выход

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.