当前位置:网站首页>Chapter 8 pixel operation of canvas

Chapter 8 pixel operation of canvas

2022-06-29 14:37:00 yxqq378287007

The first 8 Chapter Pixel operation

8.1 Introduction to pixel operation

getImageData() and putImageData() Method to perform image pixel operation .

8.1.1 getImageData() Method

Get picture pixel data .

var imgData = cxt.getImageData(x, y, width, height);
var data = imgData.data;

imagData,canvasPixelArray object .
data, Array ,[r1, g1, b1, a1, …].

8.1.2 putImageData() Method

stay canvas Show pictures in .

cxt.putImageData(image, x, y);

8.1.3 getImageData() and putImageData() Method

getImageData() and putImageData() Not affected by coordinate system transformation .

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <meta charset="utf-8" />
    <script type="text/javascript"> function $$(id) {
       return document.getElementById(id); } window.onload = function () {
       var cnv = $$("canvas"); var cxt = cnv.getContext("2d"); //cxt.save(); cxt.translate(50, 50); cxt.fillStyle = "green" cxt.fillRect(0, 0, 50, 200); cxt.rotate(-30 * Math.PI / 180) cxt.fillStyle = "blue" cxt.fillRect(0, 0, 50, 200); //cxt.restore cxt.strokeStyle = "red" cxt.strokeRect(50, 50, 50, 50); var data = cxt.getImageData(50, 50, 50, 50); cxt.putImageData(data, 200, 100); } </script>
</head>
<body>
    <canvas id="canvas" width="400" height="300" style="border:1px dashed gray;"></canvas>
</body>
</html>

8.2 Inverse effect

Color reversal , The pixels take the opposite value .

for(var i=0; i<data.length; i+=4) {
	data[i+0] = 255-data[i+0];
	data[i+1] = 255-data[i+1];
	data[i+2] = 255-data[i+2];
}
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <meta charset="utf-8" />
    <script type="text/javascript"> function $$(id) {
       return document.getElementById(id); } window.onload = function () {
       var cnv = $$("canvas"); var cxt = cnv.getContext("2d"); var image = new Image(); image.src = "images/princess.png"; image.onload = function () {
       cxt.drawImage(image, 10, 10); var imgData = cxt.getImageData(10, 10, 120, 120); var data = imgData.data; // Traverse every pixel  for (var i = 0; i < data.length; i += 4) {
       data[i + 0] = 255 - data[i + 0]; data[i + 1] = 255 - data[i + 1]; data[i + 2] = 255 - data[i + 2]; } // Output the picture at the specified position  cxt.putImageData(imgData, 140, 10); } } </script>
</head>
<body>
    <canvas id="canvas" width="300" height="150" style="border:1px dashed gray;"></canvas>
</body>
</html>
  • Data tailoring
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <meta charset="utf-8" />
    <script type="text/javascript"> function $$(id) {
       return document.getElementById(id); } window.onload = function () {
       var cnv = $$("canvas"); var cxt = cnv.getContext("2d"); var image = new Image(); image.src = "images/princess.png"; image.onload = function () {
       cxt.drawImage(image, 10, 10); var imgData = cxt.getImageData(10, 10, 60, 120); var data = imgData.data; // Traverse every pixel  for (var i = 0; i < data.length; i += 4) {
       data[i + 0] = 255 - data[i + 0]; data[i + 1] = 255 - data[i + 1]; data[i + 2] = 255 - data[i + 2]; } // Output the picture at the specified position  cxt.putImageData(imgData, 140, 10); } } </script>
</head>
<body>
    <canvas id="canvas" width="250" height="150" style="border:1px dashed gray;"></canvas>
</body>
</html>

8.3 Black and white effect

grayscale (average), Convert color pictures to black and white pictures .

for(var i=0; i<data.length; i+=4) {
	var average = (data[i+0]+data[i+1]+data[i+2]) / 3;
	data[i+0] = average;
	data[i+1] = average;
	data[i+2] = average;
}
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <meta charset="utf-8" />
    <script type="text/javascript"> function $$(id) {
       return document.getElementById(id); } window.onload = function () {
       var cnv = $$("canvas"); var cxt = cnv.getContext("2d"); var image = new Image(); image.src = "images/princess.png"; image.onload = function () {
       cxt.drawImage(image, 10, 10); var imgData = cxt.getImageData(10, 10, 120, 120); var data = imgData.data; // Traverse every pixel  for (var i = 0; i < data.length; i += 4) {
       var average = (data[i+0]+data[i+1]+data[i+2]) / 3; data[i+0] = average; data[i+1] = average; data[i+2] = average; } // Output the picture at the specified position  cxt.putImageData(imgData, 140, 10); } } </script>
</head>
<body>
    <canvas id="canvas" width="300" height="150" style="border:1px dashed gray;"></canvas>
</body>
</html>
  • weighted mean
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <meta charset="utf-8" />
    <script type="text/javascript"> function $$(id) {
       return document.getElementById(id); } window.onload = function () {
       var cnv = $$("canvas"); var cxt = cnv.getContext("2d"); var image = new Image(); image.src = "images/princess.png"; image.onload = function () {
       cxt.drawImage(image, 10, 10); var imgData = cxt.getImageData(10, 10, 120, 120); var data = imgData.data; // Traverse every pixel  for (var i = 0; i < data.length; i += 4) {
       var grayscale = data[i+0]*0.3+data[i+1]*0.6+data[i+2]*0.1; data[i+0] = grayscale; data[i+1] = grayscale; data[i+2] = grayscale; } // Output the picture at the specified position  cxt.putImageData(imgData, 140, 10); } } </script>
</head>
<body>
    <canvas id="canvas" width="300" height="150" style="border:1px dashed gray;"></canvas>
</body>
</html>

8.4 Brightness effect

The picture becomes brighter or darker , Plus minus value .

var a = -50;
for(var i=0; i<data.length; i+=4) {
	data[i+0] += a;
	data[i+1] += a;
	data[i+2] += a;
}
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <meta charset="utf-8" />
    <script type="text/javascript"> function $$(id) {
       return document.getElementById(id); } window.onload = function () {
       var cnv = $$("canvas"); var cxt = cnv.getContext("2d"); var image = new Image(); image.src = "images/princess.png"; image.onload = function () {
       cxt.drawImage(image, 10, 10); var imgData = cxt.getImageData(10, 10, 120, 120); var data = imgData.data; // Traverse every pixel  for (var i = 0; i < data.length; i += 4) {
       var a = 50; data[i + 0] += a; data[i + 1] += a; data[i + 2] += a; } // Output the picture at the specified position  cxt.putImageData(imgData, 140, 10); } } </script>
</head>
<body>
    <canvas id="canvas" width="300" height="150" style="border:1px dashed gray;"></canvas>
</body>
</html>

8.5 Retro effect

sepia, Antique effect , weighted mean .

for(var i=0; i<data.length; i+=4) {
	var r = data[i+0];
	var g = data[i+1];
	var b = data[i+2];
	data[i+0] = r*0.39+g*0.76+b*0.18;
	data[i+1] = r*0.35+g*0.68+b*0.16;
	data[i+2] = r*0.27+g*0.53+b*0.13;
}
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <meta charset="utf-8" />
    <script type="text/javascript"> function $$(id) {
       return document.getElementById(id); } window.onload = function () {
       var cnv = $$("canvas"); var cxt = cnv.getContext("2d"); var image = new Image(); image.src = "images/princess.png"; image.onload = function () {
       cxt.drawImage(image, 10, 10); var imgData = cxt.getImageData(10, 10, 120, 120); var data = imgData.data; // Traverse every pixel  for (var i = 0; i < data.length; i += 4) {
       var r = data[i + 0]; var g = data[i + 1]; var b = data[i + 2]; data[i + 0] = r * 0.39 + g * 0.76 + b * 0.18; data[i + 1] = r * 0.35 + g * 0.68 + b * 0.16; data[i + 2] = r * 0.27 + g * 0.53 + b * 0.13; } // Output the picture at the specified position  cxt.putImageData(imgData, 140, 10); } } </script>
</head>
<body>
    <canvas id="canvas" width="300" height="150" style="border:1px dashed gray;"></canvas>
</body>
</html>

8.6 Red mask

The red effect of the picture .r take rgb Average ,g,b take 0.

for(var i=0; i<data.length; i+=4) {
	var r = data[i+0];
	var g = data[i+1];
	var b = data[i+2];
	var average = (r+g+b)/3;
	data[i+0] = average;
	data[i+1] = 0;
	data[i+2] = 0;
}
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <meta charset="utf-8" />
    <script type="text/javascript"> function $$(id) {
       return document.getElementById(id); } window.onload = function () {
       var cnv = $$("canvas"); var cxt = cnv.getContext("2d"); var image = new Image(); image.src = "images/princess.png"; image.onload = function () {
       cxt.drawImage(image, 10, 10); var imgData = cxt.getImageData(10, 10, 120, 120); var data = imgData.data; // Traverse every pixel  for (var i = 0; i < data.length; i += 4) {
       var r = data[i + 0]; var g = data[i + 1]; var b = data[i + 2]; var average = (r + g + b) / 3; data[i + 0] = average; data[i + 1] = 0; data[i + 2] = 0; } // Output the picture at the specified position  cxt.putImageData(imgData, 140, 10); } } </script>
</head>
<body>
    <canvas id="canvas" width="300" height="150" style="border:1px dashed gray;"></canvas>
</body>
</html>

8.7 Transparency

Transparency times n.

var n = 0.3;
for(var i=0; i<data.length; i+=4) {
	data[i+3] *= n;
}

n Value range 0.0~1.0.

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <meta charset="utf-8" />
    <script type="text/javascript"> function $$(id) {
       return document.getElementById(id); } window.onload = function () {
       var cnv = $$("canvas"); var cxt = cnv.getContext("2d"); var image = new Image(); image.src = "images/princess.png"; image.onload = function () {
       cxt.drawImage(image, 10, 10); var imgData = cxt.getImageData(10, 10, 120, 120); var data = imgData.data; // Traverse every pixel  for (var i = 0; i < data.length; i += 4) {
       data[i + 3] = data[i + 3] * 0.3; } // Output the picture at the specified position  cxt.putImageData(imgData, 140, 10); } } </script>
</head>
<body>
    <canvas id="canvas" width="300" height="150" style="border:1px dashed gray;"></canvas>
</body>
</html>

8.8 createImageData() Method

Create an area for pixel operation .

  • createImageData(sw, sh)
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <meta charset="utf-8" />
    <script type="text/javascript"> function $$(id) {
       return document.getElementById(id); } window.onload = function () {
       var cnv = $$("canvas"); var cxt = cnv.getContext("2d"); var imgData = cxt.createImageData(100, 100); var data = imgData.data; for (var i = 0; i < 100 * 100 * 4; i += 4) {
       data[i + 0] = 0; data[i + 1] = 0; data[i + 2] = 255; data[i + 3] = 255; } cxt.putImageData(imgData, 20, 20); } </script>
</head>
<body>
    <canvas id="canvas" width="200" height="150" style="border:1px dashed gray;"></canvas>
</body>
</html>
  • createImageData(imageData)
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <meta charset="utf-8" />
    <script type="text/javascript"> function $$(id) {
       return document.getElementById(id); } window.onload = function () {
       var cnv = $$("canvas"); var cxt = cnv.getContext("2d"); var image = new Image(); image.src = "images/princess.png"; image.onload = function () {
       cxt.drawImage(image, 0, 0, 60, 60); // Get a picture of imgData var imgData1 = cxt.getImageData(0, 0, 60, 60); // Using this picture imgData As a parameter  var imgData2 = cxt.createImageData(imgData1); var data = imgData2.data; for (var i = 0; i < imgData2.width * imgData2.height * 4; i += 4) {
       data[i + 0] = 0; data[i + 1] = 0; data[i + 2] = 255; data[i + 3] = 255; } cxt.putImageData(imgData2, 80, 0); } } </script>
</head>
<body>
    <canvas id="canvas" width="200" height="150" style="border:1px dashed gray;"></canvas>
</body>
</html>
原网站

版权声明
本文为[yxqq378287007]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/180/202206291355235344.html