XOR दो मोनोक्रोम चित्र


28

चुनौती:

दो काले और सफेद (मोनोक्रोम) छवियों का इनपुट लें और पहले के प्रत्येक पिक्सेल को एक्सर करें, दूसरे के प्रत्येक पिक्सेल के साथ, उन्हें एक नई छवि में जोड़ें और नई छवि को आउटपुट करें।

कुछ स्पष्टीकरण:

तस्वीरों का आकार मायने नहीं रखता। एक्सटेंशन / छवि प्रारूप कोई फर्क नहीं पड़ता। आप इसे किसी भी एक्सटेंशन के इनपुट ले सकते हैं और किसी भी एक्सटेंशन को आउटपुट कर सकते हैं, जब तक कि एक्सटेंशन का उपयोग डिजिटल छवियों को संग्रहीत करने के लिए किया जाता है। यदि आप चाहें तो आउटपुट का चित्र बनाने के लिए आप ग्राफिक्स का उपयोग भी कर सकते हैं। अन्यथा, आउटपुट को फ़ाइल के रूप में सहेजें। इनपुट को छवि, या url के पथ के रूप में लिया जा सकता है।

एक चीज जो आप नहीं कर सकते हैं, वह है I / O सरणियाँ, जैसे। ट्रिपल (आर, जी, बी) के।

अल्फा के साथ छेड़छाड़ न करें । यह xored नहीं होना चाहिए, यह प्रत्येक पिक्सेल के लिए 255 (अधिकतम मूल्य) होना चाहिए।

आप प्रत्येक पिक्सेल का क्या मतलब है?

आपको इसे इस तरह से करने की आवश्यकता नहीं है, लेकिन दो पिक्सल एक्सआर में एक तरीका है कि आप अपने आरजीबी मान और एक्सआर आर 1 को आर 2, जी 1 के साथ जी 2, बी 1 को बी 2 के साथ लें और परिणाम लें, जो कि आपका नया रंग है

चूंकि हमारे पास केवल दो रंग हैं, जाहिर है जब रंग समान होते हैं तो परिणाम (0,0,0) होगा और जब वे अलग होंगे (सफेद 255,255,255 है और काला 0,0,0 है) इस मामले में, परिणाम होगा 255,255,255 हो।

इस प्रकार जब दो पिक्सेल अलग-अलग होते हैं, तो परिणाम एक सफेद पिक्सेल होता है, एक काला पिक्सेल

उदाहरण I / O:


इनपुट 1: इनपुट 2:

इनपुट 1 इनपुट 2


आउटपुट:

उत्पादन


यह इसलिए सबसे छोटा कोड जीतता है।


क्या हम एक URL के रूप में इनपुट छवि ले सकते हैं?
१५:११ पर कृति लीथोस

@KritiiLithos yup, मैंने इसे किसी भी अन्य दर्शकों के लिए चुनौती में संपादित किया।
पी। केंटिनो

5
बोनस चुनौती: i.imgur.com/a0M6o9e.png और i.imgur.com/bP1TsjQ.png
orlp


@orlp मैं क्यूआर कोड
क्रिति लिथोस

जवाबों:


20

एफएक्स एक्सप्रेशन लैंग्वेज (इमेजमैजिक), 8 4 निवाले

संपादन

  • करने के लिए सरलीकृत u!=v, -4 बाइट्स

जैसा कि "एफएक्स एक्सप्रेशन लैंग्वेज" स्पष्ट रूप से ट्यूरिंग है, मैंने अपना उत्तर फिर से तैयार कर लिया है (यह यूनिक्स शेल + इमेज मैजेंट था)।

golfed

u!=v

Fx बिटवेअर XOR का समर्थन नहीं करता है और न ही बिटवाइज़ नहीं , इसलिए मैंने !=इसके बजाय इसका उपयोग किया है (जो शुद्ध BW छवियों के लिए ठीक काम करता है)।

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

इनपुट और आउटपुट अंतर्निहित (दुभाषिया द्वारा नियंत्रित) हैं।

प्रयोग

ImageMagick कन्वर्ट उपयोगिता, "एफएक्स एक्सप्रेशन लैंग्वेज" दुभाषिया के रूप में कार्य करता है, जब -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

मैथेमेटिका, 37 34 15 बाइट्स

आधे से अधिक बाइट्स की संख्या में कटौती के लिए इयान मिलर का धन्यवाद!

ImageDifference

