在 Android 中,拿到 Mat 对象的数据后,如果要将其保存到本地存储,你需要先将 Mat 转换为一个可以被 Android 识别并保存为文件的格式,例如 Bitmap。然后你可以使用 Bitmap.compress() 方法将图像保存为 JPEG 或 PNG 格式的文件。
下面是如何将 Mat 对象转换为 Bitmap 并存储到设备本地存储的示例代码:
import org.opencv.android.Utils;
import android.graphics.Bitmap;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
// 假定你已经有了最清晰的 Mat 对象:bestMat
Mat bestMat = ...; // 最清晰的图片对应的 Mat 对象
// 首先将 Mat 转换为 Android 的 Bitmap
Bitmap bmp = null;
try {
bmp = Bitmap.createBitmap(bestMat.cols(), bestMat.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(bestMat, bmp);
} catch (CvException e) {
Log.d("Exception", e.getMessage());
}
// 接下来保存 Bitmap 到文件
OutputStream os = null;
String fileName = "clearImage_" + System.currentTimeMillis() + ".png"; // 文件名可以根据需要更改
File file = new File(Environment.getExternalStorageDirectory(), fileName); // 确保已经获取了存储权限
try {
os = new FileOutputStream(file);
bmp.compress(Bitmap.CompressFormat.PNG, 100, os); // 100 是压缩率,表示不压缩;PNG是无损格式
Log.i("ExternalStorage", "Written to " + file.getPath());
} catch (IOException e) {
Log.e("ExternalStorage", "File not written: " + e.toString());
} finally {
try {
if (os != null) {
os.flush();
os.close();
}
} catch (IOException e) {
Log.e("ExternalStorage", "Error closing file: " + e.toString());
}
}
请注意以下几点:
1.权限 - 在 Android 上写入外部存储需要用户授权,确保你的应用已经请求并获得了必要的权限。在AndroidManifest.xml中添加:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
如果你的目标 API 等级是 23 或以上(Android 6.0),你还需要在运行时请求权限。
2.存储位置 - 上面的代码将文件保存在外部存储根目录下。你可能需要根据实际情况选择适当的存储位置,例如公共图片目录或者应用私有目录。
3.唯一文件名 - 使用当前时间戳生成唯一的文件名,这避免了重复覆盖同一个文件。
4.内存管理 - 操作完成后释放所有占用的资源,包括 Bitmap 和 Mat 对象。
5.自Android 10起,默认情况下,应用不能直接写入外部存储根目录,你需要使用应用专属目录或者使用 MediaStore API 来保存文件。上面的代码可能需要根据你的Android版本进行相应的调整。