Android压缩本地图片

图片是移动应用程序中常见的资源之一,但是高分辨率的图片可能会导致应用程序占用过多的存储空间和资源。为了解决这个问题,Android提供了压缩本地图片的方法。本文将介绍如何在Android应用程序中压缩本地图片,并提供代码示例。

为什么要压缩图片?

在移动应用程序中,加载和显示高分辨率的图片可能会导致以下问题:

  1. 占用过多的存储空间:高分辨率的图片文件大小通常较大,会占用较多的存储空间,尤其是在应用程序中使用多张图片时。
  2. 占用过多的内存:加载和显示大型图片会占用大量的内存,容易导致应用程序运行缓慢或崩溃。
  3. 加载速度慢:大型图片需要更长的时间来下载和解码,会导致应用程序的加载速度变慢。

因此,为了提高应用程序的性能和用户体验,我们需要对本地图片进行压缩处理。

压缩本地图片的方法

Android提供了多种方法来压缩本地图片,其中包括以下常用的方法:

使用BitmapFactory.Options进行压缩

我们可以使用BitmapFactory.Options类的inSampleSize属性来降低图片的分辨率,从而减小图片的文件大小。inSampleSize表示原图中的每个像素在压缩后的图片中所占的像素数。通过设置inSampleSize为2,可以将图片的宽高都缩小为原来的一半。

下面是使用BitmapFactory.Options进行图片压缩的示例代码:

public Bitmap compressImage(String imagePath, int compressRatio) {
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = compressRatio; // 设置压缩比例
    Bitmap bitmap = BitmapFactory.decodeFile(imagePath, options);
    return bitmap;
}

使用Bitmap.compress()方法进行压缩

另一种常用的方法是使用Bitmap类的compress()方法将Bitmap对象保存为图片文件,并指定压缩的质量。compress()方法接受一个OutputStream参数和一个压缩质量参数,通过设置压缩质量参数为0-100之间的值来控制压缩的效果。

下面是使用Bitmap.compress()方法进行图片压缩的示例代码:

public void compressImage(Bitmap bitmap, String outputPath, int quality) {
    FileOutputStream fos = null;
    try {
        fos = new FileOutputStream(outputPath);
        bitmap.compress(Bitmap.CompressFormat.JPEG, quality, fos);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } finally {
        if (fos != null) {
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

示例代码

下面是一个完整的示例代码,演示了如何压缩本地图片:

public class MainActivity extends AppCompatActivity {
    private ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView = findViewById(R.id.imageView);

        // 原始图片路径
        String imagePath = "/storage/emulated/0/Pictures/Travel/travel.jpg";
        // 压缩后图片保存路径
        String outputPath = "/storage/emulated/0/Pictures/Travel/travel_compressed.jpg";

        // 压缩图片
        Bitmap bitmap = compressImage(imagePath, 2);
        // 显示压缩后的图片
        imageView.setImageBitmap(bitmap);

        // 保存压缩后的图片
        compressImage(bitmap, outputPath, 80);
    }

    public Bitmap compressImage(String imagePath, int compressRatio) {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = compressRatio; // 设置压缩比例
        Bitmap bitmap = BitmapFactory.decodeFile(imagePath, options);
        return bitmap;
    }

    public void compressImage(Bitmap bitmap, String outputPath, int quality) {
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(outputPath);
            bitmap.compress(Bitmap.CompressFormat.JPEG, quality, fos);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (fos != null)