当前位置: 首页 > article >正文

面试总结之Android Bitmap 深度解析与性能优化

1. 质量压缩

原理

质量压缩主要针对像 JPEG 这类支持有损压缩的图片格式。JPEG 格式通过去除人眼不太敏感的图像细节,来实现文件大小的减小。在 Android 里,Bitmapcompress方法能够把Bitmap对象以指定的压缩格式和质量保存到输出流中。质量参数取值范围是 0 - 100,0 代表最低质量(文件最小),100 代表最高质量(文件最大)。

适用场景
  • 当你需要在不改变图片尺寸的前提下减小文件大小时,比如要将图片上传到服务器,为了节省网络流量,可采用质量压缩。
  • 若要在保持图片清晰度的同时减小存储空间,也可以使用这种方法。
优缺点
  • 优点:操作简单,不会改变图片的像素尺寸,能保证图片在视觉上的尺寸不变。
  • 缺点:属于有损压缩,过度压缩会使图片质量明显下降,出现模糊、失真等问题。
代码深入分析
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Bitmap.CompressFormat;
import java.io.FileOutputStream;
import java.io.IOException;

public class BitmapCompression {

    public static void qualityCompression(Bitmap bitmap, int quality, String filePath) {
        try {
            // 创建一个文件输出流,用于将压缩后的图片写入指定文件
            FileOutputStream fos = new FileOutputStream(filePath);
            // 调用 compress 方法进行质量压缩
            bitmap.compress(CompressFormat.JPEG, quality, fos);
            // 刷新输出流,确保数据全部写入文件
            fos.flush();
            // 关闭输出流,释放资源
            fos.close();
        } catch (IOException e) {
            // 捕获并处理可能出现的 IO 异常
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        // 从文件路径解码得到原始 Bitmap 对象
        Bitmap originalBitmap = BitmapFactory.decodeFile("path/to/original/image.jpg");
        // 设定压缩质量,这里设为 50
        int quality = 50;
        // 设定输出文件的路径
        String outputFilePath = "path/to/output/image.jpg";
        // 调用质量压缩方法
        qualityCompression(originalBitmap, quality, outputFilePath);
    }
}

2. 采样率压缩

原理

在 Android 中,加载图片时若直接将大尺寸图片完整加载到内存,会占用大量内存,容易引发内存溢出问题。采样率压缩的核心在于在加载图片时,根据需要的尺寸计算合适的采样率,然后使用该采样率对图片进行解码。采样率 inSampleSize 是一个大于等于 1 的整数,当 inSampleSize 为 1 时,表示不进行采样;当 inSampleSize 为 2 时,表示图片的宽度和高度都变为原来的 1/2,像素数量变为原来的 1/4。

适用场景
  • 当图片尺寸过大,而实际显示区域较小时,例如在列表中显示大量图片,为避免内存溢出,可采用采样率压缩。
  • 加载图片时,若内存有限,需要提前对图片进行压缩处理。
优缺点
  • 优点:能有效减少内存占用,避免内存溢出问题,尤其适用于处理大尺寸图片。
  • 缺点:会降低图片的像素尺寸,图片细节可能会丢失。
代码深入分析
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

public class BitmapCompression {

    public static Bitmap sampleRateCompression(String filePath, int reqWidth, int reqHeight) {
        // 创建一个 BitmapFactory.Options 对象,用于设置解码参数
        BitmapFactory.Options options = new BitmapFactory.Options();
        // 设置 inJustDecodeBounds 为 true,表示只获取图片的尺寸信息,不加载图片到内存
        options.inJustDecodeBounds = true;
        // 第一次解码,获取图片的尺寸信息
        BitmapFactory.decodeFile(filePath, options);

        // 调用 calculateInSampleSize 方法计算合适的采样率
        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

        // 设置 inJustDecodeBounds 为 false,表示这次要真正加载图片到内存
        options.inJustDecodeBounds = false;
        // 第二次解码,使用计算好的采样率加载图片
        return BitmapFactory.decodeFile(filePath, options);
    }

    private static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
        // 获取原始图片的高度
        final int height = options.outHeight;
        // 获取原始图片的宽度
        final int width = options.outWidth;
        // 初始化采样率为 1
        int inSampleSize = 1;

