github: https://github.com/baixc1/csdn/tree/master/js/mk-gif 生成 gif 图(平移+旋转+缩放) 解析 GIF 图片 (生成每帧图片的base64) libgif.js 插件 生成 GIF 实例 解析每一帧 需要在服务器端运行(node server.js),然后访问根目录
var rub = new SuperGif ( { gif: img } ) rub. load ( ( ) => { const imgs = [ ] const len = rub. get_length ( ) for ( let i = 1 ; i <= len; i++ ) { rub. move_to ( i) imgs. push ( rub. get_canvas ( ) . toDataURL ( 'image/jpeg' , 0.6 ) ) } } )
合成帧 需要gif.js,gif.worker.js脚本 新 gif实例 ,添加画布作为帧 画布上合成之前帧和新的文字
let gif = new GIF ( { workers: 2 , quality: 10 , workerScript: './gif.worker.js'
} ) ;
function mkgif ( imgs) { gif. on ( 'finished' , blob => { } ) let i = 0 let len = imgs. lengthimgs. forEach ( ( item, index) => { let img = new Image ( ) img. src = itemimg. onload = ( ) => { ctx. drawImage ( img, 0 , 0 , imgW, imgH) ; gif. addFrame ( canvas, { copy: true , delay: 100 } ) if ( ++ i >= imgs. length) { gif. render ( ) } } } )
}
< ! DOCTYPE html>
< html>
< script src= "libgif.js" > < / script>
< script src= "gif.js" > < / script> < body> < img id= "myGIF" src= "1.gif" / >
< / body>
< script> let img = document. getElementById ( 'myGIF' ) img. onload = function ( ) { let { width: imgW, height: imgH } = this let gif = new GIF ( { workers: 2 , quality: 10 , workerScript: './gif.worker.js' } ) ; let rub = new SuperGif ( { gif: img } ) rub. load ( ( ) => { let { delays } = rubconst imgs = [ ] const len = rub. get_length ( ) for ( let i = 1 ; i <= len; i++ ) { rub. move_to ( i) imgs. push ( { url: rub. get_canvas ( ) . toDataURL ( 'image/jpeg' , 0.6 ) , delay: delays[ i - 1 ] } ) } mkgif ( imgs) } ) function mkgif ( imgs) { let canvas = document. createElement ( "canvas" ) ; let ctx = canvas. getContext ( '2d' ) ; canvas. width = imgW; canvas. height = imgH; gif. on ( 'finished' , blob => { let url = URL . createObjectURL ( blob) console. log ( url) let img = document. createElement ( 'img' ) img. src = urldocument. body. appendChild ( img) } ) let i = 0 let len = imgs. lengthimgs. forEach ( ( item, index) => { let { url, delay } = itemlet img = new Image ( ) img. src = urlimg. onload = ( ) => { ctx. clearRect ( 0 , 0 , imgW, imgH) ctx. drawImage ( img, 0 , 0 , imgW, imgH) ; ani ( { ctx, index, len, } ) gif. addFrame ( canvas, { copy: true , delay } ) if ( ++ i >= imgs. length) { gif. render ( ) } } } ) } } let rotateStart = 0 let rotateEnd = 360 let translateStartX = 100 let translateStartY = 100 let translateEndX = 400 let translateEndY = 400 let scaleStart = 1 let scaleEnd = 0.5 let fontSize = 40 let txt = "Hello World" function ani ( { ctx, index, len, } ) { let rotateVal = rotateStart + index * ( rotateEnd - rotateStart) / lenctx. font = ` ${ fontSize} px Georgia` let xText = translateStartX + index * ( translateEndX - translateStartX) / lenlet yText = translateStartY + index * ( translateEndY - translateStartY) / lenlet scaleVal = scaleStart + index * ( scaleEnd - scaleStart) / lenlet { width: wText } = ctx. measureText ( txt) let hText = fontSizectx. save ( ) ctx. scale ( scaleVal, scaleVal) ctx. translate ( xText + wText / 2 , yText - hText / 2 ) deg = Math. PI / 180 * rotateValctx. rotate ( deg, deg) ctx. fillText ( txt, - wText / 2 , hText / 2 ) ctx. restore ( ) }
< / script> < / html>