2012-03-07 13 views
5

संपादित करें:क्या मैं XDomainRequest के माध्यम से ठीक से बाइनरी डेटा पढ़ सकता हूं?

window.onload = function(){ 
    var img; 
    capture_canvas   = document.createElement('canvas'); 
    capture_canvas.width = 1000; 
    capture_canvas.height = 1000; 
    document.documentElement.appendChild(capture_canvas); 
    img = new Image(); 
    img.crossOrigin = "Anonymous";   
    img.src = "http://www.shangalulu.com/get_resource_no_64.php?url=http://www.shangalulu.com/users/1196739508/post/41-1330377498/41-1330377498_thumb.jpg"; 
    img.onload = function() { 
     var context, canvas_img; 
     context = capture_canvas.getContext('2d'); 
     context.drawImage(img, 0, 0, 255, 255); 
     canvas_img = context.getImageData(0, 0, capture_canvas.width, capture_canvas.height); 
    } 
} 

इस Chrome और Firefox के लिए काम करता है, इस IE9 के लिए नहीं करता है: को ध्यान में dennmat के सुझाव ले रहा है, मैं Image() का उपयोग कर कुछ लाइनें करने के लिए नीचे स्क्रिप्ट प्राप्त मेरी छवि को आसान बनाने में कामयाब रहे। निम्नलिखित लिंक में उल्लिखित समाधान इस स्थिति पर लागू नहीं होता है। Uncaught Error: SECURITY_ERR: DOM Exception 18 when I try to set a cookie

क्या कोर Image() आईई 9 द्वारा समर्थित है?


मैं एक छोटी सी समस्या में भाग गया है।

http://www.shangalulu.com/get_resource_no_64.php?url=http://www.shangalulu.com/resources/images/sample/sample.png

ऊपर छवि वास्तव में एक फ़ाइल है कि मानक png हेडर शामिल है, 255 बाइट्स 0 (दो बार) करने के लिए नीचे 255 से जा रहा द्वारा पीछा किया है। विचार यह देखने के लिए था कि कैसे इंटरनेट एक्सप्लोरर 9 ने AJAX अनुरोध के माध्यम से बाइनरी डेटा प्राप्त किया।

तो, यहां मेरी समस्या है: मैंने देखा है कि जब मुझे 127 से अधिक क्लाइंट पर बाइट प्राप्त होता है, तो मान 253 तक डिफ़ॉल्ट हो जाता है। क्या आईई को विस्तारित बाइट्स को सही से पढ़ने के लिए कोई तरीका है मान?

कुछ बातें ध्यान देने के लिए:

1) हम जावास्क्रिप्ट ढांचे किसी भी प्रकार का उपयोग नहीं करते। यह एक आवश्यकता है कि हम केवल नंगे हड्डियों जावास्क्रिप्ट के साथ ऐसा करते हैं।

2) इस प्रयोग का उद्देश्य छवि प्राप्त करने के लिए एक साफ तरीका बनाना है ताकि मैं इसे बिना किसी बगैर कैनवास पर रख सकूं। कभी-कभी ये छवियां हमारे बाहरी रूप से होस्ट किए गए छवि सर्वर से आती हैं, दूसरी बार यह किसी अन्य होस्ट से आती है जिसका हमारा कोई नियंत्रण नहीं होता है।

नीचे संलग्न मेरी परीक्षण स्क्रिप्ट है:

var request; 
window.onload = function(){ 
    request = new XMLHttpRequest(); 
    if (window.XDomainRequest) { 
     request = new XDomainRequest(); 
    } 
    request.open('GET', 
     "http://www.shangalulu.com/get_resource_no_64.php?url= 
     http://www.shangalulu.com/resources/images/sample/sample.png", true); 
    request.onload = function() 
    { 
     var binary, i, response; 
     response = this.responseText; 
     binary = ""; 
     if (this.contentType) 
     { 
      document.documentElement.appendChild(
       document.createTextNode(this.contentType)); 
      document.documentElement.appendChild(document.createElement('br')); 
     } 
     for(i=0; i < response.length; i++) { 
      binary = "Line " + (i) + " --> " + ((response.charCodeAt(i)) & 0xff); 
      document.documentElement.appendChild(document.createTextNode(binary)); 
      document.documentElement.appendChild(document.createElement('br')); 
     } 
    }; 
    request.send(); 
} 
+1

'छवि()' के साथ क्या गलत है? उदाहरणों के लिए देखें: https://developer.mozilla.org/en/Canvas_tutorial/Using_images – dennmat

+0

आप अनिवार्य रूप से अंतर्निहित ब्राउज़र में उपयोग किए बिना जेएस में छवि डेटा में हेरफेर, प्रबंधन और ड्रा करने की कोशिश कर रहे पैर में खुद को शूटिंग करने जा रहे हैं। इसके लिए उपयोगिताओं। यह वास्तव में धीमा होगा और आप अनगिनत मुद्दों का सामना करेंगे, खासकर जब आप पारदर्शिता और घूर्णन में आ जाएंगे। – dennmat

+0

मैंने छवि() पर पिछली बार क्रॉस मूल समर्थन को याद किया होगा। पारितोषिक के लिए धन्यवाद! मेरे पैर को बंद करने के लिए, मैं पूरी तरह से निश्चित नहीं हूं कि ब्राउज़र अंतर्निर्मित उपयोगिताओं का क्या मतलब है। मैं बस इतना करना चाहता हूं कि एक कैनवास पर एक साधारण छवि प्रस्तुत करें जिसे सर्वर पर निकाल दिया जा सके। – Axle

उत्तर

5

दुर्भाग्य से, crossOrigin संपत्ति को "बेनामी" सेट अभी भी साथ छवि() वस्तु का उपयोग कर की वजह से आईई कैनवास को कलंकित करने के लिए एक बार छवि यह पर तैयार की गई थी।

इस के आसपास पाने के लिए, मैं निम्नलिखित किया:

  1. मुझे लगता है कि एक यूआरएल को स्वीकार करता है अपने सर्वर पर एक छोटे से स्क्रिप्ट बनाने के लिए, तो file_get_contents कॉल() यूआरएल यह करने के लिए दिया इस्तेमाल करते हैं। इस स्क्रिप्ट के दुरुपयोग को रोकने के लिए, मैंने "स्वीकार्य" डोमेन की एक सूची में जोड़ा, साथ ही परिणामस्वरूप यूआरएल को केवल उन चीजों को इंगित करने के लिए तैयार किया जिनके लिए अनुरोध किया जाना चाहिए। यह मुझे स्थानीय रूप से अनुरोध करने देता है, जिसका अर्थ है कि मैं XDomainRequest ऑब्जेक्ट के बजाय XMLHttpRequest ऑब्जेक्ट का उपयोग कर सकता हूं। (जो आईई 7 का समर्थन करने के लिए दरवाजा खुलता है)।

  2. के बाद से आईई atob का समर्थन नहीं करता, मैं इस्तेमाल किया base64 रूपांतरण स्क्रिप्ट मिली: How can you encode a string to Base64 in JavaScript? मैं, encode समारोह में बाहर input = Base64._utf8_encode(input); टिप्पणी की के रूप में डेटा द्विआधारी था, और नहीं पात्रों में से एक वास्तविक स्ट्रिंग।

यह समाधान एक "अंतिम उपाय" का थोड़ा सा है। यह काम करता है, हालांकि यह अविश्वसनीय रूप से धीमा है (सामान्य 3 सेकंड के बजाय 3 मिनट लेता है)।आईई को कस्टम डायलॉग बॉक्स और इसकी प्रगति पट्टी को सही तरीके से प्रस्तुत करने का मौका देने के लिए टाइमर में जोड़ने का सबसे बुरा हिस्सा था। टाइमर अगले अनुरोध करने से पहले आईई को एक पल रोकने के लिए मजबूर करता है। यह है ... बल्कि इस बात पर अजीब बात है कि मैंने अनुरोध को असंकालिक रूप से अनुरोध करने के लिए सेट किया है।

यह सबसे अच्छा है जिसके लिए मैं अभी आ सकता हूं। अगर किसी और के पास नौकरी पाने का बेहतर तरीका है, तो अपने उत्तरों को पोस्ट करने में संकोच न करें।

संबंधित मुद्दे