अंत में, हमेशा एक बिल्डिन होता है। यह फ़ंक्शन इनपुट के रूप में दो छवियों को लेता है और एक छवि को आउटपुट करता है; यह रंग चित्रों के लिए कुछ अधिक जटिल है, लेकिन काले और सफेद के लिए यह बिल्कुल XOR है।

पिछली प्रस्तुतियाँ:

3 बाइट्स बचाने के लिए JungHwan Min का धन्यवाद!

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

इनपुट के रूप में छवियों की एक जोड़ी (संगत आयामों की) लेता है, और एक प्रदर्शित छवि देता है। ImageDataसभी रैपर / मेटाडेटा के बिना केवल पिक्सेल डेटा मिलता है; दुर्भाग्य से यह वास्तविक संख्या देता है, इसलिए Chopउन्हें पूर्णांकों के रूप में व्यवहार में मदद करने के लिए आवश्यक है। BitXorवास्तव में यह टिन पर कहता है (और नेस्टेड सूचियों पर धागे), औरImage परिणामस्वरूप RGB को एक छवि में वापस बदल देता है।

मूल सबमिशन, जो URL की ऑर्डर की गई जोड़ी या किसी इनपुट का नाम लेता है:

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

4
द्विआधारी छवियों के लिए आप उपयोग कर सकते हैं ImageDifference[#,#2]&
इयान मिलर

10

जावा, 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
आप 7 बाइट्स को बचाने के लिए publicसे हटा सकते हैंpublic class M
Kritii Lithos

फ़ाइल एक्सटेंशन .pngआवश्यक नहीं होना चाहिए
हंट्रो

आप एक बाइट को बचा कर कर सकते हैं ... "i ++ <a.getHeight ();)"
ताताराइज़

9

पायथन, 64 60 57 बाइट्स

मैं गोल्फ के लिए नया हूँ इसलिए कुछ दया करो!

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

मुझे 7 बाइट बचाने के लिए @ ब्लेंडर और @ फीलटैक का शुक्रिया!


1
का उपयोग करते हुए from cv2 import*4 अक्षर बंद दाढ़ी चाहिए।
ब्लेंडर

1
यहां, अनाम जवाबों को फ़ंक्शन के उत्तर के लिए अनुमति दी जाती है, इसलिए आप d=:) को भी छोड़ सकते हैं, कर रहे हैं r=imreadऔर फिर rदो बार उपयोग करने से कम हो सकते हैं
FlipTack

7

ऑक्टेव, 43 38 34 बाइट्स

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

दोष के लिए धन्यवाद मुझे 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()?
१17

@flawr बेशक जो कुछ बाइट्स
बचाएगी

1
क्या आप इसके बजाय imread(a)~=imread(b)(या +(imread(a)~=imread(b))यदि तार्किक इनपुट की अनुमति नहीं है imshow) का उपयोग नहीं कर सकते xor(...)?
लुइस मेंडो

1
@LuisMendo धन्यवाद, मैं हमेशा आपकी टिप्पणियों से सीखता हूं!
rahnema1

7

जावास्क्रिप्ट (ईएस 6), 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">

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: कैनवास 2 डी संदर्भ में एक 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 अल्फा पर वापस आने के लिए दो छवियों xorपर एक काला आयत नहीं बना सकते हैं xor?
नील

@IsmaelMiguel, धन्यवाद, उपयोग करने के लिए इस्तेमाल नहीं किया गया था, withलेकिन गोल्फ के लिए काफी अच्छा लगता है ;; इसके अलावा, टेम्पलेट शाब्दिक भूल गया 2 बाइट्स बचाता है ...
काइदो

@ नहीं, मुझे यकीन नहीं है, यहां हमें एक 8bit सरणी मिली है, शायद 32 बिट्स के साथ, जो ऐसा कर सकती है, लेकिन यह अधिक
चार्ट लेगी

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

व्याख्या

यह मूल रूप से एक ही उत्तर है, मौजूदा ओक्टेव समाधान के रूप में : यह इनपुट के रूप में दोनों छवियों के फ़ाइल नाम या 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

पर्ल, 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')

मुझे यकीन नहीं है कि पर्ल इस चुनौती के लिए सबसे अच्छी भाषा है, लेकिन मैं जानना चाहता था कि @ orlp की टिप्पणी की छवि क्या थी। और यह मुझे उन ग्राफिक मॉड्यूल का थोड़ा सा उपयोग करता है, यह एक अच्छी बात है। और मुझे इसे कोड करने में मज़ा आया!

अधिक पठनीय संस्करण:

