Запись двоичных данных html5 FileWriter

Я использую webgl в приложении и визуализирую что-то в целевой рендеринге вне экрана (буфер кадра), а затем выполняю readPixels. После получения данных пикселей я конвертирую их в jpeg, используя кодировщик javascript jpeg, доступный здесь:

Javascript Jpeg Encoder

Я получаю необработанные двоичные данные в формате jpeg, которые хочу записать в локальную файловую систему. Вот код, который я использую для написания:

root.getFile(filename, {create: true}, function(fileEntry)
{
    fileEntry.createWriter(function(writer)
    {
        writer.onwriteend = function(e)
        {
            System.debug("Write done");
        };
        writer.onerror = function(e)
        {
            System.error(e);
        }
        var data = new Blob(jpegData, { type: "image/jpeg" });
        writer.write(data);
        jpegData = null;
        pixels = null;
        uoozo.core.write[filename] = false;
    });
},
function(e)
{
    System.error(e);
});

Однако я получаю странные результаты. jpegData в порядке, когда я помещаю его в элемент изображения, однако, когда я создаю blob, например. jpegData имеет размер 3200 байт, но размер создаваемого Blob-объекта всегда составляет 4818 байт, и FileWriter также возвращает ту же позицию после операции записи. Созданный jpeg явно неправильный и не открывается. Я не понимаю, как я могу заставить FileWriter просто записывать чертовы двоичные данные в файл, не пытаясь быть умным (или глупым).

Может ли кто-нибудь помочь мне в этом? Спасибо.


person GlGuru    schedule 12.06.2013    source источник
comment
какой формат jpegData, массив, строка, base64?   -  person dandavis    schedule 13.06.2013
comment
jpegData - это массив двоичных данных. Библиотека также может предоставлять строку base64, но это дает тот же результат. Я также попытался указать другой тип для blob, например. простой / текст, изображение / jpg и даже пустая строка. Все дает одинаковый результат.   -  person GlGuru    schedule 13.06.2013
comment
двоичный, как в целых числах или необработанных строковых символах?   -  person dandavis    schedule 13.06.2013
comment
Необработанные строковые символы   -  person GlGuru    schedule 13.06.2013
comment
хорошо, тогда это, вероятно, проблема с юникодом, вам придется превратить символы в массив int для подачи в Blob. См. Здесь примеры dataURL для Blob для некоторого легко адаптируемого кода (просто выберите после декодирования base64).   -  person dandavis    schedule 13.06.2013


Ответы (1)


Так что даже после перехода на Uint8Array я все еще не получал нужного мне результата. Посмотрев на метод dataURLToBlob, меня осенило, что я передаю объект массива конструктору Blob, например:

var blob = new Blob(jpegData_ConvertTo_Uint8Array, "image/jpeg");

Это неверно, и, по-видимому, для того, чтобы Blob работал должным образом, мне нужно передать массив, например:

var blob = new Blob([jpegData_ConvertTo_Uint8Array], "image/jpeg");

Это сработало отлично, и я записал мой jpeg в файл с последующим вызовом FileWriter. запись (blob) функция. Спасибо, дандави!

person GlGuru    schedule 12.06.2013