XOR iki tek renkli görüntü


28

Meydan okuma:

İki siyah beyaz (monokrom) görüntü girişi yapın ve ilkin her pikseli için, saniyenin her pikseli ile x, onları yeni bir görüntüye ekleyin ve yeni görüntüyü çıkartın.

Bazı açıklamalar:

Resimlerin boyutu önemli değil. Uzantı / Görüntü formatı önemli değil. Dijital görüntüleri saklamak için kullanıldığı sürece, herhangi bir uzantı girişi yapabilir ve herhangi bir uzantı çıktısını alabilirsiniz. Çıktıyı çizmek için örneğin grafikleri kullanabilirsiniz: İsterseniz bir resimli kutu. Aksi takdirde, çıktıyı bir dosya olarak kaydedin. Giriş, görüntüye bir yol olarak veya url'ye alınabilir.

Ancak yapamayacağınız bir şey, G / Ç dizileri, örn. üçüzlerin (R, G, B).

Alfa ile kurcalamayın . Xored, her piksel için 255 (maksimum değer) olmalıdır.

Her bir piksele x veya ne demek istiyorsun?

Bunu bu şekilde yapmak zorunda değilsiniz, ancak iki piksele x veya x piksel değerlerini almanın bir yolu, RGB değerlerini ve x veya R1, R2 ile, G1, G2, B1, B2 ile ve sonucu almaktır, ki bu sizin yeni renginizdir.

Sadece iki renge sahip olduğumuz için, renkler aynıyken sonuçta (0,0,0) ve farklı olduklarında (beyaz 255,255,255 ve siyah 0,0,0 olur) açıkça görülüyor. 255, 255, 255 olabilir.

Böylece iki piksel farklı olduğunda, sonuç beyaz bir pikseldir, başka bir siyah piksel

Örnek G / Ç:


Giriş 1: Giriş 2:

Giriş 1 Giriş 2


Çıktı:

Çıktı


Bu yani en kısa kod kazanır.


Giriş görüntüsünü URL olarak alabilir miyiz?
Kritixi Lithos,

@KritixiLithos yup, daha fazla izleyici için mücadelede yazdım.
P. Ktinos,



@orlp qr koduna
ulaştım

Yanıtlar:


20

Fx İfade Dili (ImageMagick), 8 4 bayt

DÜZENLEMELER

  • u!=v-4 bayt ile basitleştirildi

