Как написать новый декодер формата изображения в браузере Chrome

Браузеры плохо поддерживают форматы изображений. На самом деле поддерживаются только GIF, JPG, PNG и WebP.

Я хотел бы иметь новый: JBIG2

С точки зрения конечного пользователя, он только загрузит и установит расширение Chrome, а его браузер сможет декодировать новый формат изображения.

С точки зрения веб-разработчика, новый формат будет прозрачным и совместимым с тегами img, canvas и css. Для отображения изображений JBIG2 он по-прежнему использует:

<img src=“path/to/myImage.jbig2”>

или же

var myImage = new Image();
myImage.addEventListener( 'load', function() {
    // insert in canvas, when image is loaded
});
myImage.src = 'path/to/myImage.jbig2';

или же

.my-class {
    background-image: url( “path/to/myImage.jbig2”);
}

Проблема не в самом декодере. Я предполагаю использовать этот JBig2dec, написанный на языке Си.

Проблема в том, как реализовать новый декодер изображений? В Chrome, когда нам нужно запустить код на C, лучшим решением будет использование Native Client Extension.

И даже лучше, я могу прочитать на этой веб-странице NaCl:

Графика, аудио и многое другое: запуск модулей с собственным кодом, которые отображают 2D и 3D графику, воспроизводят аудио, реагируют на события мыши и клавиатуры, работают в нескольких потоках и имеют прямой доступ к памяти, и все это не требует от пользователя установки плагина.

Мультимедийные приложения. Кодеки для обработки звуков, изображений и фильмов можно добавить в браузер в модуле Native Client.

Но, к сожалению, нет ни документации, ни примера для реализации 2D графического декодера. Я просто думаю, что мне нужно зарегистрировать хук для изображения minetype/jbig2.

Кто-нибудь знает, как реализовать новый декодер формата изображения с NaCl?

1 ответ

Да, я думаю, что решение, которое вы описали, будет в основном работать, хотя вам может понадобиться загрузить изображение, используя <embed src="..." type="image/jbig2"> вместо <img>,

По сути, вы будете:

  1. Скомпилируйте декодер JBig2, используя Native Client SDK
  2. Добавьте точку входа плагина PPAPI. Смотрите любой из примеров в NaCl SDK или учебное пособие здесь.
  3. В своем производном классе Instance реализуйте виртуальную функцию HandleDocumentLoad. Эта функция будет вызываться, когда ваш плагин Native Client используется в качестве загрузчика mimetype. Вы можете использовать объект URLLoader, который передается для чтения вашего файла JBig2.
  4. Создайте контекст 2D-графики и отобразите в нем содержимое декодированного изображения. Взгляните на пример Graphics2D в NaCl SDK (examples/api/graphics2d).
  5. Создайте расширение Chrome, которое будет регистрироваться как обработчик mimetype для JBig2 Native Client (как вы уже нашли).
Другие вопросы по тегам