面试总结之Android Bitmap 深度解析与性能优化
1. 质量压缩
原理
质量压缩主要针对像 JPEG 这类支持有损压缩的图片格式。JPEG 格式通过去除人眼不太敏感的图像细节,来实现文件大小的减小。在 Android 里,Bitmap
的compress
方法能够把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 如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/596226.html 如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!