我可以从canvas元素获取图像并在img src标签中使用它吗?


70

是否有可能将canvas元素中存在的图像转换为表示的图像img src

我需要在一些转换后裁剪图像并保存它。有一个视图功能,我喜欢在互联网上找到:FileReader()或者ToBlop()toDataURL()getImageData(),但我不知道如何实现,并在JavaScript中正确地使用它们。

这是我的html:

<img src="http://picture.jpg" id="picture" style="display:none"/>
<tr>
    <td>
        <canvas id="transform_image"></canvas>
    </td>
</tr>
<tr>
    <td>
        <div id="image_for_crop">image from canvas</div>
    </td>
</tr>

在JavaScript中,它看起来应该像这样:

$(document).ready(function() {
    img = document.getElementById('picture');
    canvas = document.getElementById('transform_image');

    if(!canvas || !canvas.getContext){
        canvas.parentNode.removeChild(canvas);
    } else {
        img.style.position = 'absolute';
    }
    transformImg(90);
    ShowImg(imgFile);
}

function transformImg(degree) {
    if (document.getElementById('transform_image')) {
        var Context = canvas.getContext('2d');
        var cx = 0, cy = 0;
        var picture = $('#picture');
        var displayedImg = {
            width: picture.width(),
            height: picture.height()
        };   
        var cw = displayedImg.width, ch = displayedImg.height
        Context.rotate(degree * Math.PI / 180);
        Context.drawImage(img, cx, cy, cw, ch);
    }
}

function showImg(imgFile) {
    if (!imgFile.type.match(/image.*/))
    return;

    var img = document.createElement("img"); // creat img object
    img.id = "pic"; //I need set some id
    img.src = imgFile; // my picture representing by src
    document.getElementById('image_for_crop').appendChild(img); //my image for crop
}

如何img src在此脚本中将canvas元素更改为图像?(此脚本中可能存在一些错误。)

Answers:


94

canvas.toDataURL()将为您提供一个可以用作源的数据网址

var image = new Image();
image.id = "pic";
image.src = canvas.toDataURL();
document.getElementById('image_for_crop').appendChild(image);

完整的例子

这是一个带有一些随机行的完整示例。黑色边框图片是在上生成的<canvas>,而蓝色边框图片是a中的副本,其中<img>填充了<canvas>数据url

// This is just image generation, skip to DATAURL: below
var canvas = document.getElementById("canvas")
var ctx = canvas.getContext("2d");

// Just some example drawings
var gradient = ctx.createLinearGradient(0, 0, 200, 100);
gradient.addColorStop("0", "#ff0000");
gradient.addColorStop("0.5" ,"#00a0ff");
gradient.addColorStop("1.0", "#f0bf00");

ctx.beginPath();
ctx.moveTo(0, 0);
for (let i = 0; i < 30; ++i) {
  ctx.lineTo(Math.random() * 200, Math.random() * 100);
}
ctx.strokeStyle = gradient;
ctx.stroke();

// DATAURL: Actual image generation via data url
var target = new Image();
target.src = canvas.toDataURL();

document.getElementById('result').appendChild(target);
canvas { border: 1px solid black; }
img    { border: 1px solid blue;  }
body   { display: flex; }
div + div {margin-left: 1ex; }
<div>
  <p>Original:</p>
  <canvas id="canvas" width=200 height=100></canvas>
</div>
<div id="result">
  <p>Result via &lt;img&gt;:</p>
</div>

也可以看看:


出了点问题,脚本对我不起作用,我不知道为什么。我将其实现为showImg()函数,请参见我的小提琴jsfiddle.net/kacprek/gfyWK/8
kassprek 2012年

1
应该是canvas.toDataURL(),注意大小写。
Zachary Schuessler 2013年

8

做这个。关闭body标记之前,请将其添加到文档的底部。

<script>
    function canvasToImg() {
      var canvas = document.getElementById("yourCanvasID");
      var ctx=canvas.getContext("2d");
      //draw a red box
      ctx.fillStyle="#FF0000";
      ctx.fillRect(10,10,30,30);

      var url = canvas.toDataURL();

      var newImg = document.createElement("img"); // create img tag
      newImg.src = url;
      document.body.appendChild(newImg); // add to end of your document
    }

    canvasToImg(); //execute the function
</script>

当然,在文档中的某处,您需要它可以抓取的canvas标签。

<canvas id="yourCanvasID" />

为了通过id或canvas元素,我进行了一些修改:canvasToImg = function =(id){var canvas = document.getElementById(id)|| id; …
ESL

2

我发现您的小提琴有两个问题,其中一个是Zeta的回答中的第一个问题。

该方法不toDataUrl();toDataURL();你忘了画布存储在您的变量。

所以小提琴现在可以正常使用http://jsfiddle.net/gfyWK/12/

我希望这有帮助!


1

canvas.toDataURL如果原始图像URL(相对或绝对)与网页不属于同一域,则无法正常工作。从包含图像的网页中的书签和简单的javascript测试。看一下David Walsh的工作示例。将html和图像放在您自己的Web服务器上,将原始图像切换为相对或绝对URL,更改为外部图像URL。仅前两种情况有效。


0

更正了小提琴-更新后显示了复制到画布中的图像...

右键单击可以另存为.PNG

http://jsfiddle.net/gfyWK/67/

<div style="text-align:center">
<img src="http://imgon.net/di-M7Z9.jpg" id="picture" style="display:none;" />
<br />
<div id="for_jcrop">here the image should apear</div>
<canvas id="rotate" style="border:5px double black; margin-top:5px; "></canvas>
</div>

加上小提琴页面上的JS ...

干杯

当前正在考虑将其保存到服务器上的文件--- ASP.net C#(。aspx Web表单页面),任何建议都很棒。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.