canvas绘制灰度图片

博客介绍了图像由红、绿、蓝三个通道组成,通道缩览图以灰度显示,用不同灰度色阶表示三色比重,纯白代表最高亮度。还列举了浮点算法、整数方法等多种灰度化方法,将RGB中的R、G、B统一用Gray替换即可完成灰度化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一幅完整的图像,是由红色、绿色、蓝色三个通道组成的。红色、绿色、蓝色三个通道的缩览图都是以灰度显示的。用不同的灰度色阶来表示" 红,绿,蓝"在图像中的比重。通道中的纯白,代表了该色光在此处为最高亮度,亮度级别是255。

灰度化方法:

        1.浮点算法:Gray = R*0.299 + G*0.587 + B*0.114  

        2.整数方法:Gray = (R*299 + G*587 + B*114 + 500) / 1000 

        3.移位方法:Gray =(R*28+G*151+B*77)>>8;   

        4.平均值法:Gray=(R+G+B)/3;   

        5.仅取绿色:Gray=G;

        只要将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,形成新的RGB(Gray,Gray,Gray)就完成灰度化了;

 

代码如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

<!DOCTYPE html>

<html>

 <head>

 <meta charset="UTF-8">

 <title>ImgBase</title>

 <style type="text/css">

 .scream{

 width:400px;

 height:300px;

 position: absolute;

 top:60px;

 border: 1px solid;

 }

 #canvas{

 position: absolute;

 top:60px;

 left:500px;

 border: 1px dashed;

 }

 </style>

 </head>

 <body>

 <input type="file" onchange="loadImg()"/>

 <input type="button" value="灰度化" onclick="Convert256toGray()"/>

 <br/><br/>

 <div class="scream">

 <img id="scream" width="400px" height="300px" alt="Image preview...">

 </div>

 <canvas id="canvas" width="400px;" height="300px;">

 your browser does not support canvas!

 </canvas>

 <script>

 function Convert256toGray(){

 var c=document.getElementById("canvas");

 var ctx=c.getContext("2d");

 var imgData = ctx.getImageData(0,0,c_w,c_h);

 for (var i=0;i<imgData.data.length;i+=4)

  {

  var R = imgData.data[i]; //R(0-255)

  var G = imgData.data[i+1]; //G(0-255)

  var B = imgData.data[i+2]; //G(0-255)

  var Alpha = imgData.data[i+3]; //Alpha(0-255)

  //浮点算法

  var gray = R*0.299 + G*0.587 + B*0.114;

  //整数算法

//  var gray = (R*299 + G*587 + B*114 + 500) / 1000; 

  //移位算法

//  var gray =(R*76+G*151+B*28)>>8;

  //平均值算法

//   var gray = (R+G+B)/3;

  //仅取绿色

//  var gray=G;

   imgData.data[i] = gray;

   imgData.data[i+1] = gray;

   imgData.data[i+2] = gray;

   imgData.data[i+3] = Alpha;

  }

 ctx.putImageData(imgData,0,0);

 }

 </script>

 <!--base-->

 <script>

 //canvas图像的宽高

 var c_w = 400; var c_h = 300;

 //加载img图像

 function loadImg(){

 var img = document.getElementById("scream");

 var file = document.querySelector('input[type=file]').files[0];

 if(!/image\/\w+/.test(file.type)){

   alert("文件必须为图片!");

   return false;

  }

 var reader = new FileReader();

 reader.addEventListener("load", function () {

  img.src = reader.result;

 }, false);

 if(file) {

  reader.readAsDataURL(file);

  loadCanvas();

 }//文件加载监听方法(拓展)

 }

 //加载canvas图像

 function loadCanvas(){

 var c=document.getElementById("canvas");

 var ctx=c.getContext("2d");

 var img = document.getElementById("scream");

 img.onload = function() {

  ctx.drawImage(img,0,0,c_w,c_h);

 }

 }

 </script>

 </body>

</html>

在 HTML5 Canvas绘制图像可以通过多种方法实现,其中最常用的方式是使用 `drawImage()` 方法。此方法允许将图像、画布或视频元素绘制到画布上,并支持缩放、裁剪和定位操作。 ### 使用 `drawImage()` 方法 `drawImage()` 方法有三种主要调用方式: 1. **绘制完整图像** ```javascript ctx.drawImage(image, dx, dy); ``` - `image`:要绘制的图像对象(如 `HTMLImageElement`、`HTMLCanvasElement` 或 `HTMLVideoElement`)。 - `dx`:图像在画布上的起始 X 坐标。 - `dy`:图像在画布上的起始 Y 坐标。 2. **绘制缩放后的图像** ```javascript ctx.drawImage(image, dx, dy, dWidth, dHeight); ``` - `dWidth` 和 `dHeight`:指定图像在画布上绘制的宽度和高度。 3. **绘制图像的一部分(裁剪)** ```javascript ctx.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight); ``` - `sx` 和 `sy`:图像源区域的起始坐标。 - `sWidth` 和 `sHeight`:图像源区域的宽度和高度。 - `dx` 和 `dy`:图像在画布上的目标位置。 - `dWidth` 和 `dHeight`:图像在画布上绘制的尺寸。 例如,以下代码将图像加载到画布中,并进行缩放绘制: ```html <canvas id="myCanvas" width="800" height="600"></canvas> <script> const canvas = document.getElementById("myCanvas"); const ctx = canvas.getContext("2d"); const img = new Image(); img.src = "example.jpg"; // 替换为你的图片路径 img.onload = function () { ctx.drawImage(img, 0, 0, canvas.width, canvas.height); // 缩放绘制图像 }; </script> ``` ### 图像来源支持 HTML5 Canvas 支持多种图像来源,包括 PNG、JPEG、GIF 等格式,并且可以将其他 `<canvas>` 元素作为图像源使用[^3]。此外,还可以结合 `video` 元素实现动态图像绘制。 ### 绘制文本 除了图像,Canvas 还支持绘制文本内容,使用 `fillText()` 方法: ```javascript ctx.font = "30px Arial"; ctx.fillText("Hello World", 10, 50); ``` 该方法允许设置字体样式,并在指定坐标位置绘制文本内容[^4]。 ### 图像处理与扩展功能 一旦图像被绘制到画布上,可以进一步使用 `getImageData()` 和 `putImageData()` 方法对像素数据进行操作,实现图像滤镜、灰度转换、边缘检测等高级图像处理功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值