javascript - 如何获取使用 XMLHttpRequest (XHR2) 下载的 PNG 的像素数据

标签 javascript xmlhttprequest xmlhttprequest-level2

我使用的代码来自 https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Sending_and_Receiving_Binary_Data

var oReq = new XMLHttpRequest();
oReq.open("GET", "/myfile.png", true);
oReq.responseType = "arraybuffer";

oReq.onload = function (oEvent) {
  var arrayBuffer = oReq.response; // Note: not oReq.responseText
  if (arrayBuffer) {
    var byteArray = new Uint8Array(arrayBuffer);
    for (var i = 0; i < byteArray.byteLength; i++) {
      // do something with each byte in the array
    }
  }
};

oReq.send(null);

我正在使用它下载一个 png 文件,然后我想将其显示在 Canvas 元素中。我意识到有更简单的方法可以做到这一点,但我需要能够操纵像素,所以我真的很想将像素数据放在 TypedArray 中,我也尝试使用常规 DOM Image 对象加载它,将其绘制到canvas 并使用 getImageData() 但它太慢了(它是一个大图像) - 所以现在我正在尝试这种方法,我从负载中得到的是我假设的压缩数据,所以我的问题是 - 有没有一种快速的方法解压缩/膨胀此数据以获得图像像素数据,或者我尝试这个完全错误?

最佳答案

你可以制作一个base64并设置为图像的src...如下所示

var oReq = new XMLHttpRequest();
oReq.open("GET", "https://npmjs.org/static/npm.png", true);
oReq.responseType = "arraybuffer";

oReq.onload = function (oEvent) {

  var arrayBuffer = oReq.response; // Note: not oReq.responseText
  var binaryString = '';

  if (arrayBuffer) {

    var byteArray = new Uint8Array(arrayBuffer);

    for (var i = 0; i < byteArray.byteLength; i++) {

      binaryString += String.fromCharCode( byteArray [ i ] ); //extracting the bytes

    }

    var base64 = window.btoa( binaryString ); //creating base64 string


    img.src = "data:image/png;base64," + base64; //creating a base64 uri

  }
};

oReq.send(null);

一个正在工作的 jsfiddle... -> http://jsfiddle.net/Castrolol/mHv4b/

关于javascript - 如何获取使用 XMLHttpRequest (XHR2) 下载的 PNG 的像素数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18522687/

相关文章:

internet-explorer - IE11 - 如果 block 数据大于 4kiB,则不会触发 XMLHttpRequest 级别 2 onprogress 事件

javascript - 右键单击信息框不起作用

google-chrome - XMLHttpRequest 使用用户名/密码发送 GET HTTP 请求

JavaScript:使用 lodash 在相同的嵌套键之间进行过滤

google-chrome - Chrome 和其他浏览器会放弃对同步 XMLHttpRequest 的支持吗?

javascript - 如何用javascript检测err_name_not_resolved?

Javascript For 循环减慢进度事件监听器触发

jquery - 在 IE 10 中成功执行 XMLHttpRequest 后,无法立即通过 .Ajax 发布到新的操作方法

javascript - 菜单栏下推正文,链接未正确对齐

javascript - 当用户单击“保存”时,如何使用输入字段将图像转换为 Base64