As "Fx İfade Dili" görünüşte tam Turing olduğunu, bunun cevabım yeniden profilli ettik (Unix Shell + Imagemagick'in idi).

golfed

u!=v

Fx bit düzeyinde desteklemediği XOR ne de Bitsel DEĞİL ben kullandım, böylece !=yerine (saf BW görüntüler için sadece para cezası çalışır).

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

Giriş ve çıkış örtüktür (tercüman tarafından kontrol edilir).

kullanım

ImageMagick convert yardımcı programı, -fxaşağıda gösterildiği gibi çağrıldığında "Fx İfade Dili" tercümanı olarak görev yapar :

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

Argümanlar:

  1. Giriş resmi A
  2. Giriş görüntüsü B
  3. Çıkış resmi O (A ^ B).

Örnek çıktı

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

görüntü tanımını buraya girin


15

Mathematica, 37 34 15 bayt

Bayt sayısını yarıdan fazla kesen Ian Miller'a teşekkürler!

ImageDifference

Sonunda, her zaman bir yerleşik var. Bu işlev giriş olarak iki görüntü alır ve bir görüntü çıkarır; renkli görüntüler için daha karmaşık bir şey yapıyor, ancak siyah beyaz için tam olarak XOR.

Önceki gönderiler:

3 bayt kaydettiğiniz için JungHwan Min'e teşekkürler!

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

Sıralı bir görüntü çiftini (uyumlu boyutlarda) giriş olarak alan ve görüntülenen bir görüntü veren isimsiz işlev. ImageDatatüm sarmalayıcılar / meta veriler olmadan yalnızca piksel verilerini alır; maalesef gerçek rakamları döndürür, bu yüzden Choponları tamsayı olarak kabul etmek için gereklidir. BitXortam olarak kalayda ne yazdığını (ve iç içe geçmiş listelerdeki konuları) yapar ve Imageelde edilen RGB'yi tekrar bir görüntüye dönüştürür.

Girilen bir URL veya dosya adının çiftini alan orijinal gönderim:

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

4
İkili görüntüler için kullanabilirsiniz ImageDifference[#,#2]&
Ian Miller

10

Java, 336 335 328 bayt

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
Aradaki boşluğu kaldırarak bir bayt kaydedebilirsiniz String[] y. Sadece küçük bir golf.
HyperNeutrino,

Ah haklısın. Son zamanlarda çok golf oynamamıştım, tamamen göz ardı ettim. Şerefe.
Marv

3
Sen kaldırabilirsiniz publicdan public class Mtasarruf 7 bayt
Kritixi Lithos

Dosya uzantısı .pnggerekli olmamalıdır
Huntro

Bayt'ı kaydederek ... "i ++ <a.getHeight ();)"
Tatarize et

9

Python, 64 60 57 bayt

Golf oynamak için yeniyim, biraz merhamet et!

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

Beni 7 bayttan kurtardığı için @Blender ve @FlipTack'e teşekkürler!


1
Kullanarak from cv2 import*4 karakter traş olmalı.
Blender

1
Burada, isimlendirilmemiş lambdaların fonksiyon cevaplarına izin verilir, böylece d=:) 'yi de düşürebilirsiniz, iki kere r=imreadkullanmak rdaha kısa olabilir
FlipTack

7

Octave, 43 38 34 bayt

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

Kusur sayesinde bana 5 bayt kazandırdı.

Luis Mendo sayesinde bana 4 bayt a~=byerine kullanılması önerdi xor(a,b).

İki giriş görüntüsünün giriş dosyası adını alan a,bve sonucu gösteren bir işlev .

Bir dosyaya yazan önceki cevap:

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

İki giriş görüntüsünün giriş a,bdosyası adını ve çıkış görüntüsünün dosya adını alan bir işlev c.

Kullanımı:

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

Sonuç kaydedildi out.png


1
Kullanmak Could imshow()yerine imwrite()?
kusur

@flawr Tabii ki bazı baytları kurtaracak :)
rahnema1

1
Bunun yerine kullanamazsınız imread(a)~=imread(b)(veya +(imread(a)~=imread(b))mantıksal girişe izin verilmezse imshow) xor(...)?
Luis Mendo

1
@LuisMendo Teşekkürler, yorumlarınızdan her zaman öğrenirim!
rahnema1

7

JavaScript (ES6), 333 320 308 299 297 bayt

- Ismael Miguel tarafından kaydedilen 12 bayt
- user2428118 tarafından kaydedilen 2 bayt

Önceden yüklenmiş görüntüleri bekler, ilk girişin boyutunu çıktı boyutu olarak alır ve bir tuval öğesi döndürür.

