HarmonyOS 鸿蒙Next 怎么解决Image组件加载图片被旋转90度的问题

发布于 1周前 作者 sinazl 最后一次编辑是 5天前 来自 鸿蒙OS

【问题现象】

  1. 使用Image组件加载图片时,图片自动被旋转了90度。
  2. 问题代码如下:
Image(item)
   .width('100%')
   .aspectRatio(this.getRatio(item))
   .borderRadius(4)

左图为正常显示效果,右图为Image加载显示效果。

点击放大

【背景知识】

Image组件为图片组件,常用于在应用中显示图片。

【定位思路】

1. 使用****Image组件加载其他图片,检查是否为组件问题**

点击放大

检查结果:“新闻”图片正常显示,确认非组件问题。

2. 检查原图片Exif 信息,定位其orientation属性

Exif(Exchangeable image file format)是指嵌入在JPEG图像中的元数据,这些元数据提供了关于图像的属性信息和拍摄数据。其中,orientation是拍摄方向属性,我们可以通过上传原图到Exif信息在线网站或者Exif信息查看软件进行查看。

点击放大

通过在线网站查看图片信息得知该图片的拍摄方向为逆时针旋转90度。由此,定位到图片被旋转的原因。

【解决方案】

方案一:通过组件旋转属性,使图片显示方向正常

我们可以直接给Image组件加上对应的旋转属性,使图片正常显示。因为图片的方向是逆时针90度,那我们将Image组件顺时针旋转90度后,图片会正常显示。通过以下属性旋转:

.rotate({angle:90})

局限性:这种方案只有在我们确定图片的方向信息时才能使用,如果是从网络加载的、不能确定方向的图片列表,该方案则不适用。

方案二:将图片转成ImageSource****对象后读取旋转信息

思路:读取每张图片的方向orientation信息,根据其方向,设置Image组件的旋转方向。

(1)使用image库的createImageSource接口,将图片转换成image.ImageSource对象。

代码示例如下:

const context: Context = getContext(this);
const path: string = context.filesDir + "/test.jpg";
const imageSourceApi: image.ImageSource = image.createImageSource(path);

(2)使用ImageSource的getImageProperty接口获取图片的image.PropertyKey.ORIENTATION旋转信息。

代码示例如下:

imageSourceApi.getImageProperty(image.PropertyKey.ORIENTATION, options)
  .then((data: string) => {
    console.info('Succeeded in getting the value of the specified attribute key of the image.', data);
  }).catch((error: BusinessError) => {
    console.error('Failed to get the value of the specified attribute key of       the image.');
})

日志打印:Succeeded in getting the value of the specified attribute key of the image. Right-top

取到旋转信息Right-top,查阅HarmonyOS文档上该枚举值对应的含义得知,我们应该将Image组件顺时针旋转90度。

图片方向
Top-left 图像未旋转
Top-right 镜像水平翻转
Bottom-right 图像旋转180°
Bottom-left 镜像垂直翻转
Left-top 镜像水平翻转再顺时针旋转270°
Right-top 顺时针旋转90°
Right-bottom 镜像水平翻转再顺时针旋转90°
Left-bottom 顺时针旋转270°

(3)最后,将Image组件按照方案一的方法进行旋转,图片正常显示。

img

详情请见参考链接

1 回复

HarmonyOS 鸿蒙Next中Image组件加载图片被旋转90度的问题,通常是由于图片中包含的Exif信息指示了旋转。为解决此问题,开发者可以采取以下方案:

  1. 下载并转换图片:首先通过网络请求下载图片,然后使用Image组件的createImageSource方法将其转换为ImageSource对象。接着,通过imageSource.createPixelMap接口转成PixelMap对象。
  2. 获取并判断旋转信息:利用getImageProperty接口并传入"Orientation"作为PropertyKey来获取图片的旋转信息。根据获取的信息判断图片是否需要旋转。
  3. 适配Image组件:根据上一步的判断结果,对PixelMap对象的图片进行必要的旋转处理(如果需要),最后将处理后的图片设置给Image组件。

以上方案需要开发者具备一定的编程和图像处理知识。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部