<section style="display: flex; height: 117px;">
<img src="./img/liao.jpg" alt="" id="img">
<button id="btn" onclick="change()">btn</button>
<canvas id="canvas" height="117 "></canvas>
</section>
<script>
const img = document.getElementById('img')
const canvas = document.getElementById('canvas')
function rendenImg() {
const can = canvas.getContext('2d');
can.drawImage(img, 0, 0)
/**
* getImageData() 得到画布某一区域的图像信息
* 从左上角 获取整张图像的信息
*/
const imgData = can.getImageData(0, 0, img.width, img.height)
console.log(imgData)
// 获取Uint8ClampedArray 中存储的图像信息
/**
* Uint8ClampedArray 与 Uint8Array
* Uint8ClampedArray 多拉些对图片的处理方式
* 这里系统自动是使用Uint8ClampedArray 是因为rgb的最大值为255 而Uint8ClampedArray的最大值为255
* 可以节省很多内存空间 ,普通数组需要 365kb储存这个图像,uint8需要45kb
*/
const data = imgData.data
/*
* 画布中的1个图像是由多个像素点组成,每个像素点拥有4个数据:红、绿、蓝、alpha
* 把一个图像变成黑白,只需要将图像的每个像素点设置成为红绿蓝的平均数即可
*/
for (let i = 0; i < data.length; i += 4) {
const r = data[i],
g = data[i + 1],
b = data[i + 2]
const avg = (r + g + b) / 3
data[i] = data[i + 1] = data[i + 2] = avg;
}
// 将图像数据设置到画布
can.putImageData(imgData, 0, 0)
}
function change() {
rendenImg()
}
如图
图像的height = 117 width = 100 那这个图像所需要的像素点为 11700 可是一个像素点需要四个数据 就需要46800个数据,这也是Uint8ClampedArray中数据的长度
数组的长度 46800
假设是使用普通数组存储
·数组的每一项为64位
占用内存空间为: 46800 *64 =2995200
字节数: 2295200 / 8 = 374400
所需要的kb: 374400 / 1024 = 365.625kb
使用uint8
占用空间: 46800
字节数:46800
所需要的的kb: 46800 /1024 = 45.703125kb