在 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版本進行相應的調整。