我该怎么办?
我已经直接从相机到我的应用程序中的图像视图的图像,一切正常。
现在我想要的是将图像从“图像视图”保存到我的android设备的内存中并访问
有人可以指导我该怎么做吗?
我对android有点陌生,所以,请提供详细的程序,不胜感激。
#1 楼
使用以下代码将图像保存到内部目录。private String saveToInternalStorage(Bitmap bitmapImage){
ContextWrapper cw = new ContextWrapper(getApplicationContext());
// path to /data/data/yourapp/app_data/imageDir
File directory = cw.getDir("imageDir", Context.MODE_PRIVATE);
// Create imageDir
File mypath=new File(directory,"profile.jpg");
FileOutputStream fos = null;
try {
fos = new FileOutputStream(mypath);
// Use the compress method on the BitMap object to write image to the OutputStream
bitmapImage.compress(Bitmap.CompressFormat.PNG, 100, fos);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return directory.getAbsolutePath();
}
说明:
1.将使用给定名称创建目录。 Javadocs是用于告诉您它将在何处创建目录。
2。您将必须提供要用于保存该目录的图像名称。
要阅读内部存储器中的文件。使用以下代码
private void loadImageFromStorage(String path)
{
try {
File f=new File(path, "profile.jpg");
Bitmap b = BitmapFactory.decodeStream(new FileInputStream(f));
ImageView img=(ImageView)findViewById(R.id.imgPicker);
img.setImageBitmap(b);
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
}
评论
我注意到您已经发表了某些评论,您可以指导我暗示什么吗?喜欢一条关于道路的路吗?我是否必须提供路径?
–Usama Zafar
13年7月16日在12:47
如何从内存访问图像?
–Usama Zafar
13年7月16日在15:33
我编辑了答案。从内存访问图像。您如何将图像设置为图像?我相信它只是Bitmap,您可以传递给该函数相同的实例。
–Brijesh Thakur
13年7月16日在16:56
您实际上应该从finally块关闭流,而不是从try块内部关闭流。
– Kenn Cal
15年11月28日在2:57
嗨,/ data / data / yourapp / app_data / imageDir到底在哪里? stackoverflow.com/questions/40323126/…
–哈利勒·哈拉夫(Khalil Khalaf)
16-10-29在20:16
#2 楼
/**
* Created by Ilya Gazman on 3/6/2016.
*/
public class ImageSaver {
private String directoryName = "images";
private String fileName = "image.png";
private Context context;
private boolean external;
public ImageSaver(Context context) {
this.context = context;
}
public ImageSaver setFileName(String fileName) {
this.fileName = fileName;
return this;
}
public ImageSaver setExternal(boolean external) {
this.external = external;
return this;
}
public ImageSaver setDirectoryName(String directoryName) {
this.directoryName = directoryName;
return this;
}
public void save(Bitmap bitmapImage) {
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(createFile());
bitmapImage.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (fileOutputStream != null) {
fileOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
@NonNull
private File createFile() {
File directory;
if(external){
directory = getAlbumStorageDir(directoryName);
}
else {
directory = context.getDir(directoryName, Context.MODE_PRIVATE);
}
if(!directory.exists() && !directory.mkdirs()){
Log.e("ImageSaver","Error creating directory " + directory);
}
return new File(directory, fileName);
}
private File getAlbumStorageDir(String albumName) {
return new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), albumName);
}
public static boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
return Environment.MEDIA_MOUNTED.equals(state);
}
public static boolean isExternalStorageReadable() {
String state = Environment.getExternalStorageState();
return Environment.MEDIA_MOUNTED.equals(state) ||
Environment.MEDIA_MOUNTED_READ_ONLY.equals(state);
}
public Bitmap load() {
FileInputStream inputStream = null;
try {
inputStream = new FileInputStream(createFile());
return BitmapFactory.decodeStream(inputStream);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
}
用法
要保存:
new ImageSaver(context).
setFileName("myImage.png").
setDirectoryName("images").
save(bitmap);
要加载:
Bitmap bitmap = new ImageSaver(context).
setFileName("myImage.png").
setDirectoryName("images").
load();
编辑:
添加了
ImageSaver.setExternal(boolean)
以支持基于Google的示例保存到外部存储。评论
这是放入类的另一个有用方法:public boolean deleteFile(){File file = createFile();返回file.delete(); }
– Micro
16年4月11日在1:43
当我要共享保存的图像时,它返回“未创建目录”,并且图像崩溃了。你能帮助我吗?
– A. N
17-10-9在8:02
您是否可以添加有关此代码可使用的许可证的声明,以使其可以包含在项目中?
–唐公园
18年1月13日在5:15
@DonPark不需要,stackoverflowis上的任何代码均受stackoverflow许可,您可以无后顾之忧地使用它:)
–伊利亚·加兹曼(Ilya Gazman)
18年1月13日在23:23
我正在尝试使用它,但是遇到了问题。对我发布的这个问题有帮助吗? stackoverflow.com/questions/51276641/cannot-find-image-stored @IlyaGazman
–Lion789
18年7月11日在3:20
#3 楼
今天遇到了这个问题,这就是我的方法。只需使用必需的参数调用此函数
public void saveImage(Context context, Bitmap bitmap, String name, String extension){
name = name + "." + extension;
FileOutputStream fileOutputStream;
try {
fileOutputStream = context.openFileOutput(name, Context.MODE_PRIVATE);
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fileOutputStream);
fileOutputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
类似地,要阅读相同的内容,请使用此
public Bitmap loadImageBitmap(Context context,String name,String extension){
name = name + "." + extension
FileInputStream fileInputStream
Bitmap bitmap = null;
try{
fileInputStream = context.openFileInput(name);
bitmap = BitmapFactory.decodeStream(fileInputStream);
fileInputStream.close();
} catch(Exception e) {
e.printStackTrace();
}
return bitmap;
}
评论
如何将参数b传递给函数saveImage。我已将图像放在我的android设备上,但无法获取它们的路径。如果无法获取它们的路径,则无法将它们作为参数传递给函数saveImage。
–自主
2014年8月5日,0:29
我在设备上有这张照片。我可以通过文件资源管理器应用程序以及adb shell看到它,但是我无法以编程方式获取其地址。所以我虽然让我使用代码编写它,然后再次读取它。阅读是我的最终目标,但是当我尝试阅读照片时,我总是一无所获。
–自主
2014年8月7日在21:45
好的,所以当您说再次写入时,我想您将图像数据作为位图或原始数据以字节数组的形式存储。如果有位图,则可以直接利用上述功能。如果您以字节数组的形式获取它,请使用它将其转换为位图。位图bitmap = BitmapFactory.decodeByteArray(bitmapdata,0,bitmapdata .length);或者,即使采用任何其他形式,也可以将其转换为位图并使用上述功能。
–阿努拉格
2014年8月8日在20:52
带有扩展名的“编辑答案”,在我的情况下,提出了一些问题,所以毕竟我发现了应该将扩展名作为参数添加的问题。
–纳粹艾哈迈德(Naveed Ahmad)
15年3月25日在13:24
感谢您的编辑,我认为扩展名是名称本身的一部分。
–阿努拉格
2015年3月25日14:00
#4 楼
对于Kotlin用户,我创建了一个ImageStorageManager
类,该类将轻松处理图像的保存,获取和删除操作:class ImageStorageManager {
companion object {
fun saveToInternalStorage(context: Context, bitmapImage: Bitmap, imageFileName: String): String {
context.openFileOutput(imageFileName, Context.MODE_PRIVATE).use { fos ->
bitmapImage.compress(Bitmap.CompressFormat.PNG, 25, fos)
}
return context.filesDir.absolutePath
}
fun getImageFromInternalStorage(context: Context, imageFileName: String): Bitmap? {
val directory = context.filesDir
val file = File(directory, imageFileName)
return BitmapFactory.decodeStream(FileInputStream(file))
}
fun deleteImageFromInternalStorage(context: Context, imageFileName: String): Boolean {
val dir = context.filesDir
val file = File(dir, imageFileName)
return file.delete()
}
}
}
在此处了解更多信息
评论
您是否必须使用从saveToInternalStorage()接收的绝对路径才能通过getImageFromInternalStorage()或仅使用文件名来检索它?
– Leo Droidcoder
19-10-14在12:15
只需imageFileName就足以检索它
–阿米拉斯兰
19-10-14在12:40
我为此浪费了10个小时
–铅研究
7月2日15:16
#5 楼
//多图像检索 File folPath = new File(getIntent().getStringExtra("folder_path"));
File[] imagep = folPath.listFiles();
for (int i = 0; i < imagep.length ; i++) {
imageModelList.add(new ImageModel(imagep[i].getAbsolutePath(), Uri.parse(imagep[i].getAbsolutePath())));
}
imagesAdapter.notifyDataSetChanged();
#6 楼
如果您想按照Android 10的惯例在存储中进行写操作,请在此处检查,如果您只希望图像特定于应用程序,请在此处
进行检查,例如,如果您要存储图像以供用户使用您的应用程序:
viewModelScope.launch(Dispatchers.IO) {
getApplication<Application>().openFileOutput(filename, Context.MODE_PRIVATE).use {
bitmap.compress(Bitmap.CompressFormat.PNG, 50, it)
}
}
getApplication是一种为ViewModel提供上下文的方法,它是AndroidViewModel的一部分
如果您想阅读的话,它是以下内容:
viewModelScope.launch(Dispatchers.IO) {
val savedBitmap = BitmapFactory.decodeStream(
getApplication<App>().openFileInput(filename).readBytes().inputStream()
)
}
#7 楼
public static String saveImage(String folderName, String imageName, RelativeLayout layoutCollage) {
String selectedOutputPath = "";
if (isSDCARDMounted()) {
File mediaStorageDir = new File(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), folderName);
// Create a storage directory if it does not exist
if (!mediaStorageDir.exists()) {
if (!mediaStorageDir.mkdirs()) {
Log.d("PhotoEditorSDK", "Failed to create directory");
}
}
// Create a media file name
selectedOutputPath = mediaStorageDir.getPath() + File.separator + imageName;
Log.d("PhotoEditorSDK", "selected camera path " + selectedOutputPath);
File file = new File(selectedOutputPath);
try {
FileOutputStream out = new FileOutputStream(file);
if (layoutCollage != null) {
layoutCollage.setDrawingCacheEnabled(true);
layoutCollage.getDrawingCache().compress(Bitmap.CompressFormat.JPEG, 80, out);
}
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return selectedOutputPath;
}
private static boolean isSDCARDMounted() {
String status = Environment.getExternalStorageState();
return status.equals(Environment.MEDIA_MOUNTED);
}
评论
问题是关于内部存储。
–丹尼·库尼亚万(Denny Kurniawan)
19年4月11日在10:25
评论
嗨,/ data / data / yourapp / app_data / imageDir到底在哪里? stackoverflow.com/questions/40323126/…