最近做的一个小App中的一个功能, 把ImageView中的图片保存为一个 jpg文件。

如果设备上有SDCard,图片会被保存到SD卡上,如果没有则保存在设备的存储空间中。

这里主要包含了两个要点,一是 Android文件保存时文件夹的创建;二是 ImageView中图片提取并保存为图片。

感觉今后还会用到,这里总结一下以后方便查找。

程序运行界面:

使用类的说明

关于Android 的文件系统

android 文件存储可以分两部分 一个是设备的flash,一个是SDCard。感觉android 对APP对文件的访问权限控制的比较严。

一个App比较肯定的可以自由访问(读 写 创建 删除文件 或文件夹 )的位置有2个,其他的位置就未必了,有的可能可以读,但无法写入或创建文件夹。

(1)  SDCard

在卸载了App后,相关的文件还在,不会被删除。

(2)  /data/data/[your_project]/  在设备自带的RAM上。app的权限各自独立,即每个app 默认只能读写自己文件夹下的文件, your_project: 是app的包的名字。

在卸载了App后,相关的文件可能会被删除,但没有尝试过。

但操作sdcard需要权限,我们必须在AndroidManifest.xml中进行配置
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

打开/关闭sdcard的权限

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>

Android_Manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.imageviewsave2bitmap"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="8"android:targetSdkVersion="17" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name="com.example.imageviewsave2bitmap.MainActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application><!-- 往SDCard写入数据权限 -->    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><!-- 在SDCard中创建与删除文件权限 --><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>     </manifest>

Android 系统中关于一些文件夹的信息被保存在环境信息中,例如SDCard的路径可能是 /mnt/SDCard 或 /SDCard,当不确定时最好还是通过环境变量把他们提取出来。这一步主要通过 Environment 类  实现的。

例如:一个简单的小函数就能取得SDCard的信息,先判断SDCard是否存在,如果存在则返回路径。

    public static String getSDPath(){boolean hasSDCard = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);if(hasSDCard){return Environment.getExternalStorageDirectory().toString() + "/saving_picture";}elsereturn "/data/data/com.example.imageviewsave2bitmap/saving_picture";}

更详细的信息最好还是参考 Google的Android  SDK文档。

提取-保存图像文件

Android  ImageView 保存到文件

从ImageView中保存图像文件大概可以分3个步骤:

1)  从ImageView中取得缓存数据,并用这些数据创建一个新的Bitmap对象

    public static Bitmap convertViewToBitmap(View view){view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());view.buildDrawingCache();Bitmap bitmap = view.getDrawingCache();return bitmap;}

关于view.measure,当我们要从view中提取图片时,系统给了我们一些选择,首先最容易想到的就是我们要把view中整个图片都保存下来,但有时候图片较大,当然我们也可以只保存当前我们看到的这部分。我们还可以保存指定大小的图片。

这就是MeasureSpec.UNSPECIFIED可以帮指定保存的模式。这里一共有三种模式

  • AT_MOST Measure specification mode: The child can be as large as it wants up to the specified size.
  • EXACTLY Measure specification mode: The parent has determined an exact size for the child.
  • UNSPECIFIED Measure specification mode: The parent has not imposed any constraint on the child.

白话解释一下:

AT_MOST:我们可以指定一个上限,要保存的图片的大小不会超过它。

EXACTLY:我们指定了一个明确的大小,要求图片保存时满足这个条件。

UNSPECIFIED:图片多大,我们就保存多大。

函数convertViewToBitmap就是从View中取得了图片的大小,然后按照这个尺寸创建了一个Bitmap对象,再把cache中的内容保存在Bitmap对象中。

2)  创建一个FileOutputStream 对象,并用新的Bitmap对象来进行初始化。

            File imageFile = new File(strPath + "/" + strFileName);imageFile.createNewFile();FileOutputStream fos = new FileOutputStream(imageFile);bitmap.compress(CompressFormat.JPEG, 50, fos);

