var fs = require('fs'); var util = require('util'); var async = require('async'); var Bitmap = require('./bitmap'); // // ニコニコ動画の【東方】Bad Apple!! PV【影絵】 // を 30fps な bitmap に分割したので、 // それを読み込みつつ、コンソールに表示してみる。 // // async // を使ってるので、 npm install async する // // youtubeにモッサリ動画を上げてみた。 // 音付きにしてニコニコ動画に上げてみた。 // var imageSequenceDir = 'badapple_30fps_160_120'; fs.readdir(__dirname + '/' + imageSequenceDir, function(err, files){ if(err){ throw err; } var pathes = files.map(function(file){ return __dirname + '/' + imageSequenceDir + '/' + file; }).filter(function(path){ if(/\.bmp$/.test(path)){ return true; } return false; }); // コンソールに出すときに半角スペースと#の文字列に変換 Bitmap.prototype.mapRGBA = function(r, g, b){ if(255 == r && 255 == g && 255 == b){ return ' '; } return '##'; }; var render = async.queue(function(view, next){ util.print('\033[2J'); util.print(view); util.print('\033[0;0H'); return next(null); }, 1); var queue = async.queue(function(path, next){ return fs.readFile(path, next); }, 8); var serial = []; queue.push(pathes, function(err, buffer){ if(err){ throw err; } var bitmap = new Bitmap(buffer); bitmap.init(); if(!bitmap.isBitmap()){ throw new Error('not bitmap'); } serial.push(function(next){ var values = bitmap.getData(); var view = values.map(function(line){ return line.join(''); }); return render.push(view.join('\n'), function(){ return setTimeout(next, 22); }); }); }); queue.drain = function(){ async.series(serial, function(err, results){ if(err){ console.error(err); return process.exit(1); } console.log('\033[2J'); // clear screen return process.exit(0); }); }; });