目录:
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

 
  
  
  
 
 
  
 
 
 