2014-02-02 3 views
0

Я работаю над проектом, в котором я использую getUserMedia для создания массива данных изображения png с веб-камеры. Теперь я пытаюсь преобразовать этот массив в один анимированный gif.Создайте анимированный gif из массива данных png

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

PS: Я хотел бы использовать только чистый Javascript, но если мне нужно внешнюю библиотеку, я буду использовать один demo Код:

<!Doctype html> 
<html> 
<head> 
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"> 
    <title>getUserMedia API - jsFiddle demo by Vulpus</title> 
<script type="text/javascript" src="LZWEncoder.js"></script> 
<script type="text/javascript" src="NeuQuant.js"></script> 
<script type="text/javascript" src="GIFEncoder.js"></script> 
<script type="text/javascript" src="b64.js"></script> 
</head> 
<body> 
     <title>RecorderGif</title> 
     <header> 
      <h1>getUserMedia</h1> 
     </header> 
     <article> 
      <video id="video" width="320" height="200" style="display:none" autoplay=""></video> 
      <section> 
       <button id="btnStart">Start video</button> 
       <button id="btnStop">Stop video</button> 
       <button id="btnSave">Download</button>    
          </section> 
      <canvas id="canvas" width="320" height="240"></canvas> 
     </article> 
<script type="text/javascript">//<![CDATA[ 
var encoder = new GIFEncoder(); 
encoder.setRepeat(0); 
encoder.setDelay(250); 
encoder.start(); 
window.onload = function() { 

    //Compatibility 
    navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia; 
    var data = [] 
    var canvas = document.getElementById("canvas"), 
     context = canvas.getContext("2d"), 
     video = document.getElementById("video"), 
     btnStart = document.getElementById("btnStart"), 
     btnStop = document.getElementById("btnStop"), 
     btnSave = document.getElementById("btnSave") 
     videoObj = { 
      video: true, 
      }; 

    btnStart.addEventListener("click", function() { 
     var localMediaStream; 

     if (navigator.getUserMedia) { 
      navigator.getUserMedia(videoObj, function(stream) {    
       video.src = (navigator.webkitGetUserMedia) ? window.webkitURL.createObjectURL(stream) : stream; 
       localMediaStream = stream; 
       var addFrame = setInterval(function() { 
       data.push(canvas.toDataURL('image/png')) 
      },100); 
      }, function(error) { 
       console.error("Video capture error: ", error.code); 
      }); 

      btnStop.addEventListener("click", function() { 
       localMediaStream.stop(); 
       clearInterval(addFrame) 
      }); 
      btnSave.addEventListener("click", function() { 
       for (var i = 0; i < data.length; i++) { 
        var frame = new Image(); 
        frame.src=data[i] 
        context.drawImage(frame,0,0) 
        encoder.addFrame(context); 
        setTimeout(function(){},100) 
       }; 
       encoder.finish(); 
       var binary_gif = encoder.stream().getData() //notice this is different from the as3gif package! 
       var data_url = 'data:image/gif;base64,'+encode64(binary_gif); 
       window.location.href=data_url; 
      }); 



      setInterval(function() {context.drawImage(video, 0, 0, 320, 240)},100); 




     } 

    }); 
}; 
//]]> 
</script> 
</body> 
</html> 

ответ

3

Вы не можете создавать GIF-файлы изначально используя холст, но вы можете использовать libray под названием JSGif для этого:
https://github.com/antimatter15/jsgif

Из файла read me:

Теперь нам нужно запустить GIFEncoder.

var encoder = new GIFEncoder(); 

Если вы делаете анимированного GIF, вам необходимо добавить следующую

encoder.setRepeat(0); //0 -> loop forever 
         //1+ -> loop n times then stop 
encoder.setDelay(500); //go to next frame every n milliseconds 

Теперь, вы должны сказать волшебную вещь, которую ты собираешься начать вставку кадров (даже если это только один).

encoder.start(); 

И для той части, которая занимала дольше всего порт: добавление реального кадра.

encoder.addFrame(context); 

Для получения дополнительной информации ознакомьтесь с его документацией.

+0

поищу в нее – MayorMonty

+0

К сожалению, этого используется вспышка, и я хочу, чтобы иметь поддержку на мобильный и рабочий стол – MayorMonty

+0

@ Vulpus не использует вспышку; это порт * из * flash-кода, поэтому вы видите ссылки AS/Flash, но эта версия - чистый код javascript. :-) – K3N

0

Пожалуйста, проверьте URL-адреса ниже.
Он обрабатывает библиотеку jsgif с API веб-рабочего.

+0

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

+0

Прошу прощения, и спасибо за ваш совет.
Я снова проверил первый исходный код.
Кажется, что это работает, изменяя область действия функции addFrame на глобальную, если вы поддерживаете только браузер Chrome.
user3287466

Смежные вопросы