2011-05-19 5 views
21

में दो छवियों की तुलना करें मैं यह निर्धारित करने की कोशिश कर रहा हूं कि जावास्क्रिप्ट में दो छवियां समान हैं (भले ही src urls अलग हैं)।जावास्क्रिप्ट

मेरा विशिष्ट उपयोग केस क्रोम एक्सटेंशन के भीतर है (हालांकि यह क्रोम एक्सटेंशन वास्तव में प्रश्न में कारक नहीं है)। मैं img src को 'chrome://favicon/'+url पर सेट करके क्रोम के आंतरिक डेटाबेस में संग्रहीत एक फेविकॉन पीएनजी का इमेज प्राप्त कर सकता हूं जहां यूआरएल वेबसाइट का वास्तविक यूआरएल है। हालांकि, अब मैं सभी अद्वितीय फेविकॉन ढूंढना चाहता हूं। यह देखते हुए कि सभी के पास आंतरिक डेटाबेस के लिए एक अलग यूआरएल होगा, क्या जावास्क्रिप्ट में छवियों की तुलना करने का कोई आसान तरीका है?

धन्यवाद

+2

यह संभवतः समीकरण में कारक है, क्योंकि ब्राउज़र में सामान्य जावास्क्रिप्ट की तुलना में आपके पास एक्सटेंशन के भीतर कहीं अधिक सुविधाएं और अनुमतियां हैं। – Orbling

उत्तर

27

नहीं, वहाँ कोई विशेष रूप से आसान तरीका यह है है। जावास्क्रिप्ट को निम्न स्तर के संचालन को संभालने के लिए नहीं बनाया गया था, जैसे छवि प्रसंस्करण के लिए बाइनरी डेटा के साथ सीधे काम करना।

आप use a <canvas> element to base64 encode each image कर सकते हैं, और उसके बाद परिणामी base64 तारों की तुलना करें, लेकिन यह केवल आपको बताएगा कि छवियां समान हैं या नहीं।

getBase64Image समारोह (उत्तर मैं जुड़ा हुआ में परिभाषित) का उपयोग करने के दो चित्रों की तुलना करने के लिए:

var a = new Image(), 
    b = new Image(); 
a.src = 'chrome://favicon/' + url_a; 
b.src = 'chrome://favicon/' + url_b; 

// might need to wait until a and b have actually loaded, ignoring this for now 
var a_base64 = getBase64Image(a), 
    b_base64 = getBase64Image(b); 

if (a_base64 === b_base64) 
{ 
    // they are identical 
} 
else 
{ 
    // you can probably guess what this means 
} 
+5

या उन्हें 2 कैनवास पर लिखें और प्रत्येक से पिक्सल की जांच करें और उन्हें किसी प्रकार के स्नैज़ी एल्गोरिदम से तुलना करें। लेकिन ईमानदारी से यह बहुत मुश्किल लगता है। –

+0

मुझे लगता है कि आपने इसे दबाया - "आपको बताएं कि छवियां समान हैं या नहीं -" यह नहीं है कि वे क्या हैं;) –

+0

+1 इस उत्तर के लिए। nude.js के समान कुछ क्लाइंट साइड/जावास्क्रिप्ट पर प्राप्त हो सकता है http://davidwalsh.name/nudejs – kjy112

7

मैं आप इस जावास्क्रिप्ट में रुचि हो सकती लगता है पुस्तकालय resemble.js कहा जाता है जो: "analyses and compares images with HTML5 canvas and JavaScript"।

7

हमने अभी हल्की लाइब्रेरी RembrandtJS जारी की है, जो ठीक है और यह एचटीएमएल 5 कैनवास 2 डी एपीआई के साथ-साथ ड्रॉप-इन नोड.जेएस प्रतिस्थापन नोड-कैनवास के माध्यम से सर्वर पर दोनों ब्राउज़र में भी काम करता है। यह छवि स्रोत के रूप में दोनों धब्बे और यूआरएल को स्वीकार करता है तो आप बस ऐसा कर सकता है:

const rembrandt = new Rembrandt({ 
    // `imageA` and `imageB` can be either Strings (file path on node.js, 
    // public url on Browsers) or Buffers 
    imageA: 'chrome://favicon/' + url_a, 
    imageB: 'chrome://favicon/' + url_b, 

    thresholdType: Rembrandt.THRESHOLD_PERCENT, 

    // The maximum threshold (0...1 for THRESHOLD_PERCENT, pixel count for THRESHOLD_PIXELS 
    maxThreshold: 0, 

    // Maximum color delta (0...255): 
    maxDelta: 0, 

    // Maximum surrounding pixel offset 
    maxOffset: 0, 

}) 

// Run the comparison 
rembrandt.compare() 
    .then(function (result) { 

    if(result.passed){ 
     // do what you want 
    } 
    }) 

आप Rembrandt यदि आप डोमेन रंग या पिक्सेल अंतर के संबंध में कुछ छूट की आवश्यकता भी है, तो आप दहलीज मूल्यों को पेश करने की अनुमति देता है सकते हैं । चूंकि यह ब्राउज़र और सर्वर (नोड) दोनों में काम करता है, इसलिए यह आपके परीक्षण सूट में एकीकृत करना आसान बनाता है।

+0

बहुत बढ़िया! यह चमत्कार करता है। अन्य विधियां बहुत धीमी थीं। –

+0

मैं इसे काम पर नहीं ला सकता हूं। मैं बस परीक्षण करना चाहता हूं, अगर यह छवि बिल्कुल वही दिखती है या नहीं। आप यहां मेरी परीक्षा देख सकते हैं: http://cdn.axiell.com/~dev/gota/image-test/html-template.html। यह परीक्षण करने के लिए काफी सीधे और सरल कोड है। लेकिन अगर ये छवियां समान हैं, तो नतीजा यह है कि वे नहीं हैं। – JoakimB