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