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