保存 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

如何在不使用 ImageView 的情况下从 API 端点下载图像或位图?

Android:从图库加载的位图在 ImageView 中旋转