我可以将本地文件加载到html canvas元素中吗?

时间:2012-12-18 17:52:55

标签: javascript html5

我的目标是让iPad上的用户将图片加载到画布中,然后在 OFFLINE

的基础上获得基本64位编码的所有图像

的jsfiddle

JSFiddle

代码

<!DOCTYPE html>
<html>
  <head>
    <script type="text/javascript" src="../js/libs/jquery-1.7.1.min.js"></script>
    <script>
      $(document).ready(function(){ 
        //Get the canvas
        var canvas = document.getElementById('testCanvas');
        var context = canvas.getContext('2d');   

        $("#testButton").click(function(){
          var base_image = new Image();

          base_image.src = $("#testImg").val();
          //base_image.src = '1.jpg';

          //When the image loads
          $(base_image).load(function(){
            //Resize canvas for image
            $("#testCanvas").attr({
              width: base_image.width,
              height: base_image.height
            });

            //Draw image on canvas
            context.drawImage(base_image, 0, 0);

            //Get base64 encoded image
            var imageString = canvas.toDataURL("image/jpeg");
            $("#imageString").val(imageString);

            //alert($("#imageString").val().length);
            $("#imageOutput").attr("src", imageString);
          });//image load
        });//Test Button Click
      });//doc ready
    </script>
  </head>

  <body>
    <form>
      <input type="file" name="testImg" id="testImg" />
    </form>
    <button id="testButton">Test</button>
    <canvas id="testCanvas" style="border: 1px solid black;">Your Browser does not support canvas</canvas>
    <br />
    <fieldset>
      <legend>Image Data</legend>
      <textarea id="imageString"></textarea>

      <img id="imageOutput" src="" />
    </fieldset>
  </body>
</html>

我知道图像实际上并未从<input type='file' />加载,但我认为它值得一试。在Chrome控制台中,我得到:

  

不允许加载本地资源

我有什么方法可以将iPad上的图像转换为画布元素吗?

非常感谢任何帮助,提示或建议!谢谢!

1 个答案:

答案 0 :(得分:56)

我有一个functioning fiddle(基于this answer的先前工作),它演示了如何使用文件输入上传图像,将其放在画布中,然后读取base64数据URL

简而言之,你应该:

  1. 使用File API读取图像(您可以在input元素的onchange侦听器中执行此操作):

    var file = input.files[0];
    var fr = new FileReader();
    fr.onload = createImage;   // onload fires after reading is complete
    fr.readAsDataURL(file);    // begin reading
    
  2. 在FileReader的onload回调(此处为createImage)中,阅读FileReader的result(此处为fr.result)。那是你的图像数据网址!

  3. 可选步骤(仅在您计划在画布上操作图像时才需要):

    1. 在FileReader的onload回调(此处为createImage)中,创建一个新的Image对象并将其src设置为result FileReader:

      img = new Image();
      img.onload = imageLoaded;
      img.src = fr.result;
      
    2. 最后,在您的图片的onload回调中,将其绘制到画布上,然后使用canvas.toDataUrl数据:

      canvas.width = img.width;      // set canvas size big enough for the image
      canvas.height = img.height;
      var ctx = canvas.getContext("2d");
      ctx.drawImage(img,0,0);         // draw the image
      
      // do some manipulations...
      
      canvas.toDataURL("image/png");  // get the data URL