保存 Android ImageView 位图
Posted
技术标签:
【中文标题】保存 Android ImageView 位图【英文标题】:Saving Android ImageView Bitmap 【发布时间】:2014-07-17 16:19:11 【问题描述】:所以我有这个奇怪的问题。 9/10 次可以完美运行,但那 10% 根本行不通。
我试图简单地拥有一个可以缩放和平移的 ImageView。效果很好-然后我尝试将 imageView 保存到手机本身。这是大多数情况下它可以工作的地方,但有时它会将图像保存为黑屏......而不是 ImageView 上实际显示的内容。
这是我保存 ImageView 的代码:
protected void saveZoomedImage()
//create ImageView Bitmap
RelativeLayout tableContent;
tableContent=(RelativeLayout)findViewById(R.id.imgHolder);
tableContent.measure(MeasureSpec.makeMeasureSpec(tableContent.getLayoutParams().width, MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(tableContent.getLayoutParams().height,MeasureSpec.EXACTLY));
tableContent.setDrawingCacheEnabled(true);
final Bitmap screenshot = Bitmap.createBitmap(tableContent.getDrawingCache());
tableContent.setDrawingCacheEnabled(true);
//save file
File folder = new File(Environment.getExternalStorageDirectory () + "/thedir");
if(!folder.exists())
folder.mkdir();
String exsistingFileName=Environment.getExternalStorageDirectory().getAbsolutePath() + "/thedir";
FileOutputStream fos = null;
try
fos = new FileOutputStream(exsistingFileName + "/image.jpg");
screenshot.compress(Bitmap.CompressFormat.JPEG, 90, fos);
fos.flush();
fos.close();
catch (Exception e)
e.printStackTrace();
它可以很好地保存文件,但它似乎由于某种原因在一小部分时间内没有捕获图像。
【问题讨论】:
您致电tableContent.setDrawingCacheEnabled(true);
两次。你第二次说的是 False 吗?
啊,是的,哈哈-认为这可能导致了这个问题吗?
我不知道。这是可能的,我想。这是唯一让我印象深刻的事情。如果您在第 10 次收到错误消息,则在您编辑帖子以包含它时可能会有所帮助。
是的,不幸的是,当它节省黑色空间时没有崩溃或错误消息 - 我会尝试这个更改。谢谢,
【参考方案1】:
首先确保您的应用已启用存储权限:
转到设备设置>设备>应用程序>应用程序管理器>“您的应用”>权限>启用存储权限!
清单中的权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
因此,如果您想在文件存储中创建自己的目录,您可以使用类似的东西:
String myDate = getCurrentDateAndTime();
FileOutputStream outStream = null;
File sdCard = Environment.getExternalStorageDirectory();
File dir = new File(sdCard.getAbsolutePath() + "/YourFolderName");
dir.mkdirs();
String fileName = "YourFileName_"+myDate+".jpg";
File outFile = new File(dir, fileName);
outStream = new FileOutputStream(outFile);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
outStream.flush();
outStream.close();
//to refresh the gallery
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intent.setData(Uri.fromFile(file));
sendBroadcast(intent);
辅助函数:
private String getCurrentDateAndTime()
Calendar c = Calendar.getInstance();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
String formattedDate = df.format(c.getTime());
return formattedDate;
希望这会有所帮助!
【讨论】:
你能再描述一下你的答案吗 编辑了我的答案!祝你好运! 老兄,我在评论之前放弃了你的投票。我们正在努力互相帮助。就是这样 我只是说我已经编辑了答案并提供了更多解释!没有其他的!我也投了!酷【参考方案2】:试试这个代码:
public static String saveImageInExternalCacheDir(Context context, Bitmap bitmap, String myfileName)
String fileName = myfileName.replace(' ', '_') + getCurrentDate().toString().replace(' ', '_').replace(":", "_");
String filePath = (context.getExternalCacheDir()).toString() + "/" + fileName + ".jpg";
try
FileOutputStream fos = new FileOutputStream(new File(filePath));
bitmap.compress(Bitmap.CompressFormat.JPEG, 85, fos);
fos.flush();
fos.close();
catch (IOException e)
e.printStackTrace();
return filePath;
【讨论】:
以上是关于保存 Android ImageView 位图的主要内容,如果未能解决你的问题,请参考以下文章
如何将位图从 ImageView 保存到数据库 sqlite?
Android - 将 ImageView 保存到具有全分辨率图像的文件
Android - 在显示进度时将图像从 URL 加载到 ImageView(不保存图像)
Android:从位图裁剪位图并设置为 ImageView src