HarmonyOS三方件开发指南(7)——compress组件
目录:
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组件的更多相关文章
- HarmonyOS三方件开发指南(14)-Glide组件功能介绍
<HarmonyOS三方件开发指南>系列文章合集 引言 在实际应用开发中,会用到大量图片处理,如:网络图片.本地图片.应用资源.二进制流.Uri对象等,虽然官方提供了PixelMap进行图 ...
- HarmonyOS三方件开发指南(19)-BGABadgeView徽章组件
目录: 1.引言 2.功能介绍 3.BGABadgeView 使用指南 4.BGABadgeView 开发指南 5.<HarmonyOS三方件开发指南>系列文章合集 引言 现在很多的APP ...
- HarmonyOS三方件开发指南(12)——cropper图片裁剪
鸿蒙入门指南,小白速来!0基础学习路线分享,高效学习方法,重点答疑解惑--->[课程入口] 目录:1. cropper组件功能介绍2. cropper使用方法3. cropper组件开发实现4. ...
- HarmonyOS三方件开发指南(13)-SwipeLayout侧滑删除
鸿蒙入门指南,小白速来!0基础学习路线分享,高效学习方法,重点答疑解惑--->[课程入口] 目录:1. SwipeLayout组件功能介绍2. SwipeLayout使用方法3. SwipeLa ...
- HarmonyOS三方件开发指南(15)-LoadingView功能介绍
目录: 1. LoadingView组件功能介绍2. Lottie使用方法3. Lottie开发实现4.<HarmonyOS三方件开发指南>系列文章合集 1. LoadingView组件功 ...
- HarmonyOS三方件开发指南(16)-VideoCache 视频缓存
目录: 1.引言 2.功能介绍 3.VideoCache使用指南 4.VideoCache开发指南 5.<HarmonyOS三方件开发指南>系列文章合集 引言 对于视频播放器这个app大家 ...
- HarmonyOS三方件开发指南(17)-BottomNavigationBar
目录: 1.引言 2.功能介绍 3.BottomNavigationBar使用指南 4.BottomNavigationBar开发指南 5.<HarmonyOS三方件开发指南>文章合集 引 ...
- HarmonyOS三方件开发指南(8)——RoundedImage
[小年答谢,新春送礼]免费抽取1000元京东卡+更多新春好礼~查看详情>>> 目录: 1. RoundedImage组件功能介绍 2. RoundedImage使用方法 3. Rou ...
- HarmonyOS三方件开发指南(4)——Logger组件
目录: 1. Logger功能介绍 2. Logger使用方法 3. Logger开发实现 4. 源码上传地址 1. Logger功能介绍1.1. ...
随机推荐
- 基于ESP32的智能家居管理系统的设计与实现
基于ESP32的智能家居管理系统的设计与实现 ESP32的智能家居管理系统访问链接: https://www.cnblogs.com/easyidea/p/13101165.html 一.需求分析 1 ...
- 决胜面试之---SQL经典面试题
在SQL面试部分,一般会考核多表连接查询能力,精选了一些SQL面试题记录下: 四张表(学生表,教师表,课程表,成绩表) 以下是表的创建和添加SQL语句 学生 ...
- API企业级网关设计
前言 摘自--https://github.com/aCoder2013/blog/issues/35 假设你正在开发一个电商网站,那么这里会涉及到很多后端的微服务,比如会员.商品.推荐服务等等. 那 ...
- Linux 网卡 team配置
网卡 team配置 目录 网卡 team配置 一.介绍 runner 方式: 1.roundrobin [mode 0]轮转策略 (balance-rr) 2.activebackup[mode 1] ...
- JVM笔记——类加载
1.在java代码中,类型(如class enum interface)的加载.连接.初始化过程都是在程序运行期完成的.这个特性,使得本为静态语言的java,拥有了动态语言的某些特征 加载:查找并加载 ...
- eclipse的相关操作和使用快捷键
修改字体Window->preferences->General->Appearance->ColorsandFonts ->Basic->text Font 在e ...
- 每日一个linux命令5 -- rm
rm命令.rm是常用的命令,该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除.对于链接文件,只是删除了链接,原有文件均保持不变. rm是一个危险的命 ...
- EF Core CodeFirst数据库自动迁移
开发过程中都会遇到数据库数据结构更新的问题,怎么对数据库更新进行版本控制呢? 不同的项目对数据库版本更新控制的方式不同,常用的有第三方Evolve,开发人员将数据库更新脚本按照版本号的放在一起,然后执 ...
- Linux基础命令整合
linux基础命令整理 1.系统相关命令 shutdown -h now 关闭系统(1) init 0 关闭系统(2) telinit 0 关闭系统(3) shutdown -h hours:minu ...
- 一文带你学会AQS和并发工具类的关系
1. 存在的意义 AQS(AbstractQueuedSynchronizer)是JAVA中众多锁以及并发工具的基础,其底层采用乐观锁,大量使用了CAS操作, 并且在冲突时,采用自旋方式重试,以实 ...