【问题标题】:Convert html div having multiple images to single image using javascript使用javascript将具有多个图像的html div转换为单个图像
【发布时间】:2014-02-04 18:53:46
【问题描述】:

我正在尝试将 DIV 转换为单个图像。 div 中有 4 张图像。我找到了“htmltocanvas”的 js,但是这个 jquery 插件不会创建包含 div 中所有图像的图像。

这是其中包含图像并需要转换为图像的 div 代码。

<div id="myJershy">
    <!-- Color 3 -->
    <img src="grey.gif" id="grey" style="position: fixed; top: 8px; left: 12px; width: 935px;">
    <!-- Color 2 -->
    <img class="orange" id="orange" src="orange.gif" style="position: fixed; left: 10px; top: 8px;">
    <!-- Color 4 -->
    <img src="gold.gif" id="gold" style="position: fixed; top: 12px; left: 22px;">
    <!-- Color 1 -->
    <img class="back" id="black" src="back.gif" style="position: fixed; left: 11px; top: 9px;"> 
    <!-- outline -->
    <img class="skel" id="skel" src="outline.gif" style="position: fixed;">
</div>

我也尝试过使用下面的 javascript 代码,但未能成功。

var htmlcontent = $("#myJershy").html();
var canvas = document.createElement("canvas");
var ctx = canvas.getContext("2d");
var data = "<svg xmlns='http://www.w3.org/2000/svg' width='200' height='200'>" +
             "<foreignObject width='100%' height='100%'>" +
               "<div xmlns='http://www.w3.org/1999/xhtml' style='font-size:40px'>" +
        htmlcontent+
               "</div>" +
             "</foreignObject>" +
           "</svg>";

var DOMURL = self.URL || self.webkitURL || self;
var img = new Image();
var svg = new Blob([data], {type: "image/svg+xml;charset=utf-8"});
var url = DOMURL.createObjectURL(svg);
img.onload = function() {
    ctx.drawImage(img, 0, 0);
    DOMURL.revokeObjectURL(url);
};
document.getElementById('previewproduct').src = url;

请注意“html div”有多个图像。

【问题讨论】:

  • 所以基本上你是想把你的图片合并成一张?
  • 是的,我需要合并所有图像。是否有另一种选择使用 javascript?
  • 你为什么不在 Photoshop 中这样做?
  • 是的,我们可以使用 Photoshop 完成,但我希望在网页中使用此功能。为了您的信息,这些图像在网络上显示为一张图像。使用所有四个图像形成的图像需要发送到服务器。因此我想要这个功能。
  • @user3270303 我会做一个小提琴,但这需要时间。稍后检查

标签: javascript jquery html canvas


【解决方案1】:

这是我的尝试:

http://jsfiddle.net/8FFQM/1/

不用担心 html 中那些巨大的代码,它们只是 url 编码的图像,如果您的图像托管在您的域中,则不必这样做。

导出为jpg的图片是带有红色边框的图片(在结果窗口中滚动):

var DivsToJPG = function( parent ) {
    this.canvasSizeX = 0;
    this.canvasSizeY = 0;
    this.init = function( parent ) {
        this.images = parent.find('img');
        this.setSizes();
        this.createCanvas();
        this.drawImages();
        this.exportJPG();
    }

    this.setSizes = function() {
        for (var i = 0, l = this.images.length; i < l ; i++) {
            var currentImage = this.images.eq(i);
            var posX = currentImage.position().left;
            var width = currentImage.width();
            this.canvasSizeX = this.canvasSizeX > (posX+width) ? this.canvasSizeX : posX + width;
            //console.log(this.canvasSizeX);
            var posY = currentImage.position().top;
            var height = currentImage.height();
            this.canvasSizeY = this.canvasSizeY > (posY+height) ? this.canvasSizeY : posY + height;

         }
    }

    this.createCanvas = function() {
        this.canvas = document.createElement('canvas');
        this.canvas.id     = "exportCanvas";
        this.canvas.width  = this.canvasSizeX;
        this.canvas.height = this.canvasSizeY;
        this.ctx = this.canvas.getContext("2d");
        document.body.appendChild(this.canvas);
    }

    this.drawImages = function() {
        for (var i = 0, l = this.images.length; i < l ; i++) {
            var currentImage = this.images[i];
            var $currentImage = this.images.eq(i);
            this.ctx.drawImage(currentImage, $currentImage.position().left, $currentImage.position().top, $currentImage.width(), $currentImage.height());
        }
    }

    this.exportJPG = function() {
        var dataURL = this.canvas.toDataURL();
        this.img = document.createElement('img');
        this.img.id = "createdImage";
        this.img.src     = dataURL;
        document.body.appendChild(this.img);
    }

    this.init( parent );
}

