1# Image 2 3Image为图片组件,常用于在应用中显示图片。Image支持加载string、 [PixelMap](../apis/js-apis-image.md#pixelmap7)和[Resource](ts-types.md#resource类型)类型的数据源,支持png、jpg、bmp、svg和gif类型的图片格式。 4 5> **说明:** 6> 7> 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 8 9 10## 需要权限 11 12使用网络图片时,需要申请权限ohos.permission.INTERNET。具体申请方式请参考[权限申请声明](../../security/accesstoken-guidelines.md)。 13 14 15## 子组件 16 17无 18 19 20## 接口 21 22Image(src: string | PixelMap | Resource) 23 24通过图片数据源获取图片,用于后续渲染展示。 25 26Image组件加载图片失败或图片尺寸为0时,图片组件大小自动为0,不跟随父组件的布局约束。 27 28从API version 9开始,该接口支持在ArkTS卡片中使用。 29 30**参数:** 31 32| 参数名 | 参数类型 | 必填 | 参数描述 | 33| ---- | ---------------------------------------- | ---- | ---------------------------------------- | 34| src | string\| [PixelMap](../apis/js-apis-image.md#pixelmap7) \| [Resource](ts-types.md#resource类型) | 是 | 图片的数据源,支持本地图片和网络图片,引用方式请参考[加载图片资源](../../ui/arkts-graphics-display.md#加载图片资源)。<br>1. string格式可用于加载网络图片和本地图片,常用于加载网络图片。当使用相对路径引用本地图片时,例如Image("common/test.jpg"),不支持跨包/跨模块调用该Image组件,建议使用Resource格式来管理需全局使用的图片资源。<br>- 支持`Base64`字符串。格式`data:image/[png\|jpeg\|bmp\|webp];base64,[base64 data]`, 其中`[base64 data]`为`Base64`字符串数据。<br>- 支持file://路径前缀的字符串。用于读取本应用安装目录下files文件夹下的图片资源。需要保证目录包路径下的文件有可读权限。<br>2. PixelMap格式为像素图,常用于图片编辑的场景。<br>3. Resource格式可以跨包/跨模块访问资源文件,是访问本地图片的推荐方式。<br>**说明:**<br/>- ArkTS卡片上支持gif图片格式动效,但仅在显示时播放一次。<br/>- ArkTS卡片上不支持http://等网络相关路径前缀和file://路径前缀的字符串。<br/>- ArkTS卡片上不支持 [PixelMap](../apis/js-apis-image.md#pixelmap7)类型。 | 35 36## 属性 37 38属性的详细使用指导请参考[添加属性](../../ui/arkts-graphics-display.md#添加属性)。除支持[通用属性](ts-universal-attributes-size.md)外,还支持以下属性: 39 40| 名称 | 参数类型 | 描述 | 41| ------------------------ | ---------------------------------------- | ---------------------------------------- | 42| alt | string \| [Resource](ts-types.md#resource类型) | 加载时显示的占位图,支持本地图片(png、jpg、bmp、svg和gif类型),不支持网络图片。<br>默认值:null<br>从API version 9开始,该接口支持在ArkTS卡片中使用。 | 43| objectFit | [ImageFit](ts-appendix-enums.md#imagefit) | 设置图片的缩放类型。<br/>默认值:ImageFit.Cover<br/>从API version 9开始,该接口支持在ArkTS卡片中使用。 | 44| objectRepeat | [ImageRepeat](ts-appendix-enums.md#imagerepeat) | 设置图片的重复样式。从中心点向两边重复,剩余空间不足放下一张图片时会截断。<br/>默认值:ImageRepeat.NoRepeat<br/>从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>**说明:**<br/>svg类型图源不支持该属性。 | 45| interpolation | [ImageInterpolation](#imageinterpolation) | 设置图片的插值效果,即减轻低清晰度图片在放大显示的时候出现的锯齿问题,仅针对图片放大插值。<br/>默认值:ImageInterpolation.None<br/>从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>**说明:**<br/>svg类型图源不支持该属性。<br/>PixelMap资源不支持该属性。 | 46| renderMode | [ImageRenderMode](#imagerendermode) | 设置图片的渲染模式为原色或黑白。<br/>默认值:ImageRenderMode.Original<br/>从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>**说明:** <br/>svg类型图源不支持该属性。 | 47| sourceSize | {<br/>width: number,<br/>height: number<br/>} | 设置图片解码尺寸,降低图片的分辨率,常用于需要让图片显示尺寸比组件尺寸更小的场景。和ImageFit.None配合使用时可在组件内显示小图。<br/>单位:px<br>从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>**说明:**<br/>仅在目标尺寸小于图源尺寸时生效。<br>svg类型图源不支持该属性。<br>PixelMap资源不支持该属性。 | 48| matchTextDirection | boolean | 设置图片是否跟随系统语言方向,在RTL语言环境下显示镜像翻转显示效果。<br/>默认值:false<br/>从API version 9开始,该接口支持在ArkTS卡片中使用。 | 49| fitOriginalSize | boolean | 图片组件尺寸未设置时,其显示尺寸是否跟随图源尺寸。<br/>默认值:false<br/>从API version 9开始,该接口支持在ArkTS卡片中使用。 | 50| fillColor | [ResourceColor](ts-types.md#resourcecolor) | 设置填充颜色,设置后填充颜色会覆盖在图片上。<br/>从API version 9开始,该接口支持在ArkTS卡片中使用。<br>**说明:** <br>仅对svg图源生效,设置后会替换svg图片的填充颜色。 | 51| autoResize | boolean | 设置图片解码过程中是否对图源自动缩放。设置为true时,组件会根据显示区域的尺寸决定用于绘制的图源尺寸,有利于减少内存占用。如原图大小为1920x1080,而显示区域大小为200x200,则图片会自动解码到200x200的尺寸,大幅度节省图片占用的内存。<br/>默认值:true<br/>从API version 9开始,该接口支持在ArkTS卡片中使用。 | 52| syncLoad<sup>8+</sup> | boolean | 设置是否同步加载图片,默认是异步加载。同步加载时阻塞UI线程,不会显示占位图。<br/>默认值:false<br/>从API version 9开始,该接口支持在ArkTS卡片中使用。<br>**说明:**<br>建议加载尺寸较小的本地图片时将syncLoad设为true,因为耗时较短,在主线程上执行即可。 | 53| copyOption<sup>9+</sup> | [CopyOptions](ts-appendix-enums.md#copyoptions9) | 设置图片是否可复制。<br>当copyOption设置为非CopyOptions.None时,支持使用长按、鼠标右击、快捷组合键'CTRL+C'等方式进行复制。<br>默认值:CopyOptions.None<br/>从API version 9开始,该接口支持在ArkTS卡片中使用。<br>**说明:**<br>svg图片不支持复制。 | 54| colorFilter<sup>9+</sup> | [ColorFilter](ts-types.md#colorfilter9) | 给图像设置颜色滤镜效果,入参为一个的4x5的RGBA转换矩阵。<br/>矩阵第一行表示R(红色)的向量值,第二行表示G(绿色)的向量值,第三行表示B(蓝色)的向量值,第四行表示A(透明度)的向量值,4行分别代表不同的RGBA的向量值。<br>RGBA值分别是0和1之间的浮点数字,当矩阵对角线值为1时,保持图片原有色彩。<br> **计算规则:**<br>如果输入的滤镜矩阵为:<br><br>像素点为[R, G, B, A]<br>则过滤后的颜色为 [R’, G’, B’, A’]<br><br>从API version 9开始,该接口支持在ArkTS卡片中使用。 | 55| draggable<sup>9+</sup> | boolean | 设置组件默认拖拽效果,设置为true时,组件可拖拽。<br>不能和[onDragStart](ts-universal-events-drag-drop.md)事件同时使用。<br/>默认值:false | 56 57> **说明:** 58> 59> - 使用快捷组合键对Image组件复制时,Image组件必须处于[获焦状态](../../ui/arkts-common-events-focus-event.md#设置组件是否获焦)。Image组件默认不获焦,需将[focusable](ts-universal-attributes-focus.md)属性设置为true,即可使用TAB键将焦点切换到组件上,再将[focusOnTouch](ts-universal-attributes-focus.md)属性设置为true,即可实现点击获焦。 60> - 图片设置为svg图源时,当前支持的标签是svg、rect、circle、ellipse、path、line、polyline和polygon。 61 62## ImageInterpolation 63 64从API version 9开始,该接口支持在ArkTS卡片中使用。 65 66| 名称 | 描述 | 67| ------ | -------------------------- | 68| None | 不使用图片插值。 | 69| High | 高图片插值,插值质量最高,可能会影响图片渲染的速度。 | 70| Medium | 中图片插值。 | 71| Low | 低图片插值。 | 72 73## ImageRenderMode 74 75从API version 9开始,该接口支持在ArkTS卡片中使用。 76 77| 名称 | 描述 | 78| -------- | ------- | 79| Original | 原色渲染模式。 | 80| Template | 黑白渲染模式。 | 81 82## 事件 83 84除支持[通用事件](ts-universal-events-click.md)外,还支持以下事件: 85 86### onComplete 87 88onComplete(callback: (event?: { width: number, height: number, componentWidth: number, componentHeight: number, loadingStatus: number }) => void) 89 90图片数据加载成功和解码成功时均触发该回调,返回成功加载的图片尺寸。 91 92从API version 9开始,该接口支持在ArkTS卡片中使用。 93 94**参数:** 95 96| 参数名 | 类型 | 说明 | 97| --------------- | ------ | ---------------------------------------- | 98| width | number | 图片的宽。<br/>单位:像素 | 99| height | number | 图片的高。<br/>单位:像素 | 100| componentWidth | number | 组件的宽。<br/>单位:像素 | 101| componentHeight | number | 组件的高。<br/>单位:像素 | 102| loadingStatus | number | 图片加载成功的状态值。<br/>**说明:**<br/>返回的状态值为0时,表示图片数据加载成功。返回的状态值为1时,表示图片解码成功。 | 103 104 105### onError 106 107onError(callback: (event?: { componentWidth: number, componentHeight: number , message: string }) => void) 108 109图片加载异常时触发该回调。 110 111从API version 9开始,该接口支持在ArkTS卡片中使用。 112 113**参数:** 114 115| 参数名 | 类型 | 说明 | 116| -------------------- | ------ | --------------- | 117| componentWidth | number | 组件的宽。<br/>单位:像素 | 118| componentHeight | number | 组件的高。<br/>单位:像素 | 119| message<sup>9+</sup> | string | 报错信息。 | 120 121 122### onFinish 123 124onFinish(event: () => void) 125 126当加载的源文件为带动效的svg格式图片时,svg动效播放完成时会触发这个回调。如果动效为无限循环动效,则不会触发这个回调。 127 128仅支持svg格式的图片。 129 130从API version 9开始,该接口支持在ArkTS卡片中使用。 131 132## 示例 133 134### 加载基本类型图片 135 136 137```ts 138@Entry 139@Component 140struct ImageExample1 { 141 build() { 142 Column() { 143 Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start }) { 144 Row() { 145 // 加载png格式图片 146 Image($r('app.media.ic_camera_master_ai_leaf')) 147 .width(110).height(110).margin(15) 148 .overlay('png', { align: Alignment.Bottom, offset: { x: 0, y: 20 } }) 149 // 加载gif格式图片 150 Image($r('app.media.loading')) 151 .width(110).height(110).margin(15) 152 .overlay('gif', { align: Alignment.Bottom, offset: { x: 0, y: 20 } }) 153 } 154 Row() { 155 // 加载svg格式图片 156 Image($r('app.media.ic_camera_master_ai_clouded')) 157 .width(110).height(110).margin(15) 158 .overlay('svg', { align: Alignment.Bottom, offset: { x: 0, y: 20 } }) 159 // 加载jpg格式图片 160 Image($r('app.media.ic_public_favor_filled')) 161 .width(110).height(110).margin(15) 162 .overlay('jpg', { align: Alignment.Bottom, offset: { x: 0, y: 20 } }) 163 } 164 } 165 }.height(320).width(360).padding({ right: 10, top: 10 }) 166 } 167} 168``` 169 170 171 172### 加载网络图片 173 174加载网络图片时,默认网络超时是5分钟,建议使用alt配置加载时的占位图。如果需要更灵活的网络配置,可以使用[HTTP](../../connectivity/http-request.md)工具包发送网络请求,接着将返回的数据解码为Image组件中的`PixelMap`,图片开发可参考[图片处理](../../media/image-overview.md)。 175 176使用网络图片时,需要申请权限ohos.permission.INTERNET。具体申请方式请参考[权限申请声明](../../security/accesstoken-guidelines.md)。 177 178```ts 179@Entry 180@Component 181struct ImageExample2 { 182 build() { 183 Column({ space: 10 }) { 184 Image("https://www.example.com/xxx.png")// 直接加载网络地址,请填写一个具体的网络图片地址 185 .alt($r('app.media.icon'))// 使用alt,在网络图片加载成功前使用占位图 186 .width(100) 187 .height(100) 188 } 189 } 190} 191``` 192 193 194### 为图片添加事件 195 196 197```ts 198@Entry 199@Component 200struct ImageExample3 { 201 @State widthValue: number = 0; 202 @State heightValue: number = 0; 203 private on: Resource = $r('app.media.image_on'); 204 private off: Resource = $r('app.media.image_off'); 205 private on2off: Resource = $r('app.media.image_on2off'); 206 private off2on: Resource = $r('app.media.image_off2on'); 207 @State src: Resource = this.on; 208 209 build() { 210 Column() { 211 Row({ space: 20 }) { 212 Column() { 213 Image($r('app.media.img_example1')) 214 .alt($r('app.media.ic_public_picture')) 215 .sourceSize({ 216 width: 900, 217 height: 900 218 }) 219 .objectFit(ImageFit.Cover) 220 .height(180).width(180) 221 // 图片加载完成后,获取图片尺寸。 222 .onComplete((msg: { width: number,height: number }) => { 223 this.widthValue = msg.width 224 this.heightValue = msg.height 225 }) 226 .onError(() => { 227 console.log('load image fail') 228 }) 229 .overlay('\nwidth: ' + String(this.widthValue) + ' height: ' + String(this.heightValue), { 230 align: Alignment.Bottom, 231 offset: { x: 0, y: 20 } 232 }) 233 } 234 // 为图片添加点击事件,点击完成后加载特定图片 235 Image(this.src) 236 .width(120).height(120) 237 .onClick(() => { 238 if (this.src == this.on || this.src == this.off2on) { 239 this.src = this.on2off 240 } else { 241 this.src = this.off2on 242 } 243 }) 244 .onFinish(() => { 245 if (this.src == this.off2on) { 246 this.src = this.on 247 } else { 248 this.src = this.off 249 } 250 }) 251 } 252 }.width('100%') 253 } 254} 255``` 256 257