XOR 2つのモノクロ画像


28

チャレンジ:

2つの白黒(モノクロ)画像を入力し、最初の画像の各ピクセルと2番目の画像の各ピクセルをxorし、それらを新しい画像に追加して、新しい画像を出力します。

いくつかの説明:

写真のサイズは関係ありません。拡張子/画像形式は関係ありません。拡張機能がデジタル画像の保存に使用されている限り、任意の拡張機能を入力し、任意の拡張機能を出力することができます。また、グラフィックを使用して、たとえば、必要に応じてピクチャボックスに出力を描画することもできます。それ以外の場合は、出力をファイルとして保存します。入力は、画像またはURLへのパスとして取得できます。

ただし、できないことの1つは、I / O配列です。トリプレット(R、G、B)の。

alphaを改ざんしないでください。固定する必要はありません。ピクセルごとに255(最大値)にする必要があります。

各ピクセルのxまたはxとはどういう意味ですか?

この方法で行う必要はありませんが、2つのピクセルをxorする1つの方法は、RGB値とxor R1とR2、G1とG2、B1とB2を取得し、その結果を新しい色にすることです。

2色しかないため、明らかに同じ色の場合、結果は(0,0,0)になり、異なる場合(白は255,255,255、黒は0,0,0)になり、結果は次のようになります。 255,255,255になります。

したがって、2つのピクセルが異なる場合、結果は白ピクセルになり、そうでない場合は黒ピクセルになります

I / Oの例:


入力1:入力2:

入力1 入力2


出力:

出力


これはので、最短のコードが優先されます。


入力画像をURLとして取得できますか?
クリティキシリトス

@KritixiLithosうん、私はさらなる視聴者のためにチャレンジで編集しました。
P.クティノス

5
ボーナスの挑戦:i.imgur.com/a0M6o9e.pngi.imgur.com/bP1TsjQ.png
-orlp


私はQRコードに立ち上がって@orlp
KritixiのLithos

回答:


20

Fx式言語(ImageMagick)、 8 4バイト

編集

  • u!=v、-4バイトに簡略化

「FX式言語は」明らかにチューリング完全され、私はそれに私の答えを再プロファイルました(Unixシェル+イメージ魔術はありました)。

ゴルフ

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

ここに画像の説明を入力してください


15

Mathematica、37 34 15バイト

バイト数を半分以上削減してくれたIan Millerに感謝します!

ImageDifference

最後に、常に組み込みがあります。この関数は、2つの画像を入力として受け取り、画像を出力します。カラー画像ではより複雑な処理を行いますが、白黒の場合はまさにXORです。

以前の提出:

3バイトを節約してくれたJungHwan Minに感謝します!

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

入力として(互換性のある寸法の)画像の順序付きペアを受け取り、表示された画像を返す名前のない関数。ImageDataすべてのラッパー/メタデータなしでピクセルデータのみを取得します。残念ながら実数を返すので、Chopそれらを整数として扱うために必要です。BitXorスズで正確に言うこと(およびネストされたリストにスレッド化する)を実行し、Image結果のRGBを画像に戻します。

オリジナルの送信。URLまたはファイル名の順序付きペアを入力しました。

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

4
使用できるバイナリイメージ ImageDifference[#,#2]&
イアンミラー

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

ゴルフをしていない:

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。ほんの少しの小さなゴルフ。
ハイパーニュートリノ

ああ、そうだね。最近はあまりゴルフをしていないので、見落としてしまいました。乾杯。
マーヴ

3
あなたは削除することができますpublicからpublic class M7バイト救うために
KritixiのLithos

ファイル拡張子.pngは必要ありません
ハントロ

... "i ++ <a.getHeight();)"を実行することでバイトを保存できます
1

9

Python、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バイト節約できました。

ルイスメンドーのおかげで、4バイトのa~=b代わりに4バイトを使用することが提案されましたxor(a,b)

2つの入力画像の入力ファイル名を取りa,b、結果を表示する関数。

ファイルに書き込む以前の回答:

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

2つの入力イメージの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バイト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:canvas 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
関数cをに置き換えて、c=i=>{with(document.createElement('canvas')){width=i.width,height=i.height;return getContext`2d`}}16バイトを保存します。
イスマエルミゲル

255アルファに戻すために、2つの画像のxor上に黒い長方形を重ねることはできませんxorか?
ニール

@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バイトです。
エリックアウトゴルファー

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 = 新しいイメージャーファイル=> $ ARGV [ 1 ] ); 
$ img2 = 新しいイメージャーファイル=> $ 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 タイプ=> "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")

コマンドラインで2つの画像ファイルを取得し、「Z」というファイルをLoveディレクトリに出力します。フルカラー画像でも機能します!


1
@MDXF love2d.org
ATaco

2

J、54バイト

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

2つの引数を取ります。各引数は、bmp形式の入力画像へのパスです。各画像は24ビットRGB整数のマトリックスとして読み取られ、8ビットRGB値のトリプレットに解析され、それぞれの符号が取得され、2つのマトリックスが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は1バイトで8ピクセルをパックするため、画像は高さ1ピクセル、幅8ピクセル以下でなければなりません。

  • ヘッダーは7バイトである必要があります(たとえばP4 8 1、末尾にスペースがあります)。

両方のファイルはt、ヘッダーを埋めながら前方にシークされ、最後のバイトが読み取られ、xor'dされ、書き戻されます。利用するfreadfwrite、すべての3つの操作同じマクロ後ろヘッダに因子に類似したパラメータリストを有します。


2

R、45バイト

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

aそしてb2つの画像ファイルのファイル名を表します。

例:

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

Processingの広範な描画機能を悪用して、実際にXORを実行しないようにします。2つの画像を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」に書き込みます。エラーも1つ修正されました。

色が同じ場合は各ピクセルを黒に設定し、そうでない場合は白に設定します。

バイトを節約するために、BitmapのWidthプロパティとHeightプロパティをチェックするのではなく、範囲外の例外をキャッチします。xが範囲外になるたびに0にリセットされ、yが増分されます。yが範囲外になると、xは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にどれだけうまく変換できるか興味がありました。とても簡単でした。改変されていないコードは実際にはかなりきれいです。

これは、インポートを含む私が行った最初のコードゴルフの挑戦でした。おそらくいくつかのバイトを節約するためにそれらを最適化する方法があります。

ゴルフをしていない:

(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])1つのバイトよりも長いです$a=($i=imagecreatefrompng)($argv[1])。そして、2色のパレットでパレット画像を試すことができます。
タイタス

最初にそれを定義しようとしましたが、致命的なエラーが発生し続けました。時間ができたら後でもう一度やります。たぶん私はそれを正しくしなかった。
コドスジョンソン

($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]で、2行目はスペースなしのb / w ascii値です。

入力画像の後にxor出力(32x32ピクセル)が続きます。

入力#1 入力#2 出力

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.