Android 保存 Bitmap

介绍

在 Android 开发中,经常需要对图片进行处理,其中一项常见的操作是保存 Bitmap 到本地存储或共享给其他应用程序。本文将介绍如何在 Android 应用中保存 Bitmap,并提供相关代码示例。

保存 Bitmap

要保存 Bitmap,可以使用 Android 提供的 Bitmap.compress() 方法将 Bitmap 对象写入到文件中。以下是保存 Bitmap 的步骤:

  1. 创建一个用于保存 Bitmap 的文件。
  2. 创建一个输出流,将 Bitmap 写入到文件中。
  3. 使用 Bitmap.compress() 方法将 Bitmap 写入到输出流。
  4. 关闭输出流。

下面是保存 Bitmap 的相关代码示例:

// 创建一个用于保存 Bitmap 的文件
File file = new File(Environment.getExternalStorageDirectory(), "image.jpg");

// 创建一个输出流,将 Bitmap 写入到文件中
OutputStream outputStream = new FileOutputStream(file);

// 使用 Bitmap.compress() 方法将 Bitmap 写入到输出流
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);

// 关闭输出流
outputStream.close();

首先,我们创建一个 File 对象,指定保存 Bitmap 的文件名和路径。这里我们使用 Environment.getExternalStorageDirectory() 方法获取外部存储目录,并在该目录下创建一个名为 "image.jpg" 的文件。

然后,我们创建一个 FileOutputStream 对象,将文件对象传递给它。接下来,我们使用 Bitmap.compress() 方法将 Bitmap 写入到输出流中。Bitmap.CompressFormat.JPEG 表示将 Bitmap 以 JPEG 格式进行压缩,第二个参数表示压缩质量,100 表示无损压缩。

最后,我们关闭输出流,确保保存操作的顺利完成。

权限

在保存 Bitmap 时,我们需要在 AndroidManifest.xml 文件中添加相关权限。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

添加 WRITE_EXTERNAL_STORAGE 权限后,我们的应用程序将具有写入外部存储的权限。

示例应用

下面是一个完整的示例应用,演示如何保存 Bitmap 到本地存储。

// 导入相关类
import android.Manifest;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class MainActivity extends AppCompatActivity {

    private static final int REQUEST_PERMISSION_CODE = 1;

    private ImageView imageView;
    private Button saveButton;

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

        // 初始化视图
        imageView = findViewById(R.id.imageView);
        saveButton = findViewById(R.id.saveButton);

        // 设置保存按钮的点击事件
        saveButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                saveBitmap();
            }
        });

        // 检查权限
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
            // 权限已经被授予,显示图片
            showImage();
        } else {
            // 请求权限
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION_CODE);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (requestCode == REQUEST_PERMISSION_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 权限已经被授予,显示图片
                showImage();
            } else {
                // 权限被拒绝,显示提示信息
                Toast.makeText(this, "Permission Denied", Toast.LENGTH_SHORT).show();
            }
        }
    }

    private void saveBitmap() {
        // 从资源文件中加载图片
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image);

        try {
            // 创建一个用于保存 Bitmap 的文件
            File file = new File(Environment.getExternalStorageDirectory(), "image.jpg");

            // 创建一个输出流,将 Bitmap 写入到文件中
            OutputStream outputStream = new FileOutputStream(file);

            // 使用 Bitmap.compress() 方法将 Bitmap 写入到输出流
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);

            // 关闭输出流
            outputStream.close();

            // 显示保存成功的提示信息
            Toast.makeText(this,