Cesium笔记之加载GIF图

CeisumBillboardGraphics 方法支持加载并显示 jpeg png 等格式的图片资源。实际开发中我们经常会有 GIF 图加载的需求,而 Cesium 没有直接支持 GIF 格式的图片格式,那么怎么加载 GIF 图呢?

1.解决思路

GIF 图是通过时间轴叠加 N 张图片实现图片的动态变化。因此如果能够通过某种方式将 GIF 图再解构成一张张的图片,并通过 CesiumBillboardGraphics 按照时间顺序更新图片,即能实现 GIF 图的加载!

经过调研发现,第三方库 libgif 能够将 GIF 转化为 一组图片对象(DataUrl),能够完全满足需求!

2.具体实现

首先创建图层:

/*
* 初始化地图
*/
function initMap() {
  window.viewer = new Cesium.Viewer('map', {
    animation: false,
    fullscreenButton: false,
    baseLayerPicker: false,
    geocoder: false,
    homeButton: false,
    infoBox: false,
    sceneModePicker: false,
    selectionIndicator: false,
    timeline: false,
    navigationHelpButton: false,
    imageryProvider: Cesium.createTileMapServiceImageryProvider({
      url : '../lib/Cesium/Assets/Textures/NaturalEarthII',
      fileExtension: 'jpg'
    })
  });

  // 去除版权信息
  viewer._cesiumWidget._creditContainer.style.display = 'none';

  // 显示帧率插件
  viewer.scene.debugShowFramesPerSecond = true;
}

其次调用 libgif 库实现图片解构,同时循环更新 Cesium 图片对象的 数据源:

/*
* gif测试
*/
function testGif() {
  const gifDiv = document.createElement('div');
  const gifImg = document.createElement('img');

  // gif库需要img标签配置下面两个属性
  gifImg.setAttribute('rel:animated_src', '../res/images/timg.gif')
  gifImg.setAttribute('rel:auto_play', '0')
  gifDiv.appendChild(gifImg);

  // 新建gif实例
  var rub = new SuperGif({ gif: gifImg } );

  rub.load(function () {
    var img_list = [];

    // 获取 gif 图的每一帧图片
    for (var i=1; i <= rub.get_length(); i++) {
      // 遍历gif实例的每一帧
      rub.move_to(i);
      img_list.push(rub.get_canvas().toDataURL())
    }

    let flag = 0;
    let len = img_list.length;
    // 创建图片实体
    let gif_entity = viewer.entities.add({
      position: Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883),
      billboard: {
        image: img_list[0], // default: undefined
        show: true, // default
        scale: 0.3 // default: 1.0
      }
    });

    // 循环更新 billboard
    setInterval(() => {
      flag++;
      if (flag >= len) {
        flag = 0;
      }
      gif_entity.billboard.image = img_list[flag];
    }, 1000 / 30);
  });
}

3.最终效果

效果图

4.总结

以上只是提供一个实现 GIF 图加载的思路,大家有更好的解决办法可以进一步交流!

注:示例代码可参见 CesiumLoadGIF


created by @SpiderWang
转载请注明作者及链接

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值