複数画像をGIFアニメに変換する「GIFAnime.js」の使い方[公式]
Javascriptで複数画像をGIFアニメに変換する「GIFAnime.js」の使い方。
ブラウザがChromeの場合は、Chromeのセキュリティ仕様でローカルで実行するとエラーが発生します。回避策はサーバーにHTMLファイルをアップするか、エラー回避方法をご覧ください。
ダウンロード
GIFAnime.js
ダウンロードの方法がわからない方はこちらからです。
DEMO
http://www.petitmonte.com/labo/gif-anime/
こちらのサイトはGIFAnime.jsを使用した例です。
使い方
サンプルコード
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <style> table{ margin: 0 8px 0 18px; border: 1px solid #1e90ff; border-collapse: collapse; } table th{ padding:5px; font-size:14px; border: 1px solid #1e90ff; background:#f0f8ff; } table td{ padding:5px; font-size:14px; border:1px solid silver; background-color:#ddd; } </style> <script src="GIFAnime.js"></script> <script> var src_img,src_canvas,src_ctx; // ImageList Object (including settings) var imageList = []; // Transparent color : White color // (透明色 : 白色) var r=255,g=255,b=255; // overlaid (1: Leave the image in the next frame 2: Do not leave images in the next frame) // When there is no transparent color, it becomes 2 // (重ね方 1:次回のフレームに画像を残す 2:次回のフレームに画像を残さない ※透明色が無い場合は2となる) var overlaid; // Display time "1 second = 100" and the default "50" will be "0.5 seconds". (0-65535) // (表示時間 「1秒=100」でデフォルトの「50」は「0.5秒」となります。[0-65535]) var delaytime = 50; // Number of repetitions of animation (0 is infinite) // The number of times may vary depending on the browser. // (アニメーションの繰り返し回数 [0は無限] ※ブラウザによって回数が異なる場合があります。) var repeatcount = 0; window.onload = function () { src_img = document.getElementById("SrcImage"); src_canvas = document.getElementById("SrcCanvas"); src_ctx = src_canvas.getContext("2d"); } function overlaid(value){ // Transparent flag (true or false) // 透明フラグ (true : 透明あり false : 透明なし) var transflg; if(value === 1){ transflg = true; }else{ transflg = false; } for(var i = 0; i < 3; i++){ // Generate ImageData // (ImageDataの生成) var src_img = document.getElementById("SrcImage" + (i+1)); src_canvas.width = src_img.width; src_canvas.height = src_img.height; src_ctx.drawImage(src_img,0,0); imageList[i] = src_ctx.getImageData(0,0,src_canvas.width,src_canvas.height); // Reduce the color to 256 colors // when the number of colors of the image is larger than 256 colors // (画像の色数が256色より多い場合は256色に減色する) var MedianCut = null; var colors = getColorInfo(imageList[i]); if(colors.length > 256){ MedianCut = new TMedianCut(imageList[i],colors); MedianCut.run(256,true); } // ImageList settings // (ImageListの設定) imageList[i]['transflg'] = transflg; imageList[i]['overlaid'] = value; imageList[i]['delaytime'] = delaytime; // Setting of color palette // (カラーパレットの設定) if(MedianCut){ imageList[i]['colors'] = MedianCut.rep_color; }else{ imageList[i]['colors'] = colors; } } // Generation of GIF animation // (GIFアニメの生成) GIFWriter = new TGIFAnime(imageList,repeatcount); if(transflg){ GIFWriter.SaveToFile("untitle.gif",r,g,b); }else{ GIFWriter.SaveToFile("untitle.gif"); } } </script> </head> <body> <canvas id="SrcCanvas" style="display:none;"></canvas> <p>[Original image]</p> <table> <tr><th>Image1<br>(48x48)</th><th>Image2<br>(48x48)</th><th>Image3<br>(48x48)</th></tr> <tr><td><img id="SrcImage1" src="1.png"></td> <td><img id="SrcImage2" src="2.png"></td> <td><img id="SrcImage3" src="3.png"></td></tr> </table> <p>[Types of animation]</p> <table> <tr><th>overlaid = 1<br>transflg = true</th><th>overlaid = 2<br>transflg = false</th></tr> <tr><td><img src="overlaid1.gif"></td><td><img src="overlaid2.gif"></td></tr> <tr><td><button onclick="overlaid(1);" style="font-size:24px;">Output1</button></td> <td><button onclick="overlaid(2);" style="font-size:24px;">Output2</button> </td></tr> </table> </body> </html>
※画像はGIFAnime.jsから入手して下さい。
関数
画像のカラー情報を取得する | |
---|---|
関数 | function getColorInfo(imagedata) |
引数 | imagedata: ImageDataオブジェクト |
戻り値 | カラー情報のオブジェクト |
ImageListのプロパティ
画像の重ね方 | |
---|---|
プロパティ | ImageList[index]['overlaid'] |
内容 | 1:次回のフレームに画像を残す 2:次回のフレームに画像を残さない ※透明色が無い場合は2となる |
表示時間 | |
---|---|
プロパティ | ImageList[index]['delaytime'] |
内容 | 「1秒=100」でデフォルトの「50」は「0.5秒」となります。[0-65535] |
透明フラグ | |
---|---|
プロパティ | ImageList[index]['transflg'] |
内容 | true : 透明あり false : 透明なし ※trueを指定した場合はTGIFAnime.SaveToFileの引数にr/g/bを設定する必要があります。 |
カラーパレット | |
---|---|
プロパティ | ImageList[index]['colors'] |
内容 | getColorInfo()で取得したオブジェクト、 またはTMedianCut.rep_colorを指定する |
TGIFAnimeのコンストラクタ
クラスを生成 | |
---|---|
コンストラクタ | new TGIFAnime(imagelist, repeatcount) |
引数 | imagelist : ImageListオブジェクト repeatcount: アニメーションの繰り返し回数(0は無限) |
戻り値 | TGIFAnimeオブジェクト |
TGIFAnimeのメソッド
GIFファイルの生成 | |
---|---|
メソッド | TGIFAnime.SaveToFile(FileName, r, g, b) |
引数 | FileName : 出力するファイル名 r : 背景を透過する色(0 - 255) g : 背景を透過する色(0 - 255) b : 背景を透過する色(0 - 255) ※r/g/bはImageList[index]['transflg']が全てfalseならば省略可能 |
戻り値 | なし |
※TMedianCutは画像を高品質に減色する「MedianCut.js」の使い方をご覧ください。
応用
このまま関数を実行すると、JavaScriptはシングルスレッドですので重いです。そこで、HTML5の新機能であるWeb Workerを使用するとマルチスレッドで並列処理が可能です。
Web Workerの使い方はWeb Workerを使用してプログレスバーをマルチスレッドで動かすをご覧ください。
スポンサーリンク
関連記事
公開日:2016年12月15日 最終更新日:2017年05月23日
記事NO:02231