使用Javascript解码JPEG2000位图图像[已关闭]

g2ieeal7  于 2023-01-08  发布在  Java
关注(0)|答案(3)|浏览(203)

我们不允许问题寻求有关书籍、工具、软件库等的推荐。你可以编辑问题,以便可以使用事实和引用来回答问题。
昨天关门了。
社区昨天讨论了是否重新讨论此问题,并将其关闭:
原始关闭原因未解决
Improve this question
我在FileApi中使用HTML5技术。
我有一个DicomFile,我用HTML5的FileApi把它分解,得到所有的信息,最后得到一个字节数组的图像数据,问题是我不能解码一个JPEG2000的图像并在浏览器中显示(Chrome、FireFox、任何).比如图像数据是JPEG格式编码的,我在浏览器中显示图像完全没有问题,但问题是JPEG2000或JPEG-LS。我知道这些图像格式不能在Web浏览器中显示,但它必须存在一个Javascript库来解码JPEG2000或JPEG-LS中的图像数据。

ufj5ltwl

ufj5ltwl1#

由于JPEG 2000图像不能在浏览器中本地呈现,你可能需要在网页上使用之前将它们转换成浏览器可以呈现的格式。最简单的方法是在服务器端将图像转换成一些网页安全的格式,然后将转换后的图像提供给浏览器。但是,如果你决定在客户端进行转换,下面是一个使用JavaScript解码JPEG 2000图像的示例:https://github.com/kripken/j2k.js/blob/master/examples/simple.html.
这是使用OpenJPEG库的JavaScript编译实现的,here可用。这是一个自动转换,使用起来并不好,但他们提供了以下函数,使其使用起来更容易:

// 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;
}

此处data应为JavaScript字节数组(以及值在0到255之间的JavaScript数字,包括0和255),就像example file中那样。您可以通过将图像转换到这个表单服务器端,或者将它们Ajax化并将响应视为二进制数据来获得(至少在Firefox上可以看到MDN's using XHR's,其他浏览器可能需要different methods).这个函数的输出被放入一个Canvas元素中,如下所示:

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);

由于使用了Canvas元素,这意味着它在IE8中不起作用,但也可以做一些其他的事情。例如,你可以尝试将转换后的图像数据转换为位图格式或其他简单的IE兼容格式,base64编码,然后将其作为图像元素的源代码,请参阅http://css-tricks.com/data-uris/了解如何使用类似的数据url。

1mrurvl1

1mrurvl12#

我相信pdf.js项目可以解码压缩在pdf文件中的jpeg2000图像,请看这条评论和这条推特。
希望有帮助。

bxjv4tth

bxjv4tth3#

这个https://www.npmjs.com/package/jpeg2000应该有助于代码流-基于Mozilla的PDF.js源代码。

相关问题