• HarmonyOS三方件开发指南(7)——compress组件


    目录:

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

    1. 组件compress功能介绍
    1.1.  组件介绍:
            compress是一个轻量级图像压缩库。compress允许将大照片压缩成小尺寸的照片,图像质量损失非常小或可以忽略不计。

    1.2.  手机模拟器上运行效果:
       【软通动力】HarmonyOS三方件开发指南(7)——compress组件

    【软通动力】HarmonyOS三方件开发指南(7)——compress组件

    2. 组件compress使用方法
    2.1.  添加依赖
            将compress-debug.har复制到应用的entrylibs目录下即可(由于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

  • 相关阅读:
    C# 學習使用StatusStrip
    初學C#打印
    C# 學習使用ErrorProvider
    C# 字符串中增、刪、替換字符學習
    mos开发系列教程八:页面代码研究地图控件页面结构
    MapGuide open source开发系列教程五: 屏幕坐标与地图坐标(问题)已修改
    ajax学习笔记一:动态更改div位置
    mos开发系列教七:框架分析
    mos开发系列教程十:说明
    MapGuide open source开发系列教程六: 地图状态与事件(含问题)
  • 原文地址:https://www.cnblogs.com/HarmonyOS/p/14361094.html
Copyright © 2020-2023  润新知