在 Android 中,拿到 Mat 對象的數據后,如果要將其保存到本地存儲?

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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容