1. <section style="display: flex; height: 117px;">
    2. <img src="./img/liao.jpg" alt="" id="img">
    3. <button id="btn" onclick="change()">btn</button>
    4. <canvas id="canvas" height="117 "></canvas>
    5. </section>
    6. <script>
    7. const img = document.getElementById('img')
    8. const canvas = document.getElementById('canvas')
    9. function rendenImg() {
    10. const can = canvas.getContext('2d');
    11. can.drawImage(img, 0, 0)
    12. /**
    13. * getImageData() 得到画布某一区域的图像信息
    14. * 从左上角 获取整张图像的信息
    15. */
    16. const imgData = can.getImageData(0, 0, img.width, img.height)
    17. console.log(imgData)
    18. // 获取Uint8ClampedArray 中存储的图像信息
    19. /**
    20. * Uint8ClampedArray 与 Uint8Array
    21. * Uint8ClampedArray 多拉些对图片的处理方式
    22. * 这里系统自动是使用Uint8ClampedArray 是因为rgb的最大值为255 而Uint8ClampedArray的最大值为255
    23. * 可以节省很多内存空间 ,普通数组需要 365kb储存这个图像,uint8需要45kb
    24. */
    25. const data = imgData.data
    26. /*
    27. * 画布中的1个图像是由多个像素点组成,每个像素点拥有4个数据:红、绿、蓝、alpha
    28. * 把一个图像变成黑白,只需要将图像的每个像素点设置成为红绿蓝的平均数即可
    29. */
    30. for (let i = 0; i < data.length; i += 4) {
    31. const r = data[i],
    32. g = data[i + 1],
    33. b = data[i + 2]
    34. const avg = (r + g + b) / 3
    35. data[i] = data[i + 1] = data[i + 2] = avg;
    36. }
    37. // 将图像数据设置到画布
    38. can.putImageData(imgData, 0, 0)
    39. }
    40. function change() {
    41. rendenImg()
    42. }

    image.png
    如图
    图像的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