Декодировать изображение битового массива JPEG2000 с помощью Javascript

Я использую технологию HTML5 с FileApi.

Моя проблема очень проста, но я ищу 2 дня назад и ничего не нашел в Интернете.

У меня есть Дикомфайл. Я использую FileApi из HTML5, чтобы разбить его и получить всю информацию. Наконец, я получаю данные изображения в массиве байтов. Проблема в том, что я не могу декодировать изображение JPEG2000 и показать его в браузере (Chrome, FireFox, любой). Например, если данные изображения закодированы в формате JPEG, у меня нет проблем с отображением изображения в браузере, но проблема возникает с JPEG2000 или JPEG-LS. Я знаю, что эти форматы изображений не могут отображаться в веб-браузерах, но должна существовать библиотека в Javascript для декодирования данных изображения в формате JPEG2000 или JPEG-LS. Это очень важно, и я немного в отчаянии.

Если я не смогу найти способ сделать это, мне придется изменить всю свою работу.

заранее большое спасибо


person user1211709    schedule 15.02.2012    source источник


Ответы (2)


Поскольку изображения JPEG 2000 изначально не отображаются в браузерах, вам, вероятно, придется преобразовать их во что-то, что браузеры могут отображать, прежде чем использовать их на веб-странице. Самый простой способ сделать это — просто преобразовать серверную часть изображений в какой-либо веб-безопасный формат, а затем передать преобразованные изображения в браузер. Однако, если вы решили сделать это на стороне клиента, тогда есть пример использования JavaScript для декодирования изображений JPEG 2000 здесь: https://github.com/kripken/j2k.js/blob/master/examples/simple.html.

Это работает с использованием компиляции JavaScript библиотеки OpenJPEG, доступной здесь. Это автоматическое преобразование, которое не очень удобно использовать, но они предоставляют следующую функцию, которая немного упрощает его использование:

// 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 (ну, числа JavaScript со значениями от 0 до 255 включительно), как в пример файла. Вы можете получить это, преобразовав изображения в эту форму на стороне сервера или используя Ajax и обработав ответ как двоичные данные (см. MDN использует XHR о том, как это сделать по крайней мере для Firefox, другим браузерам, вероятно, понадобится различные методы). Затем вывод этой функции помещается в элемент 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-адреса данных.

person Mark Rhodes    schedule 14.03.2012
comment
Большое тебе спасибо! Я пробовал эту библиотеку JavaScript (J2K.js) и работал отлично! проблема была только с изображением размером менее 1 МБ, если размер больше, это не сработает. Поскольку мы используем образ DICOM (размер 5 МБ в формате J2K), он не работает для нас. Но я попробую использовать AJAX. Еще раз спасибо. - person user1211709; 21.03.2012
comment
Без проблем. Надеюсь, вам удалось это исправить! Кстати, если вы нашли это полезным, проголосуйте за него - хорошая практика! ;-) - person Mark Rhodes; 21.03.2012
comment
Обратите внимание, что URL-адрес библиотеки j2k.js изменился. Я отредактировал ответ, но подозреваю, что еще есть над чем работать. - person Ori Pessach; 19.06.2014

Я считаю, что проект pdf.js может декодировать изображения jpeg2000, сжатые в файле PDF. См. этот комментарий и этот твит.

Надеюсь, поможет.

person Serge    schedule 01.03.2012