Emscripten передает массив uint8_t в javascript?

Попытка отобразить буфер данных изображения uint8_t* rgb на холсте HTML, который был обработан в C через WASM.

В C у меня есть следующий внешний метод:

extern void JS_DisplayRenderData(uint8_t* data, int dataLength);

Затем я вызываю внешний метод следующим образом:

int size = 1280 * 720 * 3;
uint8_t data[size];
memset(data, 255, size);
JS_DisplayRenderData(data, size);

Затем в javaScript я пытаюсь отобразить буфер следующим образом:

if (typeof mergeInto !== 'undefined') mergeInto(LibraryManager.library,
{
    JS_DisplayRenderData: function(data, dataLength)
    {
        alert("Data Length: " + dataLength);
        var c = document.getElementById("canvas");
        var ctx = c.getContext("2d");
        var imgdata = ctx.getImageData(0, 0, c.width, c.height);
        var imgdatalen = imgdata.data.length;
        var i2 = 0;
        for (var i = 0; i < (imgdatalen / 4); i++)
        {
            imgdata.data[4*i] = data[i2];    // RED (0-255)
            imgdata.data[4*i+1] = data[i2+1];    // GREEN (0-255)
            imgdata.data[4*i+2] = data[i2+2];    // BLUE (0-255)
            imgdata.data[4*i+3] = 255;  // APLHA (0-255)
            i2 += 3;
        }
        ctx.putImageData(imgdata, 0, 0);
    }
});

Однако все, что я получаю, это черные пиксели, хотя все они должны быть белыми.

extern... и доступ к данным через индекс непосредственно на стороне JS? Не могли бы вы прикрепить полный исходный код, включая ваши команды emcc, использование макросов Emscripten в файлах C и файл JS? Для меня этот код не должен ни запускаться, ни даже компилироваться.

Bumsik Kim 01.04.2019 01:39

Нашел проблему. Просто нужно "var a = HEAPU8.subarray(data);". Разместим дополнительную информацию в ответе.

zezba9000 01.04.2019 02:05
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
2
2
1 232
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нашел ответ на следующий вопрос: Структурные операции в Javascript через Emscripten

Просто нужно было указать, какой тип буфера был через: "var a = HEAPU8.subarray(data);"

Метод, который я использую для вызова JS через C, можно найти: Webassembly вызывает методы JavaScript из wasm, т.е. в коде C++

Другие вопросы по теме