сохранить элемент холста html5 в файл с помощью webos

здесь переменная img извлечена из кода генерации Png с открытым исходным кодом здесь ..
http://www.xarg.org/2010/03/generate-client-side-png-files-using-javascript/, который является альтернативой canvas.toDataURL() ; webOS не поддерживает toDataURL, поэтому мне пришлось использовать эту библиотеку.

здесь я использовал эту библиотеку и манипулировал массивом пикселей с данными изображения на холсте.

  EditorAssistant.prototype.getDataURL = function(width,height,data){   
     var p = new PNGlib(height, width, 256); // construcor takes height, weight and color-depth
 var background = p.color(0, 0, 0, 0); // set the background transparent

    for (var i = 0, n = data.length; i < n; i += 4) {
        var x = i * 10;
        var y = Math.sin(i) * Math.sin(i) * 50 + 50;
        // use a color triad of Microsofts million dollar color
          p.buffer[p.index(Math.floor(x), Math.floor(y))] = p.color(data[i], data[i+1], data[i+2]);
    }


return 'data:image/png;base64,'+p.getBase64() ;
}

честно говоря, я новичок в node.js. у меня просто есть хит и пробный APProach... я хочу сохранить мой управляемый объект холста в каталог изображений в моем приложении.. путь существует здесь, и этот код не генерирует никаких ошибок.. скорее это дает мне успех при обратном вызове а также вернуть количество записанных байтов, но я не могу найти изображение с именем icon.png в папке с изображениями... сгенерированные выше imgdata передаются этому коду в качестве данных..

  var fs = IMPORTS.require('fs');
var path = IMPORTS.require('path');


var buff = new Buffer(data,'binary').toString('base64'); 

 path.exists('images/', function(exists     ){
 if (exists) {

     fs.open('images/icon.png', 'w', 666, function( e, id ) {

          fs.write( id,  buff, null, 'binary', function(err,written){
            if(err)
                callback({
                    error: false,
                    reply: err
                });
            if(written){
                    callback({
                    error: false,
                    reply: buff.toString()
                });
            }   
            fs.close(id, function(){
                callback({
                    error: false,
                    reply: 'closed'
                });
            });
          });
        });

    }
    else {
        callback({
            error: true,
            reply: 'File did not exist.'
        });
    }
       }
   })

заранее спасибо


person sw-dev    schedule 03.05.2011    source источник
comment
Я раньше не пробовал записывать файлы в webOS, но вы уверены, что у вас есть разрешение на запись туда, куда вы пытаетесь? Вы можете не получить сообщение об ошибке, но webOS может молча выйти из строя, когда вы попытаетесь написать что-то не так, я не знаю.   -  person G Gordon Worley III    schedule 04.05.2011
comment
хорошо, теперь это работает, я только что изменил путь к /media/internal/wallpapers/... он создает png, но он пуст.. теперь вопрос... как загрузить данные моего холста в файл изображения вебОС?   -  person sw-dev    schedule 04.05.2011
comment
это как-то связано с правильной кодировкой? как изображения png должны быть закодированы?   -  person sw-dev    schedule 04.05.2011


Ответы (1)


data — это строка, которая начинается с data:image/png;base64,, а остальные — это данные в base64.

  1. Удалить data:image/png;base64, из data
  2. Преобразуйте его из base64 в двоичный
  3. Сохраните этот двоичный буфер в файл

Код

var buff = new Buffer(data.substr('data:image/png;base64,'.length), 'base64');
...
fs.write(id, buff, 0, buff.length, 0, function(...
person mak    schedule 04.05.2011
comment
спасибо, мак ... теперь я могу сохранить изображение по крайней мере - person sw-dev; 05.05.2011
comment
приведенный выше код отлично работает в эмуляторе, но не работает для устройства Palm. - person sw-dev; 06.05.2011