canvas基础—04像素

冷不防 2022-04-23 11:20 301阅读 0赞

1.像素_1

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ppYW9qc3Vu_size_16_color_FFFFFF_t_70

demo.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>canvas学习</title>
  6. <style>
  7. body{background: black}
  8. #c1{background: white}
  9. span{color: white}
  10. </style>
  11. <script type="text/javascript">
  12. window.onload = function(){
  13. var oC = document.getElementById('c1');
  14. var oGC = oC.getContext('2d');
  15. oGC.fillRect(0,0,100,100)
  16. var oImg= oGC.getImageData(0,0,100,100) //获取这个区域所有像素值
  17. console.log(oImg.width) //一行的像素个数 100
  18. console.log(oImg.height) //一列的像素个数 100
  19. console.log(oImg.data) //整体像素的数组集合 length 是40000 但是100*100 = 10000 为什么呢
  20. // 因为每个像素占四个位置(分别代表rgba) 所以10000 * 4就好理解了
  21. console.log(oImg.data[0]) //0 0-255 黑色到白色
  22. console.log(oImg.data[1]) //0 0-255 黑色到白色
  23. console.log(oImg.data[2]) //0 0-255 黑色到白色
  24. console.log(oImg.data[3]) //255 0-255 透明到不透明
  25. // putImageData设置新的图像
  26. for(var i=0;i<oImg.width*oImg.height;i++){
  27. // 红色的rgba(255,0,0,255)
  28. oImg.data[4*i] = 255
  29. oImg.data[4*i +1] = 0
  30. oImg.data[4*i +2] = 0
  31. oImg.data[4*i +3] = 255
  32. }
  33. oGC.putImageData(oImg,100,100)
  34. }
  35. </script>
  36. </head>
  37. <body>
  38. <canvas id="c1" width="400" height="400">
  39. <span>不支持canvas浏览器</span>
  40. </canvas>
  41. </body>
  42. </html>

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ppYW9qc3Vu_size_16_color_FFFFFF_t_70 1

2. 像素_2

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ppYW9qc3Vu_size_16_color_FFFFFF_t_70 2

demo.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>canvas学习</title>
  6. <style>
  7. body{background: black}
  8. #c1{background: white}
  9. span{color: white}
  10. </style>
  11. <script type="text/javascript">
  12. window.onload = function(){
  13. var oC = document.getElementById('c1');
  14. var oGC = oC.getContext('2d');
  15. var oImg= oGC.createImageData(100,100)
  16. for (var i = 0; i < oImg.width * oImg.height; i++) {
  17. oImg.data[4 * i] = 255
  18. oImg.data[4 * i + 1] = 0
  19. oImg.data[4 * i + 2] = 0
  20. oImg.data[4 * i + 3] = 255
  21. }
  22. oGC.putImageData(oImg,100,100)
  23. }
  24. </script>
  25. </head>
  26. <body>
  27. <canvas id="c1" width="400" height="400">
  28. <span>不支持canvas浏览器</span>
  29. </canvas>
  30. </body>
  31. </html>

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ppYW9qc3Vu_size_16_color_FFFFFF_t_70 3

小例子(像素显字)

需求:点击左侧文字,使其随机显示1/10的像素

demo.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>canvas学习</title>
  6. <style>
  7. body{background: black;color:white;font-size:30px;}
  8. #c1{background: white}
  9. span{color: white}
  10. </style>
  11. <script type="text/javascript">
  12. window.onload = function(){
  13. var oC = document.getElementById('c1');
  14. var oGC = oC.getContext('2d');
  15. var aLi = document.getElementsByTagName('li')
  16. for(var i=0;i<aLi.length;i++){
  17. aLi[i].onclick = function(){
  18. console.log('1')
  19. var str = this.innerHTML
  20. var h =180
  21. oGC.clearRect(0,0,oC.width,oC.height)
  22. oGC.font = h+'px impact'
  23. oGC.textBaseline = 'top'
  24. oGC.fillStyle = 'red'
  25. var w = oGC.measureText(str).width
  26. oGC.fillText(str,(oC.width - w)/2,(oC.height - h)/2)
  27. // 擦除文字的一半
  28. // 获取区域内所有的像素
  29. var oImg = oGC.getImageData((oC.width - w)/2,(oC.height - h)/2,w,h)
  30. oGC.clearRect(0,0,oC.width,oC.height)
  31. var arr = randomArr(w*h,w*h/10)
  32. var newImg = oGC.createImageData(w,h)
  33. for(var i=0;i<arr.length;i++){
  34. newImg.data[4*arr[i]] = oImg.data[4*arr[i]]
  35. newImg.data[4*arr[i]+1] = oImg.data[4*arr[i]+1]
  36. newImg.data[4*arr[i]+2] = oImg.data[4*arr[i]+2]
  37. newImg.data[4*arr[i]+3] = oImg.data[4*arr[i]+3]
  38. }
  39. oGC.putImageData(newImg,(oC.width - w)/2,(oC.height - h)/2)
  40. }
  41. }
  42. // 随机取的新数组
  43. function randomArr(iAll,iNow){
  44. var arr = []
  45. var newArr = []
  46. for(var i=0;i<iAll;i++){
  47. arr.push(i)
  48. }
  49. for(var i=0;i<iNow;i++){
  50. // 此处有坑 splice删除之后的返回值是一个数组eg[12],这里为什么不做处理呢,因为上面4*arr[i] 4*数组结果还是数字
  51. newArr.push(arr.splice(Math.floor(Math.random()*arr.length),1))
  52. }
  53. return newArr
  54. }
  55. }
  56. </script>
  57. </head>
  58. <body>
  59. <canvas id="c1" width="400" height="400">
  60. <span>不支持canvas浏览器</span>
  61. </canvas>
  62. <ul style="float:left">
  63. <li></li>
  64. <li></li>
  65. <li></li>
  66. <li></li>
  67. </ul>
  68. </body>
  69. </html>

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ppYW9qc3Vu_size_16_color_FFFFFF_t_70 4

