首页 > 解决方案 > Android将位图保存到图像文件

问题描述

如何将位图保存到图像文件?(png/jpg 任何类型都不在乎...)

我正在运行设备(海思)和安卓应用程序。
Android 和设备通过套接字进行通信。
设备发送图像 (h.264) 并在 Android 上的 TextureView 上显示。
我可以从 TextureView 获取位图,使用textureView.getBitmap().


我做了一个按钮按钮来保存图片,textureView.getBitmap().

<Button
  android:id="@+id/btnSavePng"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:onClick="onBtnSavePng"
  android:text="savePicture" />

并且,onclick 功能如下。


public String getCurrentTimeString() {
  int yyyy = Calendar.getInstance().get(Calendar.YEAR);
  int MM = Calendar.getInstance().get(Calendar.MONTH) + 1;
  int dd = Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
  int hh = Calendar.getInstance().get(Calendar.HOUR);
  int mm = Calendar.getInstance().get(Calendar.MINUTE);
  int ss = Calendar.getInstance().get(Calendar.SECOND);
  
  String result = yyyy+"-"+MM+"-"+dd+" "+hh+":"+mm+":"+ss;
  return result;
}

public void onBtnSavePng(View view) {
  try {
    File storage = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
    String fname = getCurrentTimeString() + ".jpg";
    File tp = new File(storage, fname);
    Bitmap bm = textureView.getBitmap();
    tp.createNewFile(); // Result of File.createNewFile() ignored

    FileOutputStream ot = new FileOutputStream(tp);
    bm.compress(Bitmap.CompressFormat.JPEG, 100, ot);
    ot.close();
  } catch(Exception e) {
    Log.d("onBtnSavePng", e.toString()); // java.io.IOException: Operation not permitted
  }
}

我允许使用权限AndroidManifest.xml,例如,并且android:requestLegacyExternalStorage="true"正在申请中。

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />

我的代码有问题吗?

如果是这样,如何将位图保存为 png 或 jpg 文件?

我想,我的应用程序无法访问目录。

感谢您阅读我的问题。


自我解决。


public void onBtnSavePng(View view) {
  try {
    String root = Environment.getExternalStoragePublicDirectory(
        Environment.DIRECTORY_PICTURES).toString();
    File myDir = new File(root + "/saved_images");
    myDir.mkdirs();
    String fname = getCurrentTimeString() + ".jpg";
    File file = new File(myDir, fname);

    FileOutputStream out = new FileOutputStream(file);
    Bitmap bm = textureView.getBitmap();
    bm.compress(Bitmap.CompressFormat.JPEG, 100, out);
    out.flush();
    out.close();
  } catch( Exception e) {
    Log.d("onBtnSavePng", e.toString());
  }

我不明白为什么我的代码还没有工作。
无论如何,感谢所有帮助我的人。
我会尝试所有的回复代码。

谢谢你。

标签: javaandroid

解决方案


如果您在 Android11+ 上并且您已授予存储管理器权限并直接处理文件(而不是 MediaStore API),则原因可能是创建文件名称中的“:”字符(通常来自时间戳)。Android 11(与旧的 Android 版本不同)不允许这样做。


推荐阅读