2012-03-07 9 views
5

Editar: Tomando la sugerencia de dennmat en consideración, que han logrado simplificar mi imagen adquisición de la escritura hasta unas pocas líneas usando Image():¿Puedo leer datos binarios correctamente a través de 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); 
    } 
} 

Aunque esto funciona para Chrome y Firefox, esto no hace por IE9. La solución mencionada en el siguiente enlace no parece aplicarse a esta situación. Uncaught Error: SECURITY_ERR: DOM Exception 18 when I try to set a cookie

¿La función cors en Image() es compatible con IE9?


Me he encontrado con un pequeño problema.

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

La imagen de arriba es en realidad un archivo que contiene la cabecera png estándar, seguido de 255 bytes que van de 255 a 0 (dos veces). La idea era ver cómo maneja Internet Explorer 9 la recepción de datos binarios a través de una solicitud AJAX.

Así que, aquí está mi problema: me he dado cuenta de que cuando recibo un byte en el cliente que es mayor que 127, el valor predeterminado es 253. ¿Hay alguna forma de que IE lea los bytes extendidos con la correcta? ¿valores?

Algunas cosas para tomar nota de:

1) Nosotros no utilizan ningún tipo de marco Javascript. Es un requisito que hagamos esto solo con base en javascript.

2) La intención de este experimento es hacer una manera limpia de obtener una imagen para poder colocarla en un lienzo sin mancharla. A veces, estas imágenes provienen de nuestro servidor de imágenes alojado externamente, otras veces provienen de otro host sobre el que no tenemos control.

se adjunta a continuación es mi guión de pruebas:

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

¿Qué pasa con 'Image()'? Vea por ejemplo: https://developer.mozilla.org/es/Canvas_tutorial/Using_images – dennmat

+0

Básicamente se va a pegar un tiro en el pie tratando de manipular, administrar y dibujar datos de imagen en JS sin usar los navegadores incorporados utilidades para ello. Será realmente lento y probablemente encontrará innumerables problemas, especialmente una vez que obtenga transparencia y rotaciones. – dennmat

+0

Debí haber perdido el soporte cruzado de origen la última vez que miré Image(). ¡Gracias por el consejo! En cuanto a disparar mi pie, no estoy del todo seguro de lo que quiere decir con utilidades integradas en el navegador. Todo lo que pretendo hacer aquí es renderizar una imagen simple en un lienzo que se puede disparar al servidor. – Axle

Respuesta

5

Desafortunadamente, el uso del objeto de la imagen() con la propiedad crossOrigin ajusta a "Anónimo" todavía causado IE vea contaminado el lienzo una vez que la imagen se dibuja en la misma.

Para evitar esto, hice lo siguiente:

  1. he creado un pequeño script en mi servidor que acepta una URL, luego llama a file_get_contents() utilizando la URL dada a la misma. Para evitar el uso indebido de este script, agregué una lista de dominios "aceptables", así como también diseñé el URL resultante para que solo apuntara a las cosas que debería estar solicitando. Esto me permite hacer las solicitudes localmente, lo que significa que puedo usar el objeto XMLHttpRequest en lugar del objeto XDomainRequest. (que también abre la puerta para soportar IE7).

  2. Desde IE no soporta atob, he usado el script de conversión base64 encontrar aquí: How can you encode a string to Base64 in JavaScript? I comentada input = Base64._utf8_encode(input); en la función encode, ya que los datos era binario, y no una cadena real de caracteres.

Esta solución es un poco un "último recurso". Funciona, sin embargo es increíblemente lento (toma 3 minutos en lugar de los 3 segundos habituales).La peor parte de todo fue la necesidad de agregar un temporizador para darle a IE la oportunidad de renderizar correctamente el cuadro de diálogo personalizado y su barra de progreso. El temporizador obliga al IE a pausar un momento antes de realizar la siguiente solicitud. Esto es ... bastante extraño teniendo en cuenta que lo tengo configurado para hacer la solicitud de forma asíncrona.

Esto es lo mejor que pude hacer por el momento. Si alguien más tiene una mejor manera de hacer el trabajo, no dude en publicar sus respuestas.

Cuestiones relacionadas