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

标签 javascript html

我的目标是让 iPad 上的用户将图像加载到 Canvas 中,然后在离线

时获取 base 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 控制台中,我得到:

Not allowed to load local resource

有什么方法可以将我的 iPad 中的图像放入 Canvas 元素中吗?

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

最佳答案

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

简而言之,你应该:

  1. 使用File API读取图像(您可以在输入元素的 onchange 监听器中执行此操作):
var file = input.files[0];
var fr = new FileReader();
fr.onload = createImage;   // onload fires after reading is complete
fr.readAsDataURL(file);    // begin reading
  1. 在您的 FileReader 的 onload 回调(此处为 createImage)中,读取 FileReader 的result(此处为 fr.result )。那是你的图像数据 URL!

可选步骤(仅当您计划在 Canvas 上操作图像时才需要):

  1. 在你的 FileReader 的 onload 回调中(这里是 createImage),创建一个新的 Image 对象并设置它的 src 到 FileReader 的结果:
img = new Image();
img.onload = imageLoaded;
img.src = fr.result;
  1. 最后,在图像的 onload 回调中,将其绘制到 Canvas 上,然后使用 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

关于javascript - 我可以将本地文件加载到 html canvas 元素中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13938686/

相关文章:

javascript - JS/JQUERY iframe.contents() 语法

JavaScript jQuery animate 不起作用,其他效果都很好

html - Twitter Bootstrap 的侧边栏文档中使用了什么组件?

javascript - 如何在vue应用程序中获取切换开关状态

html - 使用内联 block 时,包含宽度为 50% 的 UL 的 Div 将无法正确排列

html - 水平滚动 div 中 float 元素后的空白

javascript - 如何防止最终用户看到通过浏览器控制台进行的网络调用

javascript - 检索单击按钮的位置?

javascript - "Permission denied to shadow native property"在 JavaScript 中使用 location.replace 重定向

javascript - 更新面板后 JS 被重置