目录:
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. 基于ESP32的智能家居管理系统的设计与实现

    基于ESP32的智能家居管理系统的设计与实现 ESP32的智能家居管理系统访问链接: https://www.cnblogs.com/easyidea/p/13101165.html 一.需求分析 1 ...

  2. 决胜面试之---SQL经典面试题

    在SQL面试部分,一般会考核多表连接查询能力,精选了一些SQL面试题记录下: 四张表(学生表,教师表,课程表,成绩表)                       以下是表的创建和添加SQL语句 学生 ...

  3. API企业级网关设计

    前言 摘自--https://github.com/aCoder2013/blog/issues/35 假设你正在开发一个电商网站,那么这里会涉及到很多后端的微服务,比如会员.商品.推荐服务等等. 那 ...

  4. Linux 网卡 team配置

    网卡 team配置 目录 网卡 team配置 一.介绍 runner 方式: 1.roundrobin [mode 0]轮转策略 (balance-rr) 2.activebackup[mode 1] ...

  5. JVM笔记——类加载

    1.在java代码中,类型(如class enum interface)的加载.连接.初始化过程都是在程序运行期完成的.这个特性,使得本为静态语言的java,拥有了动态语言的某些特征 加载:查找并加载 ...

  6. eclipse的相关操作和使用快捷键

    修改字体Window->preferences->General->Appearance->ColorsandFonts ->Basic->text Font 在e ...

  7. 每日一个linux命令5 -- rm

    rm命令.rm是常用的命令,该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除.对于链接文件,只是删除了链接,原有文件均保持不变. rm是一个危险的命 ...

  8. EF Core CodeFirst数据库自动迁移

    开发过程中都会遇到数据库数据结构更新的问题,怎么对数据库更新进行版本控制呢? 不同的项目对数据库版本更新控制的方式不同,常用的有第三方Evolve,开发人员将数据库更新脚本按照版本号的放在一起,然后执 ...

  9. Linux基础命令整合

    linux基础命令整理 1.系统相关命令 shutdown -h now 关闭系统(1) init 0 关闭系统(2) telinit 0 关闭系统(3) shutdown -h hours:minu ...

  10. 一文带你学会AQS和并发工具类的关系

    1. 存在的意义   AQS(AbstractQueuedSynchronizer)是JAVA中众多锁以及并发工具的基础,其底层采用乐观锁,大量使用了CAS操作, 并且在冲突时,采用自旋方式重试,以实 ...