如何将图像上传到 HTML5 画布

IT技术 javascript html
2021-01-28 05:22:40

我目前正在使用http://paperjs.org创建一个 HTML5 画布绘图应用程序。我想让用户将图像上传到画布中。我知道我需要登录和注册,但有没有更简单的方法?我已经看到了 HTML5 拖放上传。

3个回答

我假设您的意思是将图像加载到画布中而不是从画布上传图像。

通读他们在这里的所有画布文章可能是个好主意 https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Canvas_tutorial/Using_images

但基本上你想要做的是在 javascript 中创建一个图像,并将 image.src = 设置为任何文件位置。在从用户端加载图像的情况下,您将需要使用文件系统 API。

在这里举一个简单的例子:http : //jsfiddle.net/influenztial/qy7h5/

function handleImage(e){
    var reader = new FileReader();
    reader.onload = function(event){
        var img = new Image();
        img.onload = function(){
            canvas.width = img.width;
            canvas.height = img.height;
            ctx.drawImage(img,0,0);
        }
        img.src = event.target.result;
    }
    reader.readAsDataURL(e.target.files[0]);     
}
带有 FileReader 的 IE10+ -- caniuse.com/filereader -- 但显然存在一个polyfillgithub.com/Jahdrien/FileReader
2021-03-27 05:22:40
在 jsfiddle 链接的示例中,我从我的 PC 中选择了一张照片后,画布不会更新。我使用 Windows 10 和 Chrome 70.0.3538.77
2021-03-27 05:22:40
如果没有按钮,您将如何运行代码?示例中的“e”指的是什么?
2021-04-02 05:22:40
@Waltari 'e' 变量是使用 FileReader API 的文件句柄事件,如果不使用 File Input 或 dropzone,您将无法执行此操作,因为您不能以编程方式运行用户的文件系统(到目前为止我所知)。
2021-04-05 05:22:40
@TheLogicGuy 现在应该修复了。显然,由于某种原因,小提琴正在使用 MooTools,该库停止工作。
2021-04-07 05:22:40

不需要 FileReader*,最好使用URL.createObjectURL方法,该方法将直接创建指向磁盘上文件的符号链接。这将导致更少的内存使用量,并且只有一个异步事件要等待( 之一img.onload)。

document.getElementById('inp').onchange = function(e) {
  var img = new Image();
  img.onload = draw;
  img.onerror = failed;
  img.src = URL.createObjectURL(this.files[0]);
};
function draw() {
  var canvas = document.getElementById('canvas');
  canvas.width = this.width;
  canvas.height = this.height;
  var ctx = canvas.getContext('2d');
  ctx.drawImage(this, 0,0);
}
function failed() {
  console.error("The provided file couldn't be loaded as an Image media");
}
<input type="file" id="inp">
<canvas id="canvas"></canvas>

*IIRC 只有几个版本的 Chrome 确实支持 FileReader 而还不支持 URL.createObejctURL,所以如果你针对这些版本,你可能需要 FileReader..

@AbhinavRavi 你通常会反过来做:调整画布的大小以使图像适合。但如果你真的想改变图像的大小,那么只需使用 drawImage: 的第三个和第四个参数ctx.drawImage(img, x, y, width, height)
2021-03-17 05:22:40
这是一个更好的解决方案。
2021-03-25 05:22:40
此解决方案自版本 71 起在 Chrome 中存在问题
2021-03-27 05:22:40
如何调整图像大小以适合画布?
2021-03-28 05:22:40
<script>
window.onload = function() {
var canvas=document.getElementById(“drawing”); // grabs the canvas element
var context=canvas.getContext(“2d”); // returns the 2d context object
var img=new Image() //creates a variable for a new image

img.src= “images/vft.jpg” // specifies the location of the image
context.drawImage(img,20,20); // draws the image at the specified x and y location
}
</script>

检查演示

富文本引用也不好玩。
2021-03-26 05:22:40
对这个问题的反对票数量让我很好奇。这是这一行:img.src=“images/vft.jpg”。问题是询问如何根据用户上传的内容(任何文件名!)动态解决这个问题,您只能为该文件静态解决它。
2021-03-28 05:22:40
@HoldOffHunger 并且他们不会在尝试在画布上绘制图像之前等待图像已加载,对于用户提供的图像,每次都可能会失败,因为该图像通常不在缓存中
2021-04-14 05:22:40