如何从 jpeg 或 png 格式的字节数组在画布上绘制图像

Posted

技术标签:

【中文标题】如何从 jpeg 或 png 格式的字节数组在画布上绘制图像【英文标题】:How to Draw an image on canvas from a byte array in jpeg or png format 【发布时间】:2014-02-21 10:31:00 【问题描述】:

正如标题所说,我有一个表示图像内容的字节数组(可以是 jpeg 或 png)。

我想在普通的画布对象上绘制它

<canvas id='thecanvas'></canvas>

我该怎么做?


更新我试过这个(不成功): (imgData 是通过 WebSockify “按原样”作为字节数组发送到客户端的 png)

function draw(imgData) 
    "use strict";

    var canvas = document.getElementById("myCanvas");
    var ctx = canvas.getContext("2d");
    var rdr = new FileReader();
    var imgBlob = new Blob([imgData], type: "image/png");
    rdr.readAsBinaryString(imgBlob);

    rdr.onload = function (data) 
        console.log("Filereader success");
        var img = new Image();
        img.onload = function () 
            console.log("Image Onload");
            ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
        ;
        img.onerror = function (stuff) 
            console.log("Img Onerror:", stuff);
        ;
        img.src = "data:image/png;base64," + window.btoa(rdr.result);
    ;


我总是联系img.onerror()

另外在我的文件系统上使用 HEX 编辑器读取文件后,我可以看到字节数组与原始文件相同。

【问题讨论】:

你看到了吗:***.com/questions/12041851/… ? @HaunsTM 不!谢谢。我正在调查那个。如果这解决了我的问题,我将删除问题 您需要告诉我们一些关于您的字节数组的格式:它是原始像素吗?在这种情况下,它们是如何排序的(RGB、RGBA、BGR 等),如果不是,是它们代表编码的图像,如果是,则使用哪种编码(Base-64,原始压缩 JPEG/PNG)? @Ken 我确定它是一个在客户端读取并“按原样”发送的 png 文件。它通过服务器端的 WebSockify 传递(作为代理),我不确定 WebSockify 用它做什么。 在告诉浏览器您要发送 JPEG 文件之前,您要请求并编码一个 PNG 文件,是否值得一提? 【参考方案1】:

这个作品:

function draw2(imgData, coords) 
    "use strict";
    var canvas = document.getElementById("myCanvas");
    var ctx = canvas.getContext("2d");

    //var uInt8Array = new Uint8Array(imgData);
    var uInt8Array = imgData;
    var i = uInt8Array.length;
    var binaryString = [i];
    while (i--) 
        binaryString[i] = String.fromCharCode(uInt8Array[i]);
    
    var data = binaryString.join('');

    var base64 = window.btoa(data);

    var img = new Image();
    img.src = "data:image/png;base64," + base64;
    img.onload = function () 
        console.log("Image Onload");
        ctx.drawImage(img, coords[0], coords[1], canvas.width, canvas.height);
    ;
    img.onerror = function (stuff) 
        console.log("Img Onerror:", stuff);
    ;


【讨论】:

这实际上可行,但如果我想保持原始图像的比例怎么办? 完成,您可以测量图像并进行数学计算,谢谢 我从画布中删除了宽度/高度属性,并在绘制图像之前将它们设置在 onload 方法中,这将图像从 300x150 正确缩放到 640x480。最初图像仅以 300x150 显示,即使浏览器认为它是 640x480。: image.onload = function() canvas.width = image.width;画布.高度=图像.高度; context.drawImage(image,0,0, canvas.width, canvas.height); 坐标未定义?

以上是关于如何从 jpeg 或 png 格式的字节数组在画布上绘制图像的主要内容,如果未能解决你的问题,请参考以下文章

PHP图片处理之图片背景画布操作

将内存流转换为数组但仅采用指定数量的元素

如何才能将jpg格式的图片转化成png格式的

JPEG、GIF、PNG、BMP哪种图片格式的图片清晰一点?

如何使用干预图像laravel将webp图像转换为jpeg或png

将 SVG 转换为 PNG/JPEG,而不在无服务器函数中使用画布