2012-08-09 5 views
19

Ich arbeite an etwas Javascript-Code, der eine Alpha-Maske eines Bildes mit Pfaden von Photoshop eingebettet erstellt. Der Onload-Handler eines IMG-Tags würde einen Clip aufrufen (dies). Die Funktion lädt die Quelldatei des Bildes und durchsucht sie. Hier ist das Setup:Wie liest man Binärdaten in IE9?

function clip(img) { 
    var xhr = new XMLHttpRequest(); 
    xhr.open('GET', img.src, true); 
    xhr.responseType = 'arraybuffer'; 
    xhr.target = img; 

    xhr.onload = function(e) { 
     var bytes = new Uint8Array(this.response); 
     var p = findPhotoshopSegment(bytes); 
     if(p) { 
      var paths = parse8BIMData(bytes, p); 

      /* ... replaces IMG with SVG tag ... */ 
     } 
    }; 
    xhr.send(); 
} 

Sie können den Code in Aktion bei http://flaczki.net46.net/JPEG/SVG.html

Derzeit sehen, es funktioniert nur in Firefox, Chrome und Safari. Es funktioniert nicht in IE9. Der Browser unterstützt SVG, aber nicht Uint8Array. Gibt es eine Art Workaround?

+0

Verwenden Sie Google Chrome Frame auf der Seite https://developers.google.com/chrome/chrome-frame/ –

+0

"Es funktioniert nicht in IE9" ist keine Fehlermeldung - wenn Sie mit dem spielen möchten scharfes Messer dann müssen Sie wirklich etwas von der Arbeit selbst tun. – symcbean

Antwort

27

Ich hatte dasselbe Problem beim Spielen mit pdf.js-Bibliothek, und die Lösung, die ich gefunden habe, ist meine eigene Uint8Array, unten ist Code, den Sie brauchen. Alle Gutschriften geht an notmasteryet @github und vollständige Code kann hier https://gist.github.com/1057924

(function() { 
    try { 
    var a = new Uint8Array(1); 
    return; //no need 
    } catch(e) { } 

    function subarray(start, end) { 
    return this.slice(start, end); 
    } 

    function set_(array, offset) { 
    if (arguments.length < 2) offset = 0; 
    for (var i = 0, n = array.length; i < n; ++i, ++offset) 
     this[offset] = array[i] & 0xFF; 
    } 

    // we need typed arrays 
    function TypedArray(arg1) { 
    var result; 
    if (typeof arg1 === "number") { 
     result = new Array(arg1); 
     for (var i = 0; i < arg1; ++i) 
     result[i] = 0; 
    } else 
     result = arg1.slice(0); 
    result.subarray = subarray; 
    result.buffer = result; 
    result.byteLength = result.length; 
    result.set = set_; 
    if (typeof arg1 === "object" && arg1.buffer) 
     result.buffer = arg1.buffer; 

    return result; 
    } 

    window.Uint8Array = TypedArray; 
    window.Uint32Array = TypedArray; 
    window.Int32Array = TypedArray; 
})(); 
+0

Ausgezeichnet! Jetzt funktioniert mein Code auch im IE. Das war eine nette schlüsselfertige Lösung. Vielen Dank. – cleong

+0

@Milan Jaric Ich habe versucht mit Ihrem Code, aber ich kann es nicht zur Arbeit bekommen. kannst du mir zeigen, wie ich das verwenden würde, um meine Uint8Array zu ersetzen, die nicht auf Safari funktioniert .. danke ... hier ist mein Code. var frequencyData = neu Uint8Array (analyser.frequencyBinCount); Hier ist meine Frage: http://StackOverflow.com/Questions/31629868/Web-Audio-Analyser-Not-Working-in-Safari – Sarah

+0

Könnten Sie bitte Fehler von Safari-Konsole melden? Es ist schwer zu sagen, was das Problem ist, weil ich kein IOS habe, um deinen Code zu testen. –

6

gefunden werden, wenn Sie sicher sein möchten, dass Sie breiteres Spektrum an Kompatibilität erhalten, können Sie auch die compatibility.js Datei im PDF enthalten können .js Verteilung unter dem "Web" -Verzeichnis. Holen Sie PDF.js von Mozilla Github, dekomprimieren Sie das Zip-Archiv und fügen Sie die Datei compatibility.js aus dem obigen Verzeichnis hinzu. Es macht auch PDF.js-Bibliothek arbeiten in z. IE9

+0

Haben Sie Ideen zur Verwendung von PDF.js auf Windows Phone? Ich habe schreckliche Probleme beim Zugriff auf XHR, wo ich 'Zugriff verweigert' bekomme. Ich recherchiere immer noch und probiere verschiedene Pfade aus, aber hoffentlich kannst du mir ein paar Tipps geben, wie man es mit wp8.1 benutzt – Thierry