zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Android 解决小米手机Android Studio安装app 报错的问题It is possible that this issue is resolved by uninstalling an existi
    Android Unresolved Dependencies
    Android studio 自定义打包apk名
    Android Fragment与Activity交互的几种方式
    魅族和三星Galaxy 5.0webView 问题Android Crash Report
    Android几种常见的多渠道(批量)打包方式介绍
    Android批量打包 如何一秒内打完几百个apk渠道包
    上周热点回顾(9.30-10.6)团队
    上周热点回顾(9.23-9.29)团队
    上周热点回顾(9.16-9.22)团队
  • 原文地址:https://www.cnblogs.com/HarmonyOS/p/14361094.html
Copyright © 2011-2022 走看看