这里先创建了一个文件对象 File imageFile,接着用把这个文件和一个FileOutputStream绑定在一起,然后把图片压缩到这个流中,压缩方式为JPEG。

3)  指定图像文件的类型,保存并且关闭FileOutputStream 。

            fos.flush();fos.close();

实例代码

main_layout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" ><ImageViewandroid:id="@+id/ID_ivMain"android:layout_width="fill_parent"android:layout_height="300dp"android:background="@color/Black"android:scaleType="centerInside"android:src="@drawable/pic_01" /><TextViewandroid:id="@+id/ID_tvPath"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="保存路径: " /><EditTextandroid:id="@+id/ID_etFileName"android:layout_width="match_parent"android:layout_height="wrap_content"android:ems="10" ></EditText><Buttonandroid:id="@+id/ID_btnSave"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="保存" /></LinearLayout>

MainActivity.java

package com.example.imageviewsave2bitmap;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.MeasureSpec;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;public class MainActivity extends Activity {private ImageView m_ivMain;private Button m_btnSave;private TextView m_tvPath;private EditText m_etFileName;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);String strPath = getSDPath();m_ivMain = (ImageView) findViewById(R.id.ID_ivMain);m_ivMain.setScaleType(ImageView.ScaleType.CENTER_INSIDE);m_btnSave = (Button) findViewById(R.id.ID_btnSave);m_tvPath = (TextView)findViewById(R.id.ID_tvPath);m_etFileName = (EditText)findViewById(R.id.ID_etFileName);m_tvPath.setText(strPath);m_btnSave.setOnClickListener(new Button.OnClickListener(){//创建监听    public void onClick(View v) {    String strFileName = m_etFileName.getText().toString().trim();saveImage(strFileName);}});    }@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}public static String getSDPath(){boolean hasSDCard = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);if(hasSDCard){return Environment.getExternalStorageDirectory().toString() + "/saving_picture";}elsereturn "/data/data/com.example.imageviewsave2bitmap/saving_picture";}public static Bitmap convertViewToBitmap(View view){view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());view.buildDrawingCache();Bitmap bitmap = view.getDrawingCache();return bitmap;}    // first SDCard is in the device, if yes, the pic will be stored in the SDCard, folder "HaHa_Picture"// second if SDCard not exist, the picture will be stored in /data/data/HaHa_Picture// file will be named by the customerpublic void saveImage(String strFileName){Bitmap bitmap = convertViewToBitmap(m_ivMain);String strPath = getSDPath();try{File destDir = new File(strPath);if (!destDir.exists()){Log.d("MagicMirror", "Dir not exist create it " + strPath);destDir.mkdirs();Log.d("MagicMirror", "Make dir success: " + strPath);}File imageFile = new File(strPath + "/" + strFileName);imageFile.createNewFile();FileOutputStream fos = new FileOutputStream(imageFile);bitmap.compress(CompressFormat.JPEG, 50, fos);fos.flush();fos.close();}catch (FileNotFoundException e){// TODO Auto-generated catch blocke.printStackTrace();}catch (IOException e){// TODO Auto-generated catch blocke.printStackTrace();}}
}

源码程序下载

04 ImageView中图片保存到文件相关推荐

  1. MATLAB 实现读取数据文件,画图并自动将图片保存到文件夹中

    实现读取峰值数据,增加道数筛选符合要求的道数值,画出直方图并自动将图片保存到文件夹中,也可选择将直方图中点连线. %%读取峰值数据,增加道数筛选符合要求的道数值,画出直方图并自动将图片保存到文件夹中, ...

  2. matplotlib:颜色、标记和线类型,刻度、标签和图例,注释与子图加工,将图片保存到文件,matplotlib 设置

    1.2 颜色.标记和线类型 matplotblib 的主函数 plot 接收带有x and y 轴的数组以及一些可选的字符串缩写参数来指名颜色和线类型.例如要用绿色括折号绘制 x 对 y 的线:ax. ...

  3. android创建图片资源文件,Android图片添加水印图片并把图片保存到文件存储的实现代码...

    具体代码如下所示: package zhangphil.test; import android.graphics.Bitmap; import android.graphics.BitmapFact ...

  4. Android图片添加水印图片并把图片保存到文件存储

    Android图片添加水印图片并把图片保存到文件存储 package zhangphil.test;import android.graphics.Bitmap; import android.gra ...

  5. 设置ImageView中图片的的颜色

    根据需要 , 有时需要动态修改ImageView中图片的颜色 . 注意是修改ImageView中图片的颜色 , 而不是修改ImageView的背景色 . 布局文件xml中修改: 就是一个属性的修改: ...

  6. vb.net mysql存储图片_怎么让VB.NET 上传图片到SQL 数据库只保存路径,图片保存到文件...

    我的前台代码dimCoonAsSqlClient.SqlConnectiondimRsAsNewSqlClient.SqlCommandRs.Connection=CoonRs=NewSqlClien ...

  7. 【python学习】如何将所绘制的图(单张多张)保存到文件夹,并用绘制实时时间命名图片

    python图片保存到文件夹 基本存储(plt.savefig()) 创建文件夹并存储图片(if结构+OS模块) 批量绘制图片+批量存储(for循环) 图片/文件夹命名与所运行时间关联(datatim ...

  8. 【python学习】如何将所绘制的图(单张/多张)保存到文件夹,并用绘制实时时间命名图片

    python图片保存到文件夹 基本存储(plt.savefig()) 创建文件夹并存储图片(if结构+OS模块) 批量绘制图片+批量存储(for循环) 图片/文件夹命名与所运行时间关联(datatim ...

  9. 如何获取已加载在ImageView中的图片ID

    动机:程序的某个Activity中有一个ListView,ListView的每行视图中都有ImageView,程序初始化后,通过Adapter向ImageView中加载图片,现在的需求是,点击该图片能 ...

最新文章

  1. 微信小程序 提示Toast
  2. SecureCRT连接linux时主机名,secureCRT连接linux方法
  3. 浅谈相对定位与绝对定位
  4. STM32(十一)- 串行FLASH文件系统FatFs
  5. 表格制作模块xlwt
  6. 雾霾天出行,如何精确避开“雷区”?2016 SODA数据侠十强
  7. 德软件开发者否认蓄意植入“心血”安全漏洞
  8. 小程序源码:王者荣耀吃鸡气泡等等头像框DIY在线生成N种风格-多玩法安装简单
  9. 联想笔记本触摸板失灵的一个原因及解决方法
  10. 戴尔dell poweredge r730服务器系统安装以及raid配置详解教程
  11. 算法第3章上机实践报告
  12. 如何调试分布式系统:与微服务调试工具“Squash”创始人Idit Levine的对话
  13. 【C语言】斐波那契数列,依次输出1 1 2 3 5 13等前10个数
  14. 虚拟现实、增强现实与全息投影的区别
  15. 同时安装 TensorflowPytorch
  16. 机械硬盘升级固态硬盘
  17. 项目管理——软件文档分类简介
  18. 解决xcode doesn‘t support iphone’s ios 14.6 (18f72)
  19. 基于Android实现的锁屏软件APP设计
  20. Delphi 7连接MySql 5.5.15

热门文章

  1. 实现Unity声音的立体空间感
  2. Calibre LVS
  3. Android开发_自定义视图和属性
  4. 1092 To Buy or Not to Buy
  5. python和java打架动态图_Python动态图实例与实践,PYTHON
  6. 第一个神经网络TensorFlow
  7. version 1.8.0_181 of the JVM is not suitable for this product.Version 11 or greater
  8. 【阅读记录】3DSSD:Point-based 3D Single Stage Object Detector
  9. 三、jdk1.8新特新Lambda表达式方法引用
  10. I2C驱动框架分析(3):DW_I2C驱动分析