需求升级:慢慢显示百分之10,百分之20等,最后变成一个实心的文字

demo.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>canvas学习</title>
  6. <style>
  7. body{background: black;color:white;font-size:30px;}
  8. #c1{background: white}
  9. span{color: white}
  10. </style>
  11. <script type="text/javascript">
  12. window.onload = function(){
  13. var oC = document.getElementById('c1');
  14. var oGC = oC.getContext('2d');
  15. var aLi = document.getElementsByTagName('li')
  16. for(var i=0;i<aLi.length;i++){
  17. aLi[i].onclick = function(){
  18. var str = this.innerHTML
  19. var h =180
  20. var timer = null
  21. clearInterval(timer)
  22. var iNow = 0
  23. oGC.clearRect(0,0,oC.width,oC.height)
  24. oGC.font = h+'px impact'
  25. oGC.textBaseline = 'top'
  26. oGC.fillStyle = 'red'
  27. var w = oGC.measureText(str).width
  28. oGC.fillText(str,(oC.width - w)/2,(oC.height - h)/2)
  29. // 擦除文字的一半
  30. // 获取区域内所有的像素
  31. var oImg = oGC.getImageData((oC.width - w)/2,(oC.height - h)/2,w,h)
  32. oGC.clearRect(0,0,oC.width,oC.height)
  33. var arr = randomArr(w*h,w*h/10)
  34. var newImg = oGC.createImageData(w,h)
  35. timer = setInterval(function () {
  36. for (var i = 0; i < arr[iNow].length; i++) {
  37. newImg.data[4 * arr[iNow][i]] = oImg.data[4 * arr[iNow][i]]
  38. newImg.data[4 * arr[iNow][i] + 1] = oImg.data[4 * arr[iNow][i] + 1]
  39. newImg.data[4 * arr[iNow][i] + 2] = oImg.data[4 * arr[iNow][i] + 2]
  40. newImg.data[4 * arr[iNow][i] + 3] = oImg.data[4 * arr[iNow][i] + 3]
  41. }
  42. oGC.putImageData(newImg, (oC.width - w) / 2, (oC.height - h) / 2)
  43. if(iNow == 9){
  44. iNow = 0
  45. clearInterval(timer)
  46. }else{
  47. iNow++
  48. }
  49. }, 200)
  50. }
  51. }
  52. // 随机取的新数组
  53. function randomArr(iAll,iNow){
  54. var arr = []
  55. var allArr = []
  56. for(var i=0;i<iAll;i++){
  57. arr.push(i)
  58. }
  59. // 将10个1/10分别存起来 是一个符合数组
  60. // iAll/iNow = 10
  61. for (var j = 0; j < iAll / iNow; j++) {
  62. var newArr = []
  63. for (var i = 0; i < iNow; i++) {
  64. // 此处有坑 splice删除之后的返回值是一个数组eg[12],这里为什么不做处理呢,因为上面4*arr[i] 4*数组结果还是数字
  65. newArr.push(arr.splice(Math.floor(Math.random() * arr.length), 1))
  66. }
  67. allArr.push(newArr)
  68. }
  69. console.log('allArr-------------')
  70. console.log(allArr)
  71. return allArr
  72. }
  73. }
  74. </script>
  75. </head>
  76. <body>
  77. <canvas id="c1" width="400" height="400">
  78. <span>不支持canvas浏览器</span>
  79. </canvas>
  80. <ul style="float:left">
  81. <li></li>
  82. <li></li>
  83. <li></li>
  84. <li></li>
  85. </ul>
  86. </body>
  87. </html>

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ppYW9qc3Vu_size_16_color_FFFFFF_t_70 5

为了便于理解,帮 allArr打印出来看看

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ppYW9qc3Vu_size_16_color_FFFFFF_t_70 6

其实这样写很耗费性能,可以考虑一下webworker

发表评论

表情:
评论列表 (有 0 条评论,301人围观)

还没有评论,来说两句吧...

相关阅读