Como las imágenes JPEG 2000 no se representan de forma nativa en los navegadores, es probable que deba convertirlas en algo que los navegadores puedan reproducir antes de usarlas en una página web. La forma más fácil de hacer esto sería simplemente convertir el lado del servidor de imágenes a algún formato seguro para la web y luego servir las imágenes convertidas al navegador. Sin embargo, si está decidido a hacerlo desde el lado del cliente, entonces hay un ejemplo de uso de JavaScript para decodificar imágenes JPEG 2000 aquí: https://github.com/kripken/j2k.js/blob/master/examples/simple.html.
Esto funciona usando una compilación de JavaScript de la biblioteca OpenJPEG, disponible here. Esto se trata de una conversión automática no es la más agradable de usar, pero que suministran la siguiente función hace es utilizar un poco más fácil:
// Wrapper around OpenJPEG..
//Converts the given j2k image array to RGB values that
//can be put into a Canvas..
function j2k_to_image(data) {
run();
_STDIO.prepare('image.j2k', data);
callMain(['-i', 'image.j2k', '-o', 'image.raw']);
return _STDIO.streams[_STDIO.filenames['image.raw']].data;
}
Aquí data
se espera que sea matriz de JavaScript de bytes (así los números de JavaScript con valores entre 0 y 255 inclusive) como en el example file. Puedes obtener esto convirtiendo las imágenes a este lado del servidor de formularios, o Ajaxing y tratando la respuesta como datos binarios (ver MDN's using XHR's sobre cómo hacer esto para Firefox al menos, otros navegadores probablemente necesiten different methods). El resultado de esta función se pone entonces en un elemento Canvas de este modo:
output = j2k_to_image([255, 0, 123, ...]); //pass in the JPEG 2000 image as an array
var canvas = document.getElementById('canvas'); //get the canvas element (use whatever you actually need here!)
canvas.width = imageWidth;
canvas.height = imageHeight;
var ctx = canvas.getContext('2d');
var image = ctx.getImageData(0, 0, canvas.width, canvas.height);
var componentSize = canvas.width*canvas.height;
for (var y = 0; y < canvas.height; y++) {
for (var x = 0; x < canvas.width; x++) {
var value = output[y*canvas.width + x];
var base = (y*canvas.width + x)*4;
image.data[base + 0] = output[0*componentSize + y*canvas.width + x];
image.data[base + 1] = output[1*componentSize + y*canvas.width + x];
image.data[base + 2] = output[2*componentSize + y*canvas.width + x];
image.data[base + 3] = 255; //the alpha part..
}
}
ctx.putImageData(image, 0, 0);
Dado que este utiliza el elemento Canvas significa que esto no funcionará en IE8, pero para que tal vez sería posible hacer algo más. Por ejemplo, podría intentar obtener los datos de imagen convertidos en el formato correcto para un mapa de bits u otro formato simple compatible con IE, base64 codificándolo y luego insertándolo como fuente de un elemento de imagen; consulte http://css-tricks.com/data-uris/ para ver ejemplos de cómo usar datos URLs como esta.
¡Muchas gracias! ¡He probado esa biblioteca de JavaScript (J2K.js) y funcionó perfecto! el problema era solo con una imagen de tamaños inferiores a 1 MB, si el tamaño es mayor, no funcionará. Debido a que estamos usando una imagen DICOM (tamaño de 5 MB en J2K), no funciona bien para nosotros. Pero intentaré usar AJAX. Gracias de nuevo. – user1211709
No hay problema. Espero que hayas logrado arreglarlo! Por cierto, si lo encuentra útil, ¡es una buena práctica votarlo! ;-) –
Tenga en cuenta que la URL de la biblioteca j2k.js ha cambiado.Edité la respuesta, pero sospecho que todavía hay trabajo por hacer. –