इमेजर का उपयोग करें ; 
$ 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 , टाइप => "8bit" ) -> rgba (); ( $ R2 ,    
        
       
     $ g2,
    $ img1$ b2 ) = $ img2 -> getpixel ( x => $ x , y => $ y , टाइप => "8bit" ) -> rgba (); 
    $ r = $ r1 ^ $ r2 ? 0 : 255 ; 
    $ g = $ g1 ^ $ g2 ? 0 : 255 ; 
    $ b = $ b1 ^ $ b2 ? 0 : 255 ; -> सेटपिक्सल (                x => $ x , y => $ y , रंग => [ $ r , $ g , $ b ]   ); } } 
$ img1 -> लिखना ( फ़ाइल => 'a.png' )
    
  

यदि आप इसे आज़माना चाहते हैं तो आपको इमेजर को स्थापित करना होगा, लेकिन यह काफी सरल है: बस (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" नामक एक फ़ाइल को आउटपुट करता है। पूर्ण रंग छवियों के लिए भी काम करता है!


1
@MDXF love2d.org
ATaco

2

जे, 54 बाइट्स

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

दो तर्कों को लेता है जहां प्रत्येक bmpप्रारूप में एक इनपुट छवि का मार्ग है । प्रत्येक छवि को 24-बिट आरजीबी पूर्णांकों के मैट्रिक्स के रूप में पढ़ा जाता है और 8-बिट आरजीबी मूल्यों के एक ट्रिपल में पार्स किया जाता है, प्रत्येक का संकेत लिया जाता है, और दो मैट्रिक्स एक साथ XOR'd हैं। परिणाम को 255 से घटाया जाता है, जो आधार संख्या के ट्रिपल से वापस एक पूर्णांक में परिवर्तित हो जाता है, और bmpनामांकित आउटपुट फाइल पर लिखा जाता है o


2

सी, 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 :)

सी (कल्पना-झुकने), 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

आर, 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/… :)
क्रिति लिथोस

2

सी #, 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 के लिए धन्यवाद। कार्यक्रम अब फ़ाइलों से पढ़ता है "ए" और "बी" और "सी" को "ए" के समान प्रारूप में दर्ज करने के लिए लिखता है। एक त्रुटि भी बंद।

यह प्रत्येक पिक्सेल को काला करने के लिए सेट करता है यदि रंग समान है, अन्यथा सफेद।

बाइट्स को बचाने के लिए, यह बिटमैप्स की चौड़ाई और ऊंचाई गुणों की जांच करने के बजाय सीमा अपवादों से बाहर निकलता है। हर बार x सीमा से बाहर चला जाता है और इसे 0 पर रीसेट किया जाता है, और y को बढ़ाया जाता है। जब y सीमा से बाहर जाता है, तो x 0 होता है और छवि को बचाने और छोड़ने के लिए लूप टूट जाता है।

उदाहरण csc का उपयोग कर संकलन करें और मोनो का उपयोग करके चलाएं:

csc xor.cs

mono xor.exe

आप (string[] v)मुख्य-घोषणा के अंदर टोकन गिरा सकते हैं , क्योंकि सी # को स्पष्ट रूप से एक आवेदन चलाने की आवश्यकता नहीं है
अज्ञात 6656

1

क्लोजर, 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"))))

जावा के उत्तर का धुंधलापन । मुझे नहीं पता था कि चुनौती कैसे करना है, लेकिन उत्सुक था कि जावा समाधान का क्लोजर में अनुवाद कितना अच्छा है। यह बहुत सीधा था। अस्वाभाविक कोड वास्तव में बहुत सुंदर है।

यह पहला कोड-गोल्फ चैलेंज था जो मैंने किया था जिसमें आयात शामिल था। शायद कुछ बाइट्स को बचाने के लिए उन्हें अनुकूलित करने का एक तरीका है।

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

पीएचपी, 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.
टाइटस

@ टिट्स आह ठीक है धन्यवाद। यह मुझे 3 बाइट्स नीचे ले गया।
कोडोस जॉनसन

यहाँ 7 अधिक बाइट्स हैं: बदलें for(;$k<$w*$h;)साथ for(;$y<$h;$y+=1/$w), $x=$k%$w, $y=$k++/$w साथ $x, $yऔर पिछले $xके साथ $x++। (यह मानते हुए कि किसी भी उचित छवि आकार के लिए कोई गोल त्रुटियाँ नहीं हैं)
टाइटस

0

नोड.जेएस, 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], और दूसरी लाइन बिना स्पेस के b / w ascii मान होती है।

यहाँ इनपुट चित्र हैं जिसके बाद xor आउटपुट (32x32 पिक्सेल) है:

इनपुट # 1 इनपुट # 2 उत्पादन

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.