1e41f4b71Sopenharmony_ci# OffscreenCanvasRenderingContext2D对象 2e41f4b71Sopenharmony_ci 3e41f4b71Sopenharmony_ci> **说明:** 4e41f4b71Sopenharmony_ci> 从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 5e41f4b71Sopenharmony_ci 6e41f4b71Sopenharmony_ci 7e41f4b71Sopenharmony_ci使用OffscreenCanvasRenderingContext2D在[OffscreenCanvas对象](js-components-canvas-offscreencanvas.md)上进行绘制,绘制对象可以是矩形、文本、图片等 8e41f4b71Sopenharmony_ci 9e41f4b71Sopenharmony_ci 10e41f4b71Sopenharmony_ci## 属性 11e41f4b71Sopenharmony_ci 12e41f4b71Sopenharmony_ci除支持与[CanvasRenderingContext2D对象](js-components-canvas-canvasrenderingcontext2d.md)相同的属性外,还支持如下属性: 13e41f4b71Sopenharmony_ci 14e41f4b71Sopenharmony_ci| 属性 | 类型 | 描述 | 15e41f4b71Sopenharmony_ci| ------ | ------ | ---------------------------------------- | 16e41f4b71Sopenharmony_ci| filter | string | 设置图像的滤镜。<br/>支持的滤镜效果如下:<br/>- blur:给图像设置高斯模糊<br/>- brightness:给图片应用一种线性乘法,使其看起来更亮或更暗<br/>- contrast:调整图像的对比度<br/>- drop-shadow:给图像设置一个阴影效果<br/>- grayscale:将图像转换为灰度图像<br/>- hue-rotate:给图像应用色相旋转<br/>- invert:反转输入图像<br/>- opacity:转化图像的透明程度<br/>- saturate:转换图像饱和度<br/>- sepia:将图像转换为深褐色 | 17e41f4b71Sopenharmony_ci 18e41f4b71Sopenharmony_ci**示例:** 19e41f4b71Sopenharmony_ci```html 20e41f4b71Sopenharmony_ci<!-- xxx.hml --> 21e41f4b71Sopenharmony_ci<div style="width: 500px; height: 500px;"> 22e41f4b71Sopenharmony_ci <canvas ref="canvasId" style="width: 500px; height: 500px; background-color: #ffff00;"></canvas> 23e41f4b71Sopenharmony_ci</div> 24e41f4b71Sopenharmony_ci``` 25e41f4b71Sopenharmony_ci 26e41f4b71Sopenharmony_ci```js 27e41f4b71Sopenharmony_ci// xxx.js 28e41f4b71Sopenharmony_ciexport default { 29e41f4b71Sopenharmony_ci onShow(){ 30e41f4b71Sopenharmony_ci var ctx = this.$refs.canvasId.getContext('2d'); 31e41f4b71Sopenharmony_ci var offscreen = new OffscreenCanvas(360, 500); 32e41f4b71Sopenharmony_ci var offCanvas2 = offscreen.getContext("2d"); 33e41f4b71Sopenharmony_ci var img = new Image(); 34e41f4b71Sopenharmony_ci img.src = 'common/images/flower.jpg'; 35e41f4b71Sopenharmony_ci offCanvas2.drawImage(img, 0, 0, 100, 100); 36e41f4b71Sopenharmony_ci offCanvas2.filter = 'blur(5px)'; 37e41f4b71Sopenharmony_ci offCanvas2.drawImage(img, 100, 0, 100, 100); 38e41f4b71Sopenharmony_ci 39e41f4b71Sopenharmony_ci offCanvas2.filter = 'grayscale(50%)'; 40e41f4b71Sopenharmony_ci offCanvas2.drawImage(img, 200, 0, 100, 100); 41e41f4b71Sopenharmony_ci 42e41f4b71Sopenharmony_ci offCanvas2.filter = 'hue-rotate(90deg)'; 43e41f4b71Sopenharmony_ci offCanvas2.drawImage(img, 0, 100, 100, 100); 44e41f4b71Sopenharmony_ci 45e41f4b71Sopenharmony_ci offCanvas2.filter = 'invert(100%)'; 46e41f4b71Sopenharmony_ci offCanvas2.drawImage(img, 100, 100, 100, 100); 47e41f4b71Sopenharmony_ci 48e41f4b71Sopenharmony_ci offCanvas2.filter = 'drop-shadow(8px 8px 10px green)'; 49e41f4b71Sopenharmony_ci offCanvas2.drawImage(img, 200, 100, 100, 100); 50e41f4b71Sopenharmony_ci 51e41f4b71Sopenharmony_ci offCanvas2.filter = 'brightness(0.4)'; 52e41f4b71Sopenharmony_ci offCanvas2.drawImage(img, 0, 200, 100, 100); 53e41f4b71Sopenharmony_ci 54e41f4b71Sopenharmony_ci offCanvas2.filter = 'opacity(25%)'; 55e41f4b71Sopenharmony_ci offCanvas2.drawImage(img, 100, 200, 100, 100); 56e41f4b71Sopenharmony_ci 57e41f4b71Sopenharmony_ci offCanvas2.filter = 'saturate(30%)'; 58e41f4b71Sopenharmony_ci offCanvas2.drawImage(img, 200, 200, 100, 100); 59e41f4b71Sopenharmony_ci 60e41f4b71Sopenharmony_ci offCanvas2.filter = 'sepia(60%)'; 61e41f4b71Sopenharmony_ci offCanvas2.drawImage(img, 0, 300, 100, 100); 62e41f4b71Sopenharmony_ci 63e41f4b71Sopenharmony_ci offCanvas2.filter = 'contrast(200%)'; 64e41f4b71Sopenharmony_ci offCanvas2.drawImage(img, 100, 300, 100, 100); 65e41f4b71Sopenharmony_ci var bitmap = offscreen.transferToImageBitmap(); 66e41f4b71Sopenharmony_ci ctx.transferFromImageBitmap(bitmap); 67e41f4b71Sopenharmony_ci } 68e41f4b71Sopenharmony_ci} 69e41f4b71Sopenharmony_ci``` 70e41f4b71Sopenharmony_ci 71e41f4b71Sopenharmony_ci## 方法 72e41f4b71Sopenharmony_ci 73e41f4b71Sopenharmony_ci除支持与CanvasRenderingContext2D对象相同的方法外,还支持如下方法: 74e41f4b71Sopenharmony_ci 75e41f4b71Sopenharmony_ci 76e41f4b71Sopenharmony_ci### isPointInPath 77e41f4b71Sopenharmony_ci 78e41f4b71Sopenharmony_ciisPointInPath(path?: Path2D, x: number, y: number): boolean 79e41f4b71Sopenharmony_ci 80e41f4b71Sopenharmony_ci判断指定点是否在路径的区域内。 81e41f4b71Sopenharmony_ci 82e41f4b71Sopenharmony_ci**参数:** 83e41f4b71Sopenharmony_ci| 参数名 | 参数类型 | 必填 | 描述 | 84e41f4b71Sopenharmony_ci| ---- | ------ | ---- | ----------------------------- | 85e41f4b71Sopenharmony_ci| path | Path2D | 否 | 可选对象,指定用来判断的路径。若没有设置,则使用当前路径。 | 86e41f4b71Sopenharmony_ci| x | number | 是 | 待判断点的x轴坐标。 | 87e41f4b71Sopenharmony_ci| y | number | 是 | 待判断点的y轴坐标。 | 88e41f4b71Sopenharmony_ci 89e41f4b71Sopenharmony_ci**返回值:** 90e41f4b71Sopenharmony_ci| 类型 | 说明 | 91e41f4b71Sopenharmony_ci| ------- | ------------- | 92e41f4b71Sopenharmony_ci| boolean | 指定点是否在路径的区域内。 | 93e41f4b71Sopenharmony_ci 94e41f4b71Sopenharmony_ci**示例:** 95e41f4b71Sopenharmony_ci```html 96e41f4b71Sopenharmony_ci<!-- xxx.hml --> 97e41f4b71Sopenharmony_ci<div class="container" style="width: 500px; height: 500px;"> 98e41f4b71Sopenharmony_ci <text class="textsize">In path:{{textValue}}</text> 99e41f4b71Sopenharmony_ci <canvas ref="canvas" style="width: 500px; height: 500px; background-color: #ffff00;"></canvas> 100e41f4b71Sopenharmony_ci</div> 101e41f4b71Sopenharmony_ci``` 102e41f4b71Sopenharmony_ci 103e41f4b71Sopenharmony_ci```css 104e41f4b71Sopenharmony_ci/* xxx.css */ 105e41f4b71Sopenharmony_ci.container { 106e41f4b71Sopenharmony_ci display: flex; 107e41f4b71Sopenharmony_ci flex-direction: column; 108e41f4b71Sopenharmony_ci background-color: #F1F3F5; 109e41f4b71Sopenharmony_ci align-items: center; 110e41f4b71Sopenharmony_ci justify-content: center; 111e41f4b71Sopenharmony_ci width: 100%; 112e41f4b71Sopenharmony_ci height: 100%; 113e41f4b71Sopenharmony_ci} 114e41f4b71Sopenharmony_ci 115e41f4b71Sopenharmony_cicanvas { 116e41f4b71Sopenharmony_ci width: 600px; 117e41f4b71Sopenharmony_ci height: 600px; 118e41f4b71Sopenharmony_ci background-color: #fdfdfd; 119e41f4b71Sopenharmony_ci border: none; 120e41f4b71Sopenharmony_ci} 121e41f4b71Sopenharmony_ci 122e41f4b71Sopenharmony_ci.textsize { 123e41f4b71Sopenharmony_ci font-size: 40px; 124e41f4b71Sopenharmony_ci} 125e41f4b71Sopenharmony_ci``` 126e41f4b71Sopenharmony_ci 127e41f4b71Sopenharmony_ci```js 128e41f4b71Sopenharmony_ci// xxx.js 129e41f4b71Sopenharmony_ciexport default { 130e41f4b71Sopenharmony_ci data: { 131e41f4b71Sopenharmony_ci textValue: 0 132e41f4b71Sopenharmony_ci }, 133e41f4b71Sopenharmony_ci onShow(){ 134e41f4b71Sopenharmony_ci var canvas = this.$refs.canvas.getContext('2d'); 135e41f4b71Sopenharmony_ci var offscreen = new OffscreenCanvas(500,500); 136e41f4b71Sopenharmony_ci var offscreenCanvasCtx = offscreen.getContext("2d"); 137e41f4b71Sopenharmony_ci 138e41f4b71Sopenharmony_ci offscreenCanvasCtx.rect(10, 10, 100, 100); 139e41f4b71Sopenharmony_ci offscreenCanvasCtx.fill(); 140e41f4b71Sopenharmony_ci this.textValue = offscreenCanvasCtx.isPointInPath(30, 70); 141e41f4b71Sopenharmony_ci 142e41f4b71Sopenharmony_ci var bitmap = offscreen.transferToImageBitmap(); 143e41f4b71Sopenharmony_ci canvas.transferFromImageBitmap(bitmap); 144e41f4b71Sopenharmony_ci } 145e41f4b71Sopenharmony_ci} 146e41f4b71Sopenharmony_ci``` 147e41f4b71Sopenharmony_ci 148e41f4b71Sopenharmony_ci 149e41f4b71Sopenharmony_ci 150e41f4b71Sopenharmony_ci### isPointInStroke 151e41f4b71Sopenharmony_ci 152e41f4b71Sopenharmony_ciisPointInStroke(path?: Path2D, x: number, y: number): boolean 153e41f4b71Sopenharmony_ci 154e41f4b71Sopenharmony_ci判断指定点是否在路径的边缘线上。 155e41f4b71Sopenharmony_ci 156e41f4b71Sopenharmony_ci**参数:** 157e41f4b71Sopenharmony_ci| 参数名 | 参数类型 | 必填 | 描述 | 158e41f4b71Sopenharmony_ci| ---- | ------ | ---- | ----------------------------- | 159e41f4b71Sopenharmony_ci| path | Path2D | 否 | 可选对象,指定用来判断的路径。若没有设置,则使用当前路径。 | 160e41f4b71Sopenharmony_ci| x | number | 是 | 待判断点的x轴坐标。 | 161e41f4b71Sopenharmony_ci| y | number | 是 | 待判断点的y轴坐标。 | 162e41f4b71Sopenharmony_ci 163e41f4b71Sopenharmony_ci**返回值:** 164e41f4b71Sopenharmony_ci| 类型 | 说明 | 165e41f4b71Sopenharmony_ci| ------- | ------------- | 166e41f4b71Sopenharmony_ci| boolean | 指定点是否在路径的区域内。 | 167e41f4b71Sopenharmony_ci 168e41f4b71Sopenharmony_ci**示例:** 169e41f4b71Sopenharmony_ci```html 170e41f4b71Sopenharmony_ci<!-- xxx.hml --> 171e41f4b71Sopenharmony_ci<div class="container" style="width: 500px; height: 500px;"> 172e41f4b71Sopenharmony_ci <text class="textsize">In stroke:{{textValue}}</text> 173e41f4b71Sopenharmony_ci <canvas ref="canvas" style="width: 500px; height: 500px; background-color: #ffff00;"></canvas> 174e41f4b71Sopenharmony_ci</div> 175e41f4b71Sopenharmony_ci``` 176e41f4b71Sopenharmony_ci 177e41f4b71Sopenharmony_ci```css 178e41f4b71Sopenharmony_ci/* xxx.css */ 179e41f4b71Sopenharmony_ci.container { 180e41f4b71Sopenharmony_ci display: flex; 181e41f4b71Sopenharmony_ci flex-direction: column; 182e41f4b71Sopenharmony_ci background-color: #F1F3F5; 183e41f4b71Sopenharmony_ci align-items: center; 184e41f4b71Sopenharmony_ci justify-content: center; 185e41f4b71Sopenharmony_ci width: 100%; 186e41f4b71Sopenharmony_ci height: 100%; 187e41f4b71Sopenharmony_ci} 188e41f4b71Sopenharmony_ci 189e41f4b71Sopenharmony_cicanvas { 190e41f4b71Sopenharmony_ci width: 600px; 191e41f4b71Sopenharmony_ci height: 600px; 192e41f4b71Sopenharmony_ci background-color: #fdfdfd; 193e41f4b71Sopenharmony_ci border: none; 194e41f4b71Sopenharmony_ci} 195e41f4b71Sopenharmony_ci 196e41f4b71Sopenharmony_ci.textsize { 197e41f4b71Sopenharmony_ci font-size: 40px; 198e41f4b71Sopenharmony_ci} 199e41f4b71Sopenharmony_ci``` 200e41f4b71Sopenharmony_ci 201e41f4b71Sopenharmony_ci```js 202e41f4b71Sopenharmony_ci// xxx.js 203e41f4b71Sopenharmony_ciexport default { 204e41f4b71Sopenharmony_ci data: { 205e41f4b71Sopenharmony_ci textValue: 0 206e41f4b71Sopenharmony_ci }, 207e41f4b71Sopenharmony_ci onShow(){ 208e41f4b71Sopenharmony_ci var canvas = this.$refs.canvas.getContext('2d'); 209e41f4b71Sopenharmony_ci var offscreen = new OffscreenCanvas(500,500); 210e41f4b71Sopenharmony_ci var offscreenCanvasCtx = offscreen.getContext("2d"); 211e41f4b71Sopenharmony_ci 212e41f4b71Sopenharmony_ci offscreenCanvasCtx.rect(10, 10, 100, 100); 213e41f4b71Sopenharmony_ci offscreenCanvasCtx.stroke(); 214e41f4b71Sopenharmony_ci this.textValue = offscreenCanvasCtx.isPointInStroke(50, 10); 215e41f4b71Sopenharmony_ci 216e41f4b71Sopenharmony_ci var bitmap = offscreen.transferToImageBitmap(); 217e41f4b71Sopenharmony_ci canvas.transferFromImageBitmap(bitmap); 218e41f4b71Sopenharmony_ci } 219e41f4b71Sopenharmony_ci} 220e41f4b71Sopenharmony_ci``` 221e41f4b71Sopenharmony_ci 222e41f4b71Sopenharmony_ci 223e41f4b71Sopenharmony_ci 224e41f4b71Sopenharmony_ci### resetTransform 225e41f4b71Sopenharmony_ci 226e41f4b71Sopenharmony_ciresetTransform(): void 227e41f4b71Sopenharmony_ci 228e41f4b71Sopenharmony_ci**示例:** 229e41f4b71Sopenharmony_ci```html 230e41f4b71Sopenharmony_ci<!-- xxx.hml --> 231e41f4b71Sopenharmony_ci<div class="container" style="width: 500px; height: 500px;"> 232e41f4b71Sopenharmony_ci <text class="textsize">In path:{{textValue}}</text> 233e41f4b71Sopenharmony_ci <canvas ref="canvas" style="width: 500px; height: 500px; background-color: #ffff00;"></canvas> 234e41f4b71Sopenharmony_ci</div> 235e41f4b71Sopenharmony_ci``` 236e41f4b71Sopenharmony_ci 237e41f4b71Sopenharmony_ci```css 238e41f4b71Sopenharmony_ci/* xxx.css */ 239e41f4b71Sopenharmony_ci.container { 240e41f4b71Sopenharmony_ci display: flex; 241e41f4b71Sopenharmony_ci flex-direction: column; 242e41f4b71Sopenharmony_ci background-color: #F1F3F5; 243e41f4b71Sopenharmony_ci align-items: center; 244e41f4b71Sopenharmony_ci justify-content: center; 245e41f4b71Sopenharmony_ci width: 100%; 246e41f4b71Sopenharmony_ci height: 100%; 247e41f4b71Sopenharmony_ci} 248e41f4b71Sopenharmony_ci 249e41f4b71Sopenharmony_cicanvas { 250e41f4b71Sopenharmony_ci width: 600px; 251e41f4b71Sopenharmony_ci height: 600px; 252e41f4b71Sopenharmony_ci background-color: #fdfdfd; 253e41f4b71Sopenharmony_ci border: none; 254e41f4b71Sopenharmony_ci} 255e41f4b71Sopenharmony_ci 256e41f4b71Sopenharmony_ci.textsize { 257e41f4b71Sopenharmony_ci font-size: 40px; 258e41f4b71Sopenharmony_ci} 259e41f4b71Sopenharmony_ci``` 260e41f4b71Sopenharmony_ci 261e41f4b71Sopenharmony_ci```js 262e41f4b71Sopenharmony_ci// xxx.js 263e41f4b71Sopenharmony_ciexport default { 264e41f4b71Sopenharmony_ci data:{ 265e41f4b71Sopenharmony_ci textValue:0 266e41f4b71Sopenharmony_ci }, 267e41f4b71Sopenharmony_ci onShow(){ 268e41f4b71Sopenharmony_ci var canvas = this.$refs.canvas.getContext('2d'); 269e41f4b71Sopenharmony_ci var offscreen = new OffscreenCanvas(500,500); 270e41f4b71Sopenharmony_ci var offscreenCanvasCtx = offscreen.getContext("2d"); 271e41f4b71Sopenharmony_ci 272e41f4b71Sopenharmony_ci offscreenCanvasCtx.transform(1, 0, 1.7, 1, 0, 0); 273e41f4b71Sopenharmony_ci offscreenCanvasCtx.fillStyle = '#a9a9a9'; 274e41f4b71Sopenharmony_ci offscreenCanvasCtx.fillRect(40, 40, 50, 20); 275e41f4b71Sopenharmony_ci offscreenCanvasCtx.fillRect(40, 90, 50, 20); 276e41f4b71Sopenharmony_ci 277e41f4b71Sopenharmony_ci // Non-skewed rectangles 278e41f4b71Sopenharmony_ci offscreenCanvasCtx.resetTransform(); 279e41f4b71Sopenharmony_ci offscreenCanvasCtx.fillStyle = '#ff0000'; 280e41f4b71Sopenharmony_ci offscreenCanvasCtx.fillRect(40, 40, 50, 20); 281e41f4b71Sopenharmony_ci offscreenCanvasCtx.fillRect(40, 90, 50, 20); 282e41f4b71Sopenharmony_ci 283e41f4b71Sopenharmony_ci var bitmap = offscreen.transferToImageBitmap(); 284e41f4b71Sopenharmony_ci canvas.transferFromImageBitmap(bitmap); 285e41f4b71Sopenharmony_ci } 286e41f4b71Sopenharmony_ci} 287e41f4b71Sopenharmony_ci``` 288e41f4b71Sopenharmony_ci 289e41f4b71Sopenharmony_ci