当前位置:首页 > 数据库

鸿蒙HarmonyOS三方件开发指南(7)-compress组件

 

想了解更多内容,鸿蒙请访问:

和华为官方合作共建的开件鸿蒙技术社区

https://harmonyos.51cto.com/#zz

1. 组件compress功能介绍

1.1. 组件介绍:

compress是一个轻量级图像压缩库。compress允许将大照片压缩成小尺寸的鸿蒙照片,图像质量损失非常小或可以忽略不计。开件

1.2. 手机模拟器上运行效果:

2. 组件compress使用方法

2.1. 添加依赖

将compress-debug.har复制到应用的鸿蒙entry\libs目录下即可(由于build.gradle中已经依赖的libs目录下的*.har,源码下载因此不需要再做修改)。开件

2.2. 设置布局

<DependentLayout     xmlns:ohos="http://schemas.huawei.com/res/ohos"     ohos:width="match_parent"     ohos:height="match_parent"     ohos:background_element="#FFFFFF">     <Image         ohos:id="$+id:image1"         ohos:height="match_parent"         ohos:width="match_parent"         ohos:image_src="$media:dog1.PNG"/>     <Text         ohos:id="$+id:text"         ohos:width="match_content"         ohos:height="match_content"         ohos:text=""         ohos:text_size="19fp"         ohos:text_color="#1C1C1C"         ohos:top_padding="8vp"         ohos:bottom_padding="8vp"         ohos:right_padding="70vp"         ohos:left_padding="70vp"         ohos:center_in_parent="true"         ohos:align_parent_bottom="true"         ohos:bottom_margin="120vp"/>     <Button         ohos:id="$+id:choose_button"         ohos:width="match_content"         ohos:height="match_content"         ohos:text="Choose Image"         ohos:text_size="19fp"         ohos:text_color="#FFFFFF"         ohos:top_padding="8vp"         ohos:bottom_padding="8vp"         ohos:right_padding="70vp"         ohos:left_padding="70vp"         ohos:background_element="$graphic:background_button"         ohos:center_in_parent="true"         ohos:align_parent_bottom="true"         ohos:bottom_margin="75vp"/>     <Button         ohos:id="$+id:button"         ohos:width="match_content"         ohos:height="match_content"         ohos:text="Compress"         ohos:text_size="19fp"         ohos:text_color="#FFFFFF"         ohos:top_padding="8vp"         ohos:bottom_padding="8vp"         ohos:right_padding="70vp"         ohos:left_padding="70vp"         ohos:background_element="$graphic:background_button"         ohos:center_in_parent="true"         ohos:align_parent_bottom="true"         ohos:bottom_margin="15vp"/> </DependentLayout> 

 2.3. 图像压缩

核心类:Compressor

核心方法:

(1)自定义压缩:

public static File customCompress(Context context,鸿蒙 File file, int width, int height, int quality) throws IOException  

参数:

context - 应用程序上下文

file - 待压缩图片抽象路径名

width - 压缩后宽度

height - 压缩后高度

quality - 图片压缩质量,范围0~100

结果:

返回压缩后图片抽象路径名。开件

异常:

发生I/O异常

(2)默认压缩:

public static File defaultCompress(Context context,鸿蒙 File file) throws IOException 

参数:

context - 应用程序上下文

file - 待压缩图片抽象路径名

结果:

返回压缩后图片抽象路径名。

异常:

发生I/O异常

简单示例:

运行示例前需要在模拟器保存一张截图或使用相机功能照一张照片

