• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 如何处理HEIF图片
2<!--Kit: Image Kit-->
3<!--Subsystem: Multimedia-->
4<!--Owner: @aulight02-->
5<!--Designer: @liyang_bryan-->
6<!--Tester: @xchaosioda-->
7<!--Adviser: @zengyawen-->
8
9## HEIF图片介绍
10
11HEIF图片(High Efficiency Image File Format,HEIF,也称高效图像文件格式),是一个用于单张图像或图像序列的文件格式。它由动态影像专家小组(MPEG)开发,并在MPEG-H Part 12(ISO/IEC 23008-12)中定义。
12
13目前主流的HEIF图片均使用HEVC(H.265)编码,这也是系统当前支持的HEIF图片。HEIF图片在压缩效率上具有明显优势,能够在保证图像质量的同时显著减小文件体积,通常比JPEG节省约50%的存储空间。
14
15系统从API12开始支持HEIF图片的编解码与显示,如果应用基于系统Image Kit、ArkUI Image组件、ArkWeb等模块实现图片处理功能,则可以像处理JPEG、PNG等格式的图片一样,处理HEIF图片。
16
17HEIF图片解码可参考:[图片解码指南(ArkTS)](../image-decoding.md)和[图片解码指南(C/C++)](../image-source-c.md)。
18
19HEIF图片显示可参考:[ArkUI Image组件图片显示](../../../ui/arkts-graphics-display.md)。
20
21HEIF图片编码可参考:[图片编码指南(ArkTS)](../image-encoding.md)和[图片编码指南(C/C++)](../image-packer-c.md)。
22
23ArkWeb图片上传可参考:[使用Web组件上传文件](../../../web/web-file-upload.md)。
24
25## 常见问题
26
27### 上传HEIF图片时提示:“不支持的格式”
28
29一般是由于应用对后缀名为.heic、.heif、.HEIC、.HEIF的图片文件做了过滤限制。
30
31对于使用系统图片处理能力的应用,只需要解除过滤限制,即可正常上传、显示HEIF图片。
32
33如果应用没有使用系统提供的图片处理能力,则可能需要做更多适配,一个可选的方案是将HEIF图片转码成JPEG图片。
34
35### 担心使用HEIF格式图片存在兼容性问题,需使用JPEG或PNG格式的图片,如何操作
36
37可以借助Image Kit的图片编解码能力,将HEIF图片转码成JPEG图片,示例代码如下:
38```ts
39import { BusinessError } from '@kit.BasicServicesKit';
40import { fileIo as fs } from '@kit.CoreFileKit';
41import { image } from '@kit.ImageKit';
42
43async function reEncoding(context : Context, fd : number) {
44    // 首先获取图片文件的fd,创建ImageSource。
45    const imageSource : image.ImageSource = image.createImageSource(fd);
46    // 创建ImagePacker,以便调用图片编码接口。
47    const imagePackerApi = image.createImagePacker();
48    // 配置图片编码选项:
49    // format应使用标准的mimetype格式,如:"image/jpeg"、"image/png"、"image/heic";
50    // quality推荐设置为80,在保证较好的图片质量的同时,可以使编码后的图片文件体积更小;
51    // needsPackProperties参数,用于控制编码时是否保存图片属性信息。默认值为false,即不保存。
52    let packOpts : image.PackingOption = { format:"image/jpeg", quality:80, needsPackProperties:false };
53    // 指定图片编码文件的存放路径。
54    const filePath : string = context.cacheDir + "/result.jpg";
55    let file = fs.openSync(filePath, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);
56    imagePackerApi.packToFile(imageSource, file.fd, packOpts).then(() => {
57        console.info('Succeed to pack the image.');
58    }).catch((error : BusinessError) => {
59        console.error('Failed to pack the image. And the error is: ' + error);
60    }).finally(()=>{
61        fs.closeSync(file.fd);
62    })
63}
64```
65
66使用CAPI完成图片转码的流程也是类似的,首先创建ImageSource和ImagePacker示例,然后指定编码参数,调用图片编码接口完成转码。详细示例代码可参考[使用Image_NativeModule完成图片编码](../image-packer-c.md)。