首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合并两个数据two以创建一个图像

合并两个数据two以创建一个图像
EN

Stack Overflow用户
提问于 2015-08-19 13:13:46
回答 2查看 7.8K关注 0票数 7

我想要生成由标签和图标组成的图像。标签部分将有很多变化(50-100),而有大约10个图标。我想通过将最终图像分割成两个部分,一个标签图像和一个图标图像,以模块化的方式制作最终图像。我将构建一个为标签返回dataURI的服务,而图标数据for将嵌入到页面中。然后,我想将这两个不同的数据two组合起来,创建一个表示组合图像的单个dataURI。

我怎样才能在客户端做到这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-20 12:24:45

您可以使用数据uris创建图像,然后使用canvas绘制包含它们的新映像。下面是一个简单的例子:

代码语言:javascript
复制
var nloaded = 0;
function checkload(event) {
  nloaded++;
  if (nloaded < 2) {
    return;
  }
  
  var canvas = document.querySelector('canvas');
  var context = canvas.getContext('2d');
  context.drawImage(image1, 0, 0, 50, 50);
  context.drawImage(image2, 50, 50, 100, 100);

  var combined = new Image;
  combined.src = canvas.toDataURL('data/gif');
  
  document.body.appendChild(combined);
}

var image1 = new Image;
image1.onload = checkload;
image1.src = 'data:image/gif;base64,R0lGODdhAgACALMAAAAAAP///wAAAAAAAP8AAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAAgACAAAEAxBJFAA7';


var image2 = new Image;
image2.onload = checkload;
image2.src = 'data:image/gif;base64,R0lGODdhAgACALMAAAAAAP///wAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAAgACAAAEA5BIEgA7';
代码语言:javascript
复制
canvas {
    display: none;
}
代码语言:javascript
复制
<canvas width=100 height=100></canvas>

一旦从数据URI加载了图像并使用画布上下文的drawImage命令组合,就可以使用画布创建如下所示的新映像:

代码语言:javascript
复制
var combined = new Image;
combined.src = canvas.toDataURL('data/gif');

不幸的是,这在IE8中行不通。

票数 10
EN

Stack Overflow用户

发布于 2018-06-02 16:02:41

示例使用包含URI src和x,y偏移量的图像对象数组:

代码语言:javascript
复制
var images = [
   { src: 'data:image/gif;base64,R0lGODdhAgACALMAAAAAAP///wAAAAAAAP8AAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAAgACAAAEAxBJFAA7', x: 0, y: 0 },
   { src: 'data:image/gif;base64,R0lGODdhAgACALMAAAAAAP///wAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAAgACAAAEA5BIEgA7', x: 20, y: 20 },
];

var canvas = document.createElement('canvas');
var destination = document.getElementById('canvas');

Promise.all(images.map(imageObj => add2canvas(canvas, imageObj)))
    .then(() => destination.append(canvas));

function add2canvas(canvas, imageObj) {
   return new Promise( (resolve, reject) => {
      if (!imageObj || typeof imageObj != 'object') return reject();
      var image = new Image();
      image.onload = function () {
          canvas.getContext('2d')
                .drawImage(this, imageObj.x || 0, imageObj.y || 0);
          resolve();
      };

      image.src = imageObj.src;
   });
}

更多的铃铛/口哨..。函数生成复合png:

代码语言:javascript
复制
  function mergeImageURIs(images) {
      return new Promise( (resolve, reject) => {
          var canvas = document.createElement('canvas');
          canvas.width = 1000; // desired width of merged images
          canvas.height = 1000; // desired height of merged images
          Promise.all(images.map(imageObj => add2canvas(canvas, imageObj))).then(() => resolve(canvas.toDataURL('image/png'), reject));
      });
  }

  function add2canvas(canvas, imageObj) {
    return new Promise( (resolve, reject) => {
       if (!imageObj || typeof imageObj != 'object') return reject();
       var x = imageObj.x && canvas.width ? (imageObj.x >=0 ? imageObj.x : canvas.width + imageObj.x) : 0;
       var y = imageObj.y && canvas.height ? (imageObj.y >=0 ? imageObj.y : canvas.height + imageObj.y) : 0;
       var image = new Image();
       image.onload = function () {
           canvas.getContext('2d').drawImage(this, x, y);
           resolve();
       };

       image.src = imageObj.src;
    });
  }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32096540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档