public void onStart(Intent intent) {      super.onStart(intent);     super.setUIContent(ResourceTable.Layout_ability_main);     // 请求文件的开件读取权限     String[] permissions = { "ohos.permission.READ_USER_STORAGE"};     requestPermissionsFromUser(permissions, 0);     // 获取压缩按钮并绑定事件     Button button = (Button) findComponentById(ResourceTable.Id_button);     if (button != null) {          // 为按钮设置点击回调         button.setClickedListener(new Component.ClickedListener() {              @Override             public void onClick(Component component) {                  try {                      File file = new File(System.getProperty("java.io.tmpdir") + File.separator + tmpName);                     HiLog.error(LOG_LABEL, "old size..." + file.length() +  " ...b");                     // 默认压缩                     // File newFile = Compressor.defaultCompress(file);                     // 自定义压缩                     File newFile = Compressor.customCompress(getContext(), file, 500, 1000, 60);                     Text text = (Text) findComponentById(ResourceTable.Id_text);                     text.setText("size: " + newFile.length() + " b");                     HiLog.error(LOG_LABEL, "new size..." + newFile.length() +  " ...b");                     PixelMap newPixelMap = Compressor.decode(newFile);                     Image image = (Image) findComponentById(ResourceTable.Id_image1);                     image.setPixelMap(newPixelMap);                 } catch (IOException e) {                      e.printStackTrace();                 }             }         });     }     // 获取选择图片按钮并绑定事件     Button chooseButton = (Button) findComponentById(ResourceTable.Id_choose_button);     if (chooseButton != null) {          // 为按钮设置点击回调         chooseButton.setClickedListener(new Component.ClickedListener() {              @Override             public void onClick(Component component) {                  DataAbilityHelper helper = DataAbilityHelper.creator(getContext());                 try {                      ResultSet resultSet = helper.query(AVStorage.Images.Media.EXTERNAL_DATA_ABILITY_URI, null, null);                     while (resultSet != null && resultSet.goToNextRow()) {                          // 互殴媒体库的图片                         int id = resultSet.getInt(resultSet.getColumnIndexForName(AVStorage.Images.Media.ID));                         HiLog.error(LOG_LABEL, "id:..." + id +  " ...");                         Uri uri = Uri.appendEncodedPathToUri(AVStorage.Images.Media.EXTERNAL_DATA_ABILITY_URI, "" + id);                         // 根据图片的uri打开文件并保存到临时目录中                         FileDescriptor fileDescriptor = helper.openFile(uri, "r");                         ImageSource.DecodingOptions decodingOpts = new ImageSource.DecodingOptions();                         decodingOpts.sampleSize = ImageSource.DecodingOptions.DEFAULT_SAMPLE_SIZE;                         ImageSource imageSource = ImageSource.create(fileDescriptor, null);                         PixelMap pixelMap = imageSource.createThumbnailPixelmap(decodingOpts, true);                         ImagePacker imagePacker = ImagePacker.create();                         tmpName = UUID.randomUUID().toString();                         File file = new File(System.getProperty("java.io.tmpdir") + File.separator + tmpName);                         FileOutputStream outputStream = new FileOutputStream(file);                         ImagePacker.PackingOptions packingOptions = new ImagePacker.PackingOptions();                         packingOptions.quality = 100;                         boolean result = imagePacker.initializePacking(outputStream, packingOptions);                         result = imagePacker.addImage(pixelMap);                         long dataSize = imagePacker.finalizePacking();                         // 显示图片和图片大小                         Text text = (Text) findComponentById(ResourceTable.Id_text);                         text.setText("size: " + file.length() + " b");                         Image image = (Image) findComponentById(ResourceTable.Id_image1);                         image.setPixelMap(pixelMap);                     }                 } catch (DataAbilityRemoteException | FileNotFoundException e) {                      e.printStackTrace();                 }             }         });     } } 

 3. 组件compress开发实现

3.1. 拷贝图片制临时目录

传入的图片路径拷贝临时文件到应用的临时目录。香港云服务器

private static File copyToCache(Context context,鸿蒙 File imageFile) throws IOException {      PixelMap pixelMap = decode(imageFile);     String cachePath = context.getCacheDir() + File.separator + imageFile.getName();     File cacheFile = new File(cachePath);     int quality = 100; // 压缩质量     refreshTmpFile(pixelMap, cacheFile, quality);     return cacheFile; } 

 3.2. 图片解码

对临时目录里的图片进行解码

private static PixelMap decode(File file, int width, int height) {      ImageSource imageSource = ImageSource.create(file, null);     mageSource.DecodingOptions decodingOpts = new ImageSource.DecodingOptions();     decodingOpts.desiredSize = new Size(width, height);     return imageSource.createPixelmap(decodingOpts); } 

 3.3. 图片编码

按照开发人员设定的规则进行编码,生成新图片

private static void refreshTmpFile(PixelMap pixelMap,开件 File file, int quality) throws IOException {      ImagePacker imagePacker = ImagePacker.create();     ImagePacker.PackingOptions options = new ImagePacker.PackingOptions();     options.quality = quality;     imagePacker.initializePacking(new FileOutputStream(file), options);     imagePacker.addImage(pixelMap);     imagePacker.finalizePacking(); } 

 项目源代码地址:https://github.com/isoftstone-dev/Compressor_Harmony

欢迎交流:HOS@isoftstone.com

©著作权归作者和HarmonyOS技术社区共同所有,如需转载,鸿蒙请注明出处,开件否则将追究法律责任。鸿蒙

想了解更多内容,请访问:

和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com/#zz

高防服务器

分享到:

滇ICP备2023006006号-16