• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Image
2
3The **\<Image>** component is usually used to display images in applications. It supports images in PNG, JPG, BMP, SVG, or GIF format from the following data sources: string, [PixelMap](../apis/js-apis-image.md#pixelmap7), or [Resource](ts-types.md#resource).
4
5> **NOTE**
6>
7> This component is supported since API version 7. Updates will be marked with a superscript to indicate their earliest API version.
8
9
10## Required Permissions
11
12To use online images, the application must have the **ohos.permission.INTERNET** permission. For details about how to apply for a permission, see [Declaring Permissions](../../security/accesstoken-guidelines.md).
13
14
15## Child Components
16
17Not supported
18
19
20## APIs
21
22Image(src: string | PixelMap | Resource)
23
24Obtains an image from the specified source for subsequent rendering and display.
25
26If the **\<Image>** component fails to obtain the image or the obtained image size is 0, the **\<Image>** component is automatically resized to 0 and does not follow the layout constraints of its parent component.
27
28Since API version 9, this API is supported in ArkTS widgets.
29
30**Parameters**
31
32| Name | Type                                    | Mandatory  | Description                                    |
33| ---- | ---------------------------------------- | ---- | ---------------------------------------- |
34| src  |  string \| [PixelMap](../apis/js-apis-image.md#pixelmap7) \| [Resource](ts-types.md#resource) | Yes   | Image source. Both local and online images are supported.<br>When using an image referenced using a relative path, for example, **Image("common/test.jpg")**, the **\<Image>** component cannot be called across bundles or modules. Therefore, you are advised to use **\$r** to reference image resources that need to be used globally.<br>- The following image formats are supported: PNG, JPG, BMP, SVG, GIF.<br>\- Base64 strings are supported. The value format is data:image/[png\|jpeg\|bmp\|webp];base64,[base64 data], where [base64 data] is a Base64 string.<br/>\- Strings with the **datashare://** prefix are supported, which are used to access the image path provided by a Data ability.<br/>\- Strings with the **file:///data/storage** prefix are supported, which are used to read image resources in the **files** folder in the installation directory of the current application. Ensure that the application has the read permission to the files in the specified path.<br/>**NOTE**<br/>- ArkTS widgets support GIF animations, but the animations only play once on display.<br/>- ArkTS widgets do not support the strings with the **http://**, **datashare://**, or **file:///data/storage** prefix.<br>- ArkTS widgets do not support the [PixelMap](../apis/js-apis-image.md#pixelmap7) type. |
35
36## Attributes
37
38For details about how to use attributes, see [Setting Attributes](../../ui/arkts-graphics-display.md#setting-attributes). In addition to the [universal attributes](ts-universal-attributes-size.md), the following attributes are supported.
39
40| Name                            | Type                                               | Description                                                        |
41| -------------------------------- | ------------------------------------------------------- | ------------------------------------------------------------ |
42| alt                              | string \| [Resource](ts-types.md#resource)         | Placeholder image displayed during loading. Local images (in PNG, JPG, BMP, SVG, or GIF format) are supported. Online images are not supported.<br>Default value: **null**<br>Since API version 9, this API is supported in ArkTS widgets.|
43| objectFit                        | [ImageFit](ts-appendix-enums.md#imagefit)               | Image scale mode.<br>Default value: **ImageFit.Cover**<br>Since API version 9, this API is supported in ArkTS widgets.|
44| objectRepeat                     | [ImageRepeat](ts-appendix-enums.md#imagerepeat)         | How the image is repeated. When set to repeat, the image is repeated from the center to edges. The last image will be clipped if it does not fit in the component.<br>Default value: **ImageRepeat.NoRepeat**<br>Since API version 9, this API is supported in ArkTS widgets.<br>**NOTE**<br>This attribute is not applicable to SVG images.|
45| interpolation                    | [ImageInterpolation](#imageinterpolation)               | Interpolation effect of the image. This attribute is intended to alleviate aliasing that occurs when a low-definition image is zoomed in.<br>Default value: **ImageInterpolation.None**<br>Since API version 9, this API is supported in ArkTS widgets.<br>**NOTE**<br>This attribute is not applicable to SVG images or **PixelMap** objects. |
46| renderMode                       | [ImageRenderMode](#imagerendermode)                     | Rendering mode of the image, which can be **Original** or **Template** (monochrome).<br>Default value: **ImageRenderMode.Original**<br>Since API version 9, this API is supported in ArkTS widgets.<br>**NOTE**<br>This attribute is not applicable to SVG images.|
47| sourceSize                       | {<br>width: number,<br>height: number<br>} | Decoding size of the image. This attribute can be used to reduce the image resolution when the image display size needs to be smaller than the component size. When used together with **ImageFit.None**, it can display a small image in the component.<br>Unit: px<br>Since API version 9, this API is supported in ArkTS widgets.<br>**NOTE**<br>This attribute works only when the target size is smaller than the source size.<br>This attribute is not applicable to SVG images.<br>This attribute is not applicable to **PixelMap** objects.|
48| matchTextDirection               | boolean                                                 | Whether to display the image in the system language direction. When this parameter is set to true, the image is horizontally flipped in the right-to-left (RTL) language context.<br>Default value: **false**<br>Since API version 9, this API is supported in ArkTS widgets.|
49| fitOriginalSize                  | boolean                                                 | Whether to fit the component to the original size of the image source when the component size is not set.<br>Default value: **false**<br>Since API version 9, this API is supported in ArkTS widgets.|
50| fillColor                        | [ResourceColor](ts-types.md#resourcecolor)              | Fill color to be superimposed on the image.<br>Since API version 9, this API is supported in ArkTS widgets.<br>**NOTE**<br>This attribute only applies to an SVG image. Once set, the fill color will replace that of the SVG image.|
51| autoResize                       | boolean                                                 | Whether to resize the image source used for drawing based on the size of the display area during image decoding. This resizing can help reduce the memory usage. For example, if the size of the original image is 1920 x 1080 and the size of the display area is 200 x 200, you can set this attribute to **true** so that the image is automatically decoded to 200 x 200.<br>Default value: **true**<br>Since API version 9, this API is supported in ArkTS widgets.|
52| syncLoad<sup>8+</sup>            | boolean                                                 | Whether to load the image synchronously. By default, the image is loaded asynchronously. During synchronous loading, the UI thread is blocked and the placeholder image is not displayed.<br>Default value: **false**<br>Since API version 9, this API is supported in ArkTS widgets.<br>**NOTE**<br>When loading a small image, you are advised to set **syncLoad** to **true** so that the image loading can be quickly completed on the main thread.|
53| copyOption<sup>9+</sup>          | [CopyOptions](ts-appendix-enums.md#copyoptions9)        | Whether the image can be copied.<br>When **copyOption** is set to a value other than **CopyOptions.None**, the image can be copied in various manners, such as long pressing, right-clicking, or pressing Ctrl+C.<br>Default value: **CopyOptions.None**<br>Since API version 9, this API is supported in ArkTS widgets.<br>**NOTE**<br>SVG images cannot be copied.|
54| colorFilter<sup>9+</sup>         | [ColorFilter](ts-types.md#colorfilter9)                 | Color filter of the image. The input parameter is a 4 x 5 RGBA transformation matrix.<br>The first row of the matrix represents a vector value of R (red), the second row represents a vector value of G (green), the third row represents a vector value of B (blue), and the fourth row represents a vector value of A (alpha). The four rows represent different RGBA vector values.<br>The RGBA values are floating-point numbers between 0 and 1. When the diagonal value of the matrix is 1, the original color of the image is retained.<br> **Calculation rule:**<br>If the input filter matrix is as follows:<br>![image-matrix-1](figures/image-matrix-1.jpg)<br>Wherein the color is [R, G, B, A].<br>Then the color after filtering is [R', G', B', A'].<br>![image-matrix-2](figures/image-matrix-2.jpg)<br>Since API version 9, this API is supported in ArkTS widgets. |
55| draggable<sup>9+</sup> | boolean                                  | Whether the image is draggable. This attribute cannot be used together with the [onDragStart](ts-universal-events-drag-drop.md) event.<br>Default value: **false** |
56
57>  **NOTE**
58>
59>  - To use shortcut keys to copy the **\<Image>** component, the component must be [in focus](../../ui/arkts-common-events-focus-event.md#setting-whether-a-component-is-focusable). By default, the **\<Image>** component is not focusable. To enable it to gain focus, set both the [focusable](ts-universal-attributes-focus.md) and [focusOnTouch](ts-universal-attributes-focus.md) attributes to **true**.
60>  - For SVG images, only the following tags are included in the supported list: **svg**, **rect**, **circle**, **ellipse**, **path**, **line**, **polyline**, and **polygon**.
61
62## ImageInterpolation
63
64Since API version 9, this API is supported in ArkTS widgets.
65
66| Name  | Description                                                |
67| ------ | ---------------------------------------------------- |
68| None   | No image interpolation.                                    |
69| High   | High quality interpolation. This mode produces the highest possible quality scaled images, but may require more image rendering time.|
70| Medium | Medium quality interpolation.                                        |
71| Low    | Low quality interpolation.                                        |
72
73## ImageRenderMode
74
75Since API version 9, this API is supported in ArkTS widgets.
76
77| Name    | Description          |
78| -------- | -------------- |
79| Original | Render image pixels as they are in the original source image.|
80| Template | Render image pixels to create a monochrome template image.|
81
82## Events
83
84In addition to the [universal events](ts-universal-events-click.md), the following events are supported.
85
86### onComplete
87
88onComplete(callback: (event?: { width: number, height: number, componentWidth: number, componentHeight: number, loadingStatus: number }) =&gt; void)
89
90Triggered when an image is successfully loaded or decoded. The size of the loaded image is returned.
91
92Since API version 9, this API is supported in ArkTS widgets.
93
94**Parameters**
95
96| Name                      | Type  | Description                                                        |
97| ---------------------------- | ------ | ------------------------------------------------------------ |
98| width                        | number | Width of the image.<br>Unit: pixel                                   |
99| height                       | number | Height of the image.<br>Unit: pixel                                   |
100| componentWidth               | number | Width of the component.<br>Unit: pixel                                   |
101| componentHeight              | number | Height of the component.<br>Unit: pixel                                   |
102| loadingStatus                | number | Loading status of the image.<br>**NOTE**<br>If the return value is **0**, the image is successfully loaded. If the return value is **1**, the image is successfully decoded.|
103
104
105### onError
106
107onError(callback: (event?: { componentWidth: number, componentHeight: number , message: string }) =&gt; void)
108
109Triggered when an error occurs during image loading.
110
111Since API version 9, this API is supported in ArkTS widgets.
112
113**Parameters**
114
115| Name              | Type  | Description                     |
116| -------------------- | ------ | ------------------------- |
117| componentWidth       | number | Width of the component.<br>Unit: pixel|
118| componentHeight      | number | Height of the component.<br>Unit: pixel|
119| message<sup>9+</sup> | string | Error information.               |
120
121
122### onFinish
123
124onFinish(event: () =&gt; void)
125
126Triggered when the animation playback in the loaded SVG image is complete. If the animation is an infinite loop, this callback is not triggered.
127
128Only SVG images are supported.
129
130Since API version 9, this API is supported in ArkTS widgets.
131
132## Example
133
134### Loading Images of Basic Types
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          // Load a PNG image.
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          // Load a GIF image.
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          // Load an SVG image.
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          // Load a JPG image.
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![en-us_image_0000001592882500](figures/en-us_image_0000001592882500.gif)
171
172### Loading Online Images
173
174The default network timeout period is 5 minutes for loading online images. When using an online image, you are advised to use **alt** to configure the placeholder image displayed during loading. If more flexible network configuration is required, you can use the [HTTP](../../connectivity/http-request.md) tool to send a network request, and then decode the returned data into a **PixelMap** object in the **\<Image>** component. For details about image development, see [Image Processing](../../media/image-overview.md).
175
176To use online images, the application must have the **ohos.permission.INTERNET** permission. For details about how to apply for a permission, see [Declaring Permissions](../../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")// Enter an image URL.
185        .alt($r('app.media.icon'))// Use alt to set a placeholder image displayed during image loading.
186        .width(100)
187        .height(100)
188    }
189  }
190}
191```
192
193
194### Adding Events to an Image
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            // Obtain the size of an image after the image loading is complete.
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        // Add a click event so that a specific image is loaded upon clicking.
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![en-us_image_0000001607845173](figures/en-us_image_0000001607845173.gif)
258