我正在开发一个功能,从Web服务器下载图像,将其显示在屏幕上,如果用户希望保留图像,请将其保存在某个文件夹中的SD卡上 . 是否有一种简单的方法来获取位图并将其保存到我选择的文件夹中的SD卡?
我的问题是我可以下载图像,将其作为位图显示在屏幕上 . 我能够找到将图像保存到特定文件夹的唯一方法是使用FileOutputStream,但这需要一个字节数组 . 我不确定如何转换(如果这是正确的方法)从Bitmap到字节数组,所以我可以使用FileOutputStream来写入数据 .
我的另一个选择是使用MediaStore:
MediaStore.Images.Media.insertImage(getContentResolver(), bm,
barcodeNumber + ".jpg Card Image", barcodeNumber + ".jpg Card Image");
哪个可以保存到SD卡,但不允许您自定义文件夹 .
17 回答
在调用
bitmap.compress
之前,请确保已创建目录:在Android 4.4 Kitkat之后,截至2017年Android 4.4及更低的份额约为20%并且正在减少,因此无法使用
File
class和getExternalStorageDirectory()
方法保存到SD卡 . 此方法返回您的设备内部存储器和图像,保存每个应用程序可见 . 您还可以仅保存应用程序专用的图像,并在用户使用openFileOutput()
方法删除应用程序时将其删除 .从Android 6.0开始,您可以将SD卡格式化为内部存储器,但只能将其格式化为您的设备 . (如果将SD car格式化为内部存储器,只有您的设备可以访问或查看其内容)您可以使用SD卡保存到该SD卡其他答案,但如果你想使用可移动的SD卡,你应该阅读下面的答案 .
您应该使用 Storage Access Framework 获取uri到文件夹
onActivityResult
活动方法以获取用户选择的文件夹,并添加可翻译的持久权限以便在用户重新启动设备后能够访问文件夹 .现在,将保存文件夹保存到共享首选项,而不是每次要保存图像时都要求用户选择文件夹 .
您应该使用
DocumentFile
class来保存图像,而不是File
或ParcelFileDescriptor
,有关详细信息,您可以使用compress(CompressFormat.JPEG, 100, out);
方法和DocumentFile
类检查this thread以将图像保存到SD卡 .为视频创建视频缩略图 . 如果视频损坏或不支持格式,它可能返回null .
要在sdcard中保存位图,请使用以下代码
Store Image
To Get the Path for Image Storage
您应该使用
Bitmap.compress()
方法将位图另存为文件 . 它将压缩(如果使用的格式允许)你的图片并将其推入OutputStream .以下是通过
getImageBitmap(myurl)
获得的Bitmap实例的示例,可以压缩为JPEG,压缩率为85%:实际上不是答案,而是评论 . 我在Mac上运行模拟器环境,并获得java.io.IOException:权限被拒绝 - 此代码出错:
我还将uses-permission android.permission.WRITE_EXTERNAL_STORAGE添加到清单文件中(如其他人所述) .
我发现发送PNG和透明度的方式 .
我还想保存一张照片 . 但我的问题(?)是我想从我绘制的位图中保存它 .
我这样做了:
将在未经许可的情况下在AndroidManifest.xml中抛出异常(至少在os2.2中):
为什么不用100调用
Bitmap.compress
方法(这听起来像是无损的)?// | == |从位图创建PNG文件:
// | == |从文件中获取Bimap:
您想要将位图保存到您选择的目录中 . 我创建了一个库ImageWorker,使用户能够加载,保存和转换位图/ drawables / base64图像 .
Min SDK - 14
Pre-requisite
保存文件需要WRITE_EXTERNAL_STORAGE权限 .
检索文件需要READ_EXTERNAL_STORAGE权限 .
保存位图/ Drawable / Base64
加载位图
履行
添加依赖项
在项目级别Gradle中
在应用程序级别Gradle中
你可以在https://github.com/1AboveAll/ImageWorker/blob/master/README.md上阅读更多内容
某些格式,如无损的PNG,将忽略质量设置 .
以下是将位图保存到文件的示例代码:
现在调用此函数将位图保存到内部存储器 .
File newfile = savebitmap(bitmap)
;我希望它会对你有所帮助 . 快乐的编码生活 .
里面
onActivityResult
:嘿只是给 .bmp 这个名字
做这个:
听起来好像只是蠢蠢欲动但是一旦它被保存在bmp foramt中就试试吧 .