var divsToJPG = new DivsToJPG($('#myJershy'));

PS:它有点长,但它应该照顾一切,它使用了一点 jQuery

【讨论】:

  • 它正在工作....很棒的代码。只是有一个问题。当从 html DIV 生成新图像时,输出翻了一番。我的意思是说它复制了 div 两次。而我们只想要一个。请你看一下。
  • 您可以删除创建最终图像所需的元素:jsfiddle.net/8FFQM/5this.container.remove(); this.canvas.remove();
  • 请注意,您可能需要更改此行:document.body.appendChild(this.img);如果您想将最终图像附加到另一个 div 或其他内容中,以满足您的需求
  • 酷,如果你决定使用我的答案,你能接受吗?谢谢
  • 当然,这是我的荣幸。这是更新的代码。 jsfiddle.net/pankaj_javascript/jykyh
【解决方案2】:

See this fiddle


jQuery

var s=0;
$('#myJershy').children('img').each(function(){
    var c=document.getElementById("myCanvas");
    var ctx=c.getContext("2d");
    var img=document.getElementById($(this).attr('id'));
    ctx.drawImage(img,s,10,$(this).width(),$(this).height());
    s=s+$(this).width();
});

如果您希望画布中 div 的位置应该与画布外显示的完全一样,请参阅下面的小提琴:

Fiddle 2

【讨论】:

  • 在canvas上画图怎么不会出现跨域策略问题?
  • 对不起,我弄糊涂了,你可以在画布上绘制来自另一个域的图像,但你不能在画布上调用带有跨域图像的 toDataUrl()。我的答案中有它,这就是我在控制台中收到警告的原因。
  • 一个小提示,我认为当图像低于屏幕尺寸时(如果您必须滚动才能看到它们),由于 offset(),此解决方案可能会产生问题
  • 代码不错,但它不管理 div 的 css。正如您在示例 html 中看到的,所有图像都是使用 css 排列的。在您的代码中,这些 css 没有被考虑在内。所以输出图像只是 div 中所有图像的合并。但是我们需要带有css的代码。
  • @user3270303 你检查了我的第二把小提琴吗?
【解决方案3】:

这是我的答案(基于@Zwords 很棒的答案),它考虑了顶部和左侧的位置。如果您想对这些图像进行分层。

$('#myJershy').children('img').each(function(){
    var c=document.getElementById("myCanvas");
    var ctx=c.getContext("2d");
    var img=document.getElementById($(this).attr('id'));
 ctx.drawImage(img,$(this).css('left').replace('px',''),$(this).css('top').replace('px',''),$(this).width(),$(this).height());
});

Forked Fiddle from @Zword

【讨论】:

  • 但这会给出与我相同的输出
  • 不完全是。查看问题的 html 部分中的样式定义和我的方法。我猜他想安装重叠的图像。尽管如此,您的答案是完全正确的,代表应该去找您。我只是用定义的 css 值替换了坐标,并从结果中删除了“px”部分。
猜你喜欢
  • 2016-12-17
  • 1970-01-01
  • 1970-01-01
  • 2016-02-09
  • 2012-05-16
  • 2017-01-31
  • 1970-01-01
  • 1970-01-01
  • 2015-09-24
相关资源
最近更新 更多