        if (height > reqHeight || width > reqWidth) {
            // 计算原始图片高度的一半
            final int halfHeight = height / 2;
            // 计算原始图片宽度的一半
            final int halfWidth = width / 2;

            // 循环计算满足要求的最大采样率
            while ((halfHeight / inSampleSize) >= reqHeight
                    && (halfWidth / inSampleSize) >= reqWidth) {
                inSampleSize *= 2;
            }
        }

        return inSampleSize;
    }

    public static void main(String[] args) {
        // 图片的文件路径
        String imagePath = "path/to/original/image.jpg";
        // 需要的图片宽度
        int reqWidth = 200;
        // 需要的图片高度
        int reqHeight = 200;
        // 调用采样率压缩方法
        Bitmap compressedBitmap = sampleRateCompression(imagePath, reqWidth, reqHeight);
    }
}

3. 缩放压缩

原理

缩放压缩是通过对 Bitmap 对象进行缩放操作来改变图片的像素尺寸。Bitmap.createScaledBitmap 方法会根据指定的缩放比例创建一个新的 Bitmap 对象,新的 Bitmap 对象的宽度和高度会根据缩放比例进行调整。

适用场景
  • 当需要调整图片的尺寸以适应特定的显示区域时,例如将图片显示在一个固定大小的 ImageView 中。
  • 对图片进行裁剪或调整比例时,可使用缩放压缩。
优缺点
  • 优点:可以精确控制图片的尺寸,能满足不同的显示需求。
  • 缺点:会改变图片的像素尺寸,可能会导致图片失真,尤其是在缩放比例较大时。
代码深入分析
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

public class BitmapCompression {

    public static Bitmap scaleCompression(Bitmap bitmap, float scaleX, float scaleY) {
        // 获取原始 Bitmap 的宽度
        int width = bitmap.getWidth();
        // 获取原始 Bitmap 的高度
        int height = bitmap.getHeight();
        // 计算缩放后的宽度
        int newWidth = (int) (width * scaleX);
        // 计算缩放后的高度
        int newHeight = (int) (height * scaleY);
        // 调用 createScaledBitmap 方法进行缩放操作
        return Bitmap.createScaledBitmap(bitmap, newWidth, newHeight, true);
    }

    public static void main(String[] args) {
        // 从文件路径解码得到原始 Bitmap 对象
        Bitmap originalBitmap = BitmapFactory.decodeFile("path/to/original/image.jpg");
        // 水平缩放比例,这里设为 0.5
        float scaleX = 0.5f;
        // 垂直缩放比例,这里设为 0.5
        float scaleY = 0.5f;
        // 调用缩放压缩方法
        Bitmap compressedBitmap = scaleCompression(originalBitmap, scaleX, scaleY);
    }
}

希望可以帮助你学习Android,感谢观看!!!

原文地址:https://blog.csdn.net/2301_80329517/article/details/146394929
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/596226.html

相关文章:

  • 第9章:Docker Compose企业级多容器编排
  • 19.课程发布-freeMarker
  • 读取Table的结构转换为Model类
  • kOps + Karpenter 集成实践:实现 K8s 集群的动态扩展
  • [Vue]条件渲染
  • Python 应用部署云端实战指南 —— AWS、Google Cloud 与 Azure 全解析
  • 基于香橙派 KunpengPro学习CANN(2)——Ascend Extension for PyTorch 配置与安装
  • docker搭建云盘
  • 说一下yolo的一些概念 和 自己对 置信度阈值 和图像处理模板匹配的理解
  • 如何把全局坐标系转到机器人本体坐标系
  • Android数据加密方案
  • 深入解析计算机组成原理:从硬件架构到程序运行的本质
  • 【access开发】导入excel 并生成表
  • Object 转 JSONObject 并排除null和““字符串
  • SpringSecurity——前后端分离登录认证
  • 工作相关记录
  • 深入了解 C# 中的 LINQ:功能、语法与应用解析
  • 基于深度学习的皮肤癌智能检测与语音提示系统【python源码+Pyqt5界面+数据集+训练代码】
  • 使用ArgoCD管理Kubernetes部署指南
  • php文件包含与伪协议