将图片从Android的drawable资源保存到SD卡上
问题出现的原因是需要将drawable资源保存到sdcard上。解决方法如下:
如果使用Kotlin,可以按照以下步骤进行操作:
1. 获取drawable资源的Drawable对象:
val mDrawable: Drawable? = baseContext.getDrawable(id)
2. 将Drawable对象转换为Bitmap对象:
val mbitmap = (mDrawable as BitmapDrawable).bitmap
3. 创建一个File对象,用于保存图片:
val mfile = File(externalCacheDir, "myimage.PNG")
4. 将Bitmap对象保存到File对象指定的路径上:
try {
val outStream = FileOutputStream(mfile)
mbitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream)
outStream.flush()
outStream.close()
} catch (e: Exception) {
throw RuntimeException(e)
}
以上就是将drawable资源保存到sdcard的解决方法。
问题的出现原因是无法直接将drawable资源保存到SD卡上。解决方法是先将drawable资源转换为Bitmap,然后将Bitmap保存到SD卡上,最后通过Intent启动保存的图片。
具体解决方法如下:
1. 使用BitmapFactory的decodeResource方法将drawable资源转换为Bitmap。
2. 创建一个File对象,指定保存到SD卡的路径和文件名。
3. 使用FileOutputStream将Bitmap写入到指定的文件。
4. 关闭输出流。
5. 创建一个Intent对象,并设置Action为ACTION_VIEW,用于打开保存的图片。
6. 设置Intent的数据和类型,指定保存的图片文件的URI和MIME类型。
7. 使用startActivity方法启动Intent,打开保存的图片。
需要注意的是,上述代码中注释掉的部分是一种不起作用的解决方法,无法直接使用资源的URI来启动Intent。正确的方法是先将资源转换为Bitmap,然后保存到SD卡上,再通过保存的文件的URI来启动Intent。
完整代码如下:
Bitmap bm = BitmapFactory.decodeResource(getResources(), resourceId); File f = new File(getExternalCacheDir()+"/image.png"); try { FileOutputStream outStream = new FileOutputStream(f); bm.compress(Bitmap.CompressFormat.PNG, 100, outStream); outStream.flush(); outStream.close(); } catch (Exception e) { throw new RuntimeException(e); } Intent intent = new Intent(); intent.setAction(android.content.Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(f), "image/png"); startActivity(intent);
从上述内容中,可以得出以下文章:
如何从可绘制资源中将图像保存到sd卡上
要保存文件(在这种情况下是图像),请按照以下步骤进行操作:
首先,从drawable文件夹中获取图像的bitmap对象:
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
然后,获取SD卡的路径:
String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
接下来,在按钮点击时保存到sd卡上:
File file = new File(extStorageDirectory, "ic_launcher.PNG"); FileOutputStream outStream = new FileOutputStream(file); bm.compress(Bitmap.CompressFormat.PNG, 100, outStream); outStream.flush(); outStream.close();
记得添加android.permission.WRITE_EXTERNAL_STORAGE
权限。
如果想要从drawable文件夹中保存图像,那么只需要获取图像的bitmap对象,并使用上述代码即可。
如果遇到outStream cannot be resolved to a variable
的错误,请查看示例项目中的完整代码,下载链接:SaveImage。
如果想要添加设置壁纸的按钮,但遇到错误,请下载带有保存按钮和设置壁纸按钮的示例项目,下载链接:Save Image。
关于为什么会保存两份图像的问题,有用户提到可能是因为手机屏幕密度的原因,具体可以参考这个链接和这个链接。
如果保存的透明图像变成黑色,请尝试其他解决方案。