美文网首页
鸿蒙~ArtUI基础开发 Image组件

鸿蒙~ArtUI基础开发 Image组件

作者: 胡修波 | 来源:发表于2023-12-20 16:07 被阅读0次

    一、加载图片资源

    类型为:

    • 本地资源 ,根目录为ets文件夹
       Image('images/view.jpg')
      .width(200)
    
    • 网络资源,开启权限:ohos.permission.INTERNET
     Image('https://www.example.com/example.JPG')
    
    • Resource资源
    Image($r('app.media.icon'))
    或者:
    Image($rawfile('icon.png'))
    
    • 媒体库资源
    import picker from '@ohos.file.picker';
    
    @Entry
    @Component
    struct Index {
      @State imgDatas: string[] = [];
      // 获取照片url集
      getAllImg() {
        
        let result = new Array<string>();
        try {
          let PhotoSelectOptions = new picker.PhotoSelectOptions();
          PhotoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE;
          PhotoSelectOptions.maxSelectNumber = 5;
          let photoPicker = new picker.PhotoViewPicker();
          photoPicker.select(PhotoSelectOptions).then((PhotoSelectResult) => {
            this.imgDatas = PhotoSelectResult.photoUris;
            console.info('PhotoViewPicker.select successfully, PhotoSelectResult uri: ' + JSON.stringify(PhotoSelectResult));
          }).catch((err) => {
            console.error(`PhotoViewPicker.select failed with. Code: ${err.code}, message: ${err.message}`);
          });
        } catch (err) {
          console.error(`PhotoViewPicker failed with. Code: ${err.code}, message: ${err.message}`);    }
      }
      // aboutToAppear中调用上述函数,获取图库的所有图片url,存在imgDatas中
      async aboutToAppear() {
        this.getAllImg();
      }
      // 使用imgDatas的url加载图片。
      build() {
        Column() {
          Grid() {
            ForEach(this.imgDatas, item => {
              GridItem() {
                Image(item)
                  .width(200)
              }
            }, item => JSON.stringify(item))
          }
        }.width('100%').height('100%')
      }
    }
    
    或者
    Image('file://media/Photos/5')
    .width(200)
    
    • base64

    二 显示矢量图

    先把添加矢量图到资源文件

    • 填充颜色
    
    Image($r('app.media.cloud')).width(50)
    .fillColor(Color.Blue) 
    
    • 添加属性,通过objectFit属性使图片缩放到高度和宽度确定的框内
    @Entry
    @Component
    struct MyComponent {
      scroller: Scroller = new Scroller()
    
      build() {
        Scroll(this.scroller) {
          Row() {
            Image($r('app.media.img_2')).width(200).height(150)
              .border({ width: 1 })
              .objectFit(ImageFit.Contain).margin(15) // 保持宽高比进行缩小或者放大,使得图片完全显示在显示边界内。
              .overlay('Contain', { align: Alignment.Bottom, offset: { x: 0, y: 20 } })
            Image($r('app.media.ic_img_2')).width(200).height(150)
              .border({ width: 1 })
              .objectFit(ImageFit.Cover).margin(15)
              // 保持宽高比进行缩小或者放大,使得图片两边都大于或等于显示边界。
              .overlay('Cover', { align: Alignment.Bottom, offset: { x: 0, y: 20 } })
            Image($r('app.media.img_2')).width(200).height(150)
              .border({ width: 1 })
                // 自适应显示。
              .objectFit(ImageFit.Auto).margin(15)
              .overlay('Auto', { align: Alignment.Bottom, offset: { x: 0, y: 20 } })
          }
          Row() {
            Image($r('app.media.img_2')).width(200).height(150)
              .border({ width: 1 })
              .objectFit(ImageFit.Fill).margin(15)
              // 不保持宽高比进行放大缩小,使得图片充满显示边界。
              .overlay('Fill', { align: Alignment.Bottom, offset: { x: 0, y: 20 } })
            Image($r('app.media.img_2')).width(200).height(150)
              .border({ width: 1 })
              // 保持宽高比显示,图片缩小或者保持不变。
              .objectFit(ImageFit.ScaleDown).margin(15)
              .overlay('ScaleDown', { align: Alignment.Bottom, offset: { x: 0, y: 20 } })
            Image($r('app.media.img_2')).width(200).height(150)
              .border({ width: 1 })
              // 保持原有尺寸显示。
              .objectFit(ImageFit.None).margin(15)
              .overlay('None', { align: Alignment.Bottom, offset: { x: 0, y: 20 } })
          }
        }
      }
    }
    
    
    • 图片插值

    当原图分辨率较低并且放大显示时,图片会模糊出现锯齿。这时可以使用interpolation属性对图片进行插值,使图片显示得更清晰。

    @Entry
    @Component
    struct Index {
      build() {
        Column() {
          Row() {
            Image($r('app.media.grass'))
              .width('40%')
              .interpolation(ImageInterpolation.None)
              .borderWidth(1)
              .overlay("Interpolation.None", { align: Alignment.Bottom, offset: { x: 0, y: 20 } })
              .margin(10)
            Image($r('app.media.grass'))
              .width('40%')
              .interpolation(ImageInterpolation.Low)
              .borderWidth(1)
              .overlay("Interpolation.Low", { align: Alignment.Bottom, offset: { x: 0, y: 20 } })
              .margin(10)
          }.width('100%')
          .justifyContent(FlexAlign.Center)
    
          Row() {
            Image($r('app.media.grass'))
              .width('40%')
              .interpolation(ImageInterpolation.Medium)
              .borderWidth(1)
              .overlay("Interpolation.Medium", { align: Alignment.Bottom, offset: { x: 0, y: 20 } })
              .margin(10)
            Image($r('app.media.grass'))
              .width('40%')
              .interpolation(ImageInterpolation.High)
              .borderWidth(1)
              .overlay("Interpolation.High", { align: Alignment.Bottom, offset: { x: 0, y: 20 } })
              .margin(10)
          }.width('100%')
          .justifyContent(FlexAlign.Center)
        }
        .height('100%')
      }
    }
    
    • 设置图片重复样式
      通过objectRepeat属性设置图片的重复样式方式
    @Entry
    @Component
    struct MyComponent {
      build() {
        Column({ space: 10 }) {
          Row({ space: 5 }) {
            Image($r('app.media.ic_public_favor_filled_1'))
              .width(110)
              .height(115)
              .border({ width: 1 })
              .objectRepeat(ImageRepeat.XY)
              .objectFit(ImageFit.ScaleDown)
              // 在水平轴和竖直轴上同时重复绘制图片
              .overlay('ImageRepeat.XY', { align: Alignment.Bottom, offset: { x: 0, y: 20 } })
            Image($r('app.media.ic_public_favor_filled_1'))
              .width(110)
              .height(115)
              .border({ width: 1 })
              .objectRepeat(ImageRepeat.Y)
              .objectFit(ImageFit.ScaleDown)
              // 只在竖直轴上重复绘制图片
              .overlay('ImageRepeat.Y', { align: Alignment.Bottom, offset: { x: 0, y: 20 } })
            Image($r('app.media.ic_public_favor_filled_1'))
              .width(110)
              .height(115)
              .border({ width: 1 })
              .objectRepeat(ImageRepeat.X)
              .objectFit(ImageFit.ScaleDown)
              // 只在水平轴上重复绘制图片
              .overlay('ImageRepeat.X', { align: Alignment.Bottom, offset: { x: 0, y: 20 } })
          }
        }.height(150).width('100%').padding(8)
      }
    }
    
    • 设置图片渲染模式 ,通过renderMode属性设置图片的渲染模式为原色或黑白
    @Entry
    @Component
    struct MyComponent {
      build() {
        Column({ space: 10 }) {
          Row({ space: 50 }) {
            Image($r('app.media.example'))
              // 设置图片的渲染模式为原色 
              .renderMode(ImageRenderMode.Original)
              .width(100)
              .height(100)
              .border({ width: 1 })
                // overlay是通用属性,用于在组件上显示说明文字
              .overlay('Original', { align: Alignment.Bottom, offset: { x: 0, y: 20 } })
            Image($r('app.media.example'))
              // 设置图片的渲染模式为黑白
              .renderMode(ImageRenderMode.Template)
              .width(100)
              .height(100)
              .border({ width: 1 })
              .overlay('Template', { align: Alignment.Bottom, offset: { x: 0, y: 20 } })
          }
        }.height(150).width('100%').padding({ top: 20,right: 10 })
      }
    }
    
    • 设置图片解码尺寸,通过sourceSize属性设置图片解码尺寸,降低图片的分辨率
      原图尺寸为1280960,该示例将图片解码为150150和400*400
    @Entry
    @Component
    struct Index {
      build() {
        Column() {
          Row({ space: 20 }) {
            Image($r('app.media.example'))
              .sourceSize({
                width: 150,
                height: 150
              })
              .objectFit(ImageFit.ScaleDown)
              .width('25%')
              .aspectRatio(1)
              .border({ width: 1 })
              .overlay('width:150 height:150', { align: Alignment.Bottom, offset: { x: 0, y: 40 } })
            Image($r('app.media.example'))
              .sourceSize({
                width: 400,
                height: 400
              })
              .objectFit(ImageFit.ScaleDown)
              .width('25%')
              .aspectRatio(1)
              .border({ width: 1 })
              .overlay('width:400 height:400', { align: Alignment.Bottom, offset: { x: 0, y: 40 } })
          }.height(150).width('100%').padding(20)
    
        }
      }
    }
    
    • 为图片添加滤镜效果
      通过colorFilter修改图片的像素颜色,为图片添加滤镜
    @Entry
    @Component
    struct Index {
      build() {
        Column() {
          Row() {
            Image($r('app.media.example'))
              .width('40%')
              .margin(10)
            Image($r('app.media.example'))
              .width('40%')
              .colorFilter(
                [1, 1, 0, 0, 0,
                 0, 1, 0, 0, 0,
                 0, 0, 1, 0, 0,
                 0, 0, 0, 1, 0])
              .margin(10)
          }.width('100%')
          .justifyContent(FlexAlign.Center)
        }
      }
    }
    
    • 同步加载图片
      一般情况下,图片加载流程会异步进行,以避免阻塞主线程,影响UI交互。但是特定情况下,图片刷新时会出现闪烁,这时可以使用syncLoad属性,使图片同步加载,从而避免出现闪烁。不建议图片加载较长时间时使用,会导致页面无法响应。
    Image($r('app.media.icon'))
      .syncLoad(true)
    
    • 事件调用
      通过在Image组件上绑定onComplete事件,图片加载成功后可以获取图片的必要信息。如果图片加载失败,也可以通过绑定onError回调来获得结果。
    @Entry
    @Component
    struct MyComponent {
      @State widthValue: number = 0
      @State heightValue: number = 0
      @State componentWidth: number = 0
      @State componentHeight: number = 0
    
      build() {
        Column() {
          Row() {
            Image($r('app.media.ic_img_2'))
              .width(200)
              .height(150)
              .margin(15)
              .onComplete((msg: {
                width: number,
                height: number,
                componentWidth: number,
                componentHeight: number
              }) => {
                this.widthValue = msg.width
                this.heightValue = msg.height
                this.componentWidth = msg.componentWidth
                this.componentHeight = msg.componentHeight
              })
                // 图片获取失败,打印结果
              .onError(() => {
                console.info('load image fail')
              })
              .overlay('\nwidth: ' + String(this.widthValue) + ', height: ' + String(this.heightValue) + '\ncomponentWidth: ' + String(this.componentWidth) + '\ncomponentHeight: ' + String(this.componentHeight), {
                align: Alignment.Bottom,
                offset: { x: 0, y: 60 }
              })
          }
        }
      }
    }
    

    相关文章

      网友评论

          本文标题:鸿蒙~ArtUI基础开发 Image组件

          本文链接:https://www.haomeiwen.com/subject/neatndtx.html