在 Android 中拷况,拿到 Mat 對象的數(shù)據(jù)后作煌,如果要將其保存到本地存儲掘殴,你需要先將 Mat 轉(zhuǎn)換為一個可以被 Android 識別并保存為文件的格式,例如 Bitmap粟誓。然后你可以使用 Bitmap.compress() 方法將圖像保存為 JPEG 或 PNG 格式的文件奏寨。
下面是如何將 Mat 對象轉(zhuǎn)換為 Bitmap 并存儲到設(shè)備本地存儲的示例代碼:
import org.opencv.android.Utils;
import android.graphics.Bitmap;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
// 假定你已經(jīng)有了最清晰的 Mat 對象:bestMat
Mat bestMat = ...; // 最清晰的圖片對應(yīng)的 Mat 對象
// 首先將 Mat 轉(zhuǎn)換為 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"; // 文件名可以根據(jù)需要更改
File file = new File(Environment.getExternalStorageDirectory(), fileName); // 確保已經(jīng)獲取了存儲權(quán)限
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.權(quán)限 - 在 Android 上寫入外部存儲需要用戶授權(quán)病瞳,確保你的應(yīng)用已經(jīng)請求并獲得了必要的權(quán)限。在AndroidManifest.xml中添加:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
如果你的目標(biāo) API 等級是 23 或以上(Android 6.0)悲酷,你還需要在運行時請求權(quán)限套菜。
2.存儲位置 - 上面的代碼將文件保存在外部存儲根目錄下。你可能需要根據(jù)實際情況選擇適當(dāng)?shù)拇鎯ξ恢蒙枰祝绻矆D片目錄或者應(yīng)用私有目錄逗柴。
3.唯一文件名 - 使用當(dāng)前時間戳生成唯一的文件名,這避免了重復(fù)覆蓋同一個文件亡嫌。
4.內(nèi)存管理 - 操作完成后釋放所有占用的資源嚎于,包括 Bitmap 和 Mat 對象。
5.自Android 10起挟冠,默認(rèn)情況下于购,應(yīng)用不能直接寫入外部存儲根目錄,你需要使用應(yīng)用專屬目錄或者使用 MediaStore API 來保存文件知染。上面的代碼可能需要根據(jù)你的Android版本進(jìn)行相應(yīng)的調(diào)整肋僧。