(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: ilk kez kod-golf, bu yüzden muhtemelen daha fazla golf olabilir ve sayım hatalı olabilir.

PPs: tuval 2D içeriği xor[birleştirme moduna sahiptir ( https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation ), ancak alfa değerleri üzerinde çalışıyor ...

İşleme yanıtında olduğu gibi sabit bir 300 * 150 piksel büyüklüğünde (kalanı siyah) daha fazla golf oynayabilir (251 bayt)

(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
İşlevini yerine cile c=i=>{with(document.createElement('canvas')){width=i.width,height=i.height;return getContext`2d`}}ve 16 bayt kaydedin.
Ismael Miguel,

255 alfaya geri dönmek için iki görüntünün xorüzerinde siyah bir dikdörtgen olamaz xormı?
Neil

@IsmaelMiguel, teşekkürler, Kullanmak için kullanılmamış, withancak golf oynamak için oldukça iyi görünüyor ;-) Ayrıca, hazır bilgi şablonunun 2 bayt kaydettiğini de unuttum ...
Kaiido

@Neil, emin değilim, işte 8bit bir dizi var, belki 32 bit, bunu yapabilir, ama daha fazla karakter alacak ...
Kaiido

1
4 bayt kazandırır:(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

İşlem, 124 118 117 bayt

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

Kullanımı:

Not: Bu kod en çok görüntüleri destekleyebilir 400px(değişiklikler aynı bytecount için 999'a kadar destekleyebilir). Herhangi bir "artık" alanı siyah renkte olacaktır, bu nedenle en iyi sonucu elde etmek için görüntü boyutunun koddaki boyutlarla aynı boyutta olması gerekir (ayrıca size()güncellenen boyutlarla değiştirilmesi gerekir)

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

görüntü tanımını buraya girin

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

görüntü tanımını buraya girin

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 bayt

YiiYiY~1YG

açıklama

Bu temelde mevcut Octave çözümü ile aynı cevaptır : Her iki görüntünün dosya adlarını veya URL'lerini girdi olarak alır ve sonucu ekranda görüntüler.

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

kullanım

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

1
Bu 10 bayttır.
Outgolfer Erik,

3

Perl, 260 bayt

251 bayt kod için + 9 bayt -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'in bu meydan okuma için en iyi dil olduğundan emin değilim, ancak @ orlp'nin yorumunun görüntüsünün ne olduğunu bilmek istedim. Ve bu grafik modülleri biraz kullanmamı sağlıyor, bu iyi bir şey. Ve kodlamayı çok sevdim!

Daha okunaklı bir sürüm:

Imager kullanın ; 
$ img1 = yeni Görüntüleyici ( dosya => $ ARGV [ 1 ] ); 
$ img2 = yeni Görüntüleyici ( dosya => $ ARGV [ 0 ] );   

için $ x ( 0 .. $ img1 -> GetWidth (-) 1 ) { için $ y ( 0 .. $ img1 -> GetHeight () - 1 ) { ( $ r1 , $ G1 , $ b1 ) = $ img1 - > GetPixel ( x => $ x , y => $ y , tip => "8-bit" ) -> RGBA (); ( $ r2 , $ g2    
        
       
    , $ B2 ) = $ img2 -> GetPixel ( X => $ x , y => $ y , tip => "8-bit" ) -> RGBA (); 
    $ r = $ r1 ^ $ r2 ? 0 : 255 ; 
    $ g = $ g1 ^ $ g2 ? 0 : 255 ; 
    $ b = $ b1 ^ $ b2 ? 0 : 255 ; 
    $ img1               -> setpixel ( x => $ x , y => $ y , renk => [ $ r , $ g , $ b ] ); } } 
$ img1 -> yazma ( dosya => 'a.png' )  
    
  

Denemek istiyorsanız, Görüntüleyici'yi yüklemeniz gerekir, ancak oldukça basittir: sadece (echo y;echo) | perl -MCPAN -e 'install Imager'terminalinizde çalıştırın .


3

LÖVE2D , 199 bayt

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

Yeterince basit, komut satırında iki resim dosyası çeker, "Z" adlı bir dosyayı Sevgi dizinine çıkarır. Ayrıca tam renkli görüntüler için de çalışır!


1
@MDXF love2d.org
ATaco

2

J, 54 bayt

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

Her birinin bmpbiçimindeki bir giriş görüntüsünün yolu olduğu iki argüman alır . Her görüntü 24 bit RGB tam sayılarının bir matrisi olarak okunur ve 8 bit RGB değerlerinin üçlüsüne ayrıştırılır, her birinin işareti alınır ve iki matris birlikte XOR'dur. Sonuç daha sonra 255 ile ölçeklenir, taban 256 sayısının üçlüsünden bir tamsayıya dönüştürülür ve bmpadlı bir çıktı dosyasına yazılır o.


2

C, 189 bayt

#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 görüntülerde çalışır. f(a, b, out)Hem girdi dosyalarının hem de çıktı dosyasının adlarını arayın .

Varsayımlar:

  • Her iki giriş görüntüsü başlığı aynıdır (boşluk dahil) ve 9 * sizeof(int)karakterlerden daha az .

  • Sızan dosyaları temizleyen ve kapatan hoş bir işletim sistemindeyiz.

  • EOF == -1

Ungolfed ve açıkladı: (ters eğik çizgi ihmal)

// 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 (özel bükme), 149 bayt

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

Hala PBM dosyaları kullanıyor, ancak şimdi:

  • Görüntünün bir piksel yüksekliğinde ve 8 piksel genişliğinde veya altında olması gerekir, çünkü PBM bir baytta 8 piksel barındırır.

  • Üstbilgi 7 bayt olmalıdır (örneğin P4 8 1boşluklu).

Her iki dosya da tbaşlıklarıyla doldurulurken ileride aranır, daha sonra son baytlar okunur, yazılır ve yazılır. Başlıktaki üç işlemin tümünü aynı makronun arkasına yerleştirmek için benzer parametre listelerinden faydalanır freadve fwritebunlara sahip olur.


2

R, 45 bayt

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

ave biki görüntü dosyasının dosya adlarını gösterir.

Örnek:

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

Çıktı:

görüntü tanımını buraya girin


2

İşlem, 82 bayt

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

Suiistimaller İşleme'nin gerçekten herhangi bir XORing yapmaktan kaçınmak için kapsamlı çizim fonksiyonları. İki görüntüyü DIFFERENCEmodla birlikte harmanlar ve bunları ekrana çizer.

kullanım

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

Güzel golf! Bu kullanılan Gerçekten çok zekice 32yerine DIFFERENCE. Golf oynamak için iyi bir ipucu olurdu: codegolf.stackexchange.com/questions/26809/… :)
Kritixi Lithos

2

C #, 233 bayt

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

Bilinmeyen6656'ya, komut satırı argümanlarının gerekli olmadığı ipucu için teşekkürler. Program şimdi "a" ve "b" dosyalarından okuyor ve "c" dosyasına "a" ile aynı formatta yazıyor. Bir hatayla da kapandı.

Renk aynıysa, aksi takdirde beyazsa, her pikseli siyaha ayarlar.

Baytları kurtarmak için, Bitmap'lerin Genişlik ve Yükseklik özelliklerini kontrol etmek yerine sınır istisnalarını yakalar. Her x sınırdan çıktığında, 0 olarak sıfırlanır ve y artırılır. Y sınırların dışına çıktığında, x 0 olur ve döngü, görüntüyü kaydedip çıkmak için kesilir.

Örnek csc kullanarak derleme ve mono kullanarak çalıştırma:

csc xor.cs

mono xor.exe

Belirteçleri (string[] v)ana bildirimin içine bırakabilirsiniz , çünkü C # açıkça bir uygulamanın çalıştırılmasına ihtiyaç duymaz
unknown6656

1

Clojure, 300 bayt

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

Keskin soygun Java cevabının . Meydan okumayı nasıl yapacağımı bilmiyordum ama Java çözümünün Clojure'a ne kadar iyi çevrildiğini merak ediyordum. Oldukça basitti. Yıpranmış kod aslında oldukça hoş.

Bu, ithalatı içeren ilk kod-golf mücadelesiydi. Bazı baytları kurtarmak için onları optimize etmenin bir yolu olabilir.

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 bayt

Muhtemelen bunu daha çok golf oynayabilirim.

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

Bunu aşağıdaki gibi komut satırından çalıştırın:

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

İşlev ismi değişkenlerini ilk oluşumlarında tanımlamak yardımcı olabilir: $i=imagecreatefrompng;$a=$i($argv[1])bir bayttan daha uzun $a=($i=imagecreatefrompng)($argv[1]). Ve iki renkli bir paletle resim paletlerini deneyebilirsiniz.
Titus,

İlk görüşte tanımlamaya çalıştım ama ölümcül bir hata almaya devam ettim. Vaktim olduğunda daha sonra tekrar deneyeceğim. Belki doğru yapmamışımdır.
Kodos Johnson

($f=func)(params)PHP 7 gerektirir.
Titus

@Titus ah tamam teşekkürler. Bu beni 3 byte indirdi.
Kodos Johnson

İşte 7 bayt daha: for(;$k<$w*$h;)ile for(;$y<$h;$y+=1/$w), $x=$k%$w, $y=$k++/$w ile $x, $yve son $xile değiştirin $x++. (herhangi bir makul resim boyutu için yuvarlama hatası olmadığını varsayarsak)
Titus

0

Node.js, 156 135 bayt

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

Giriş ve çıkış görüntü dosyaları , ilk satırın olduğu ve ikinci satırın boşluksuz b / w ascii değerleri olduğu PBM (P1) biçiminde olmalıdır P1 [width] [height].

İşte xor çıkışı izleyen giriş görüntüleri (32x32 piksel):

Giriş # 1 Giriş # 2 Çıktı

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.