前端如何将 uint8Array 数据转换生成图片

4,470 阅读1分钟

前端

  • 一份 uint8Arrayuint8ClampedArray 数据
  • uint8Arrayuint8ClampedArray 对应的 widthheight

实现功能

  • 基于 uint8Arrayuint8ClampedArray 数据绘制图片
  • 基于 uint8Arrayuint8ClampedArray 数据绘制可等比缩放的图片
  • 基于 uint8Arrayuint8ClampedArray 转换生成 base64 格式图片

代码实现

  1. 基于 uint8Arrayuint8ClampedArray 数据绘制原图图片
const canvas: HTMLCanvasElement = document.createElement('canvas');
canvas.width = width
canvas.height = height
const cavansCtx: CanvasRenderingContext2D = canvas.getContext('2d');
const imgData = new ImageData(data, width, height);
/** 将原图绘制到 canvas 上 */
cavansCtx.putImageData(imgData, 0, 0);
  1. 基于 uint8Arrayuint8ClampedArray 数据绘制指定宽高的缩放图片
const canvas: HTMLCanvasElement = document.createElement('canvas');
canvas.width = width
canvas.height = height
const cavansCtx: CanvasRenderingContext2D = canvas.getContext('2d');
const imgData = new ImageData(data, width, height);
/** 将原图绘制到 canvas 上 */
cavansCtx.putImageData(imgData, 0, 0);

const canvas2: HTMLCanvasElement = document.createElement('canvas');
const cavans2Ctx: CanvasRenderingContext2D = canvas2.getContext('2d');
/** 基于原图的 canvas 绘制到另一个画布 canvas2 中  */
canvas2Ctx.value.drawImage(canvas, 0, 0, targetWidth, targetHeight);

由于 putImageData 只能裁剪图片宽高,不能等比缩放;drawImage 可以进行裁剪和缩放;因为 drawImage 只支持 CSSImageValue (en-US)HTMLImageElementSVGImageElement (en-US)HTMLVideoElementHTMLCanvasElementImageBitmap 或者OffscreenCanvas,所以只能通过 canvas 来充当一个替代角色

  1. 基于 uint8Arrayuint8ClampedArray 转换生成 base64 格式图片
const canvas: HTMLCanvasElement = document.createElement('canvas');
canvas.width = width
canvas.height = height
const cavansCtx: CanvasRenderingContext2D = canvas.getContext('2d');
const imgData = new ImageData(data, width, height);
/** 将原图绘制到 canvas 上 */
cavansCtx.putImageData(imgData, 0, 0);
const base64 = cavans.toDataURL('image/jpeg', 1.0);

参考资料