目录:
1. 组件compress功能介绍
2. 组件compress使用方法
3. 组件compress开发实现

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

作者:软通田可辉

想了解更多内容,请访问: 51CTO和华为官方战略合作共建的鸿蒙技术社区https://harmonyos.51cto.com

HarmonyOS三方件开发指南(7)——compress组件的更多相关文章

  1. HarmonyOS三方件开发指南(14)-Glide组件功能介绍

    <HarmonyOS三方件开发指南>系列文章合集 引言 在实际应用开发中,会用到大量图片处理,如:网络图片.本地图片.应用资源.二进制流.Uri对象等,虽然官方提供了PixelMap进行图 ...

  2. HarmonyOS三方件开发指南(19)-BGABadgeView徽章组件

    目录: 1.引言 2.功能介绍 3.BGABadgeView 使用指南 4.BGABadgeView 开发指南 5.<HarmonyOS三方件开发指南>系列文章合集 引言 现在很多的APP ...

  3. HarmonyOS三方件开发指南(12)——cropper图片裁剪

    鸿蒙入门指南,小白速来!0基础学习路线分享,高效学习方法,重点答疑解惑--->[课程入口] 目录:1. cropper组件功能介绍2. cropper使用方法3. cropper组件开发实现4. ...

  4. HarmonyOS三方件开发指南(13)-SwipeLayout侧滑删除

    鸿蒙入门指南,小白速来!0基础学习路线分享,高效学习方法,重点答疑解惑--->[课程入口] 目录:1. SwipeLayout组件功能介绍2. SwipeLayout使用方法3. SwipeLa ...

  5. HarmonyOS三方件开发指南(15)-LoadingView功能介绍

    目录: 1. LoadingView组件功能介绍2. Lottie使用方法3. Lottie开发实现4.<HarmonyOS三方件开发指南>系列文章合集 1. LoadingView组件功 ...

  6. HarmonyOS三方件开发指南(16)-VideoCache 视频缓存

    目录: 1.引言 2.功能介绍 3.VideoCache使用指南 4.VideoCache开发指南 5.<HarmonyOS三方件开发指南>系列文章合集 引言 对于视频播放器这个app大家 ...

  7. HarmonyOS三方件开发指南(17)-BottomNavigationBar

    目录: 1.引言 2.功能介绍 3.BottomNavigationBar使用指南 4.BottomNavigationBar开发指南 5.<HarmonyOS三方件开发指南>文章合集 引 ...

  8. HarmonyOS三方件开发指南(8)——RoundedImage

    [小年答谢,新春送礼]免费抽取1000元京东卡+更多新春好礼~查看详情>>> 目录: 1. RoundedImage组件功能介绍 2. RoundedImage使用方法 3. Rou ...

  9. HarmonyOS三方件开发指南(4)——Logger组件

    目录: 1.      Logger功能介绍 2.      Logger使用方法 3.      Logger开发实现 4.      源码上传地址 1.      Logger功能介绍1.1.   ...

随机推荐

  1. .net通过iTextSharp.pdf操作pdf文件实现查找关键字签字盖章

    之前这个事情都CA公司去做的,现在给客户做demo,要模拟一下签字盖章了,我们的业务PDF文件是动态生成的所以没法通过坐标定位,只能通过关键字查找定位了. 之前在网上看了许多通多通过查询关键字,然后图 ...

  2. Hbase原理(转学习自用)

    一.系统架构 从HBase的架构图上可以看出,HBase中的组件包括Client.Zookeeper.HMaster.HRegionServer.HRegion.Store.MemStore.Stor ...

  3. java实现发送短信验证码

    java实现短信验证码发送 由于我们使用第三方平台进行验证码的发送,所以首先,我们要在一个平台进行注册. 在这里我选择是秒嘀科技,因为新人注册会赠送十元,足够测试使用了. 注册完成后,我们需要获取自己 ...

  4. C#扫盲篇(四):.NET Core 的异步编程-只讲干货(async,await,Task)

    关于async,await,task的用法和解释这里就不要说明了,网上一查一大堆.至于为啥还要写这篇文章,主要是其他文章水分太多,不适合新手学习和理解.以下内容纯属个人理解,如果有误,请高手指正.本文 ...

  5. Java 中泛型的实现原理

    泛型是 Java 开发中常用的技术,了解泛型的几种形式和实现泛型的基本原理,有助于写出更优质的代码.本文总结了 Java 泛型的三种形式以及泛型实现原理. 泛型 泛型的本质是对类型进行参数化,在代码逻 ...

  6. Java 设置Excel条件格式(高亮条件值、应用单元格值/公式/数据条等类型)

    概述 在Excel中,应用条件格式功能可以在很大程度上改进表格的设计和可读性,用户可以指定单个或者多个单元格区域应用一种或者多种条件格式.本篇文章,将通过Java程序示例介绍条件格式的设置方法,设置条 ...

  7. linux中常用服务的安装

    安装环境:centos7.5 配置离线yum源参考:https://blog.csdn.net/mayh554024289/article/details/54236336vi /etc/yum.co ...

  8. 天梯赛练习 L3-011 直捣黄龙 (30分) dijkstra + dfs

    题目分析: 本题我有两种思路,一种是只依靠dijkstra算法,在dijkstra部分直接判断所有的情况,以局部最优解得到全局最优解,另一种是dijkstra + dfs,先计算出最短距离以及每个点的 ...

  9. LAN-SHARE 使用教程

    Description: 我的个人项目 LAN-Share 的使用教程:局域网内文件分享工具 LAN-Share 是一个基于 Node.js 的用于局域网内文件分享的工具,易于配置与部署. 项目地址: ...

  10. Vim 自动添加脚本头部信息

    每次写脚本还在为忘记添加头部信息啥的烦恼? 按照下面这么做,帮你减轻点烦恼. # 打开配置文件: vim /root/.vimrc # 添加如下信息: autocmd BufNewFile *.sh ...