04 ImageView中图片保存到文件
最近做的一个小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中图片保存到文件相关推荐
- MATLAB 实现读取数据文件,画图并自动将图片保存到文件夹中
实现读取峰值数据,增加道数筛选符合要求的道数值,画出直方图并自动将图片保存到文件夹中,也可选择将直方图中点连线. %%读取峰值数据,增加道数筛选符合要求的道数值,画出直方图并自动将图片保存到文件夹中, ...
- matplotlib:颜色、标记和线类型,刻度、标签和图例,注释与子图加工,将图片保存到文件,matplotlib 设置
1.2 颜色.标记和线类型 matplotblib 的主函数 plot 接收带有x and y 轴的数组以及一些可选的字符串缩写参数来指名颜色和线类型.例如要用绿色括折号绘制 x 对 y 的线:ax. ...
- android创建图片资源文件,Android图片添加水印图片并把图片保存到文件存储的实现代码...
具体代码如下所示: package zhangphil.test; import android.graphics.Bitmap; import android.graphics.BitmapFact ...
- Android图片添加水印图片并把图片保存到文件存储
Android图片添加水印图片并把图片保存到文件存储 package zhangphil.test;import android.graphics.Bitmap; import android.gra ...
- 设置ImageView中图片的的颜色
根据需要 , 有时需要动态修改ImageView中图片的颜色 . 注意是修改ImageView中图片的颜色 , 而不是修改ImageView的背景色 . 布局文件xml中修改: 就是一个属性的修改: ...
- vb.net mysql存储图片_怎么让VB.NET 上传图片到SQL 数据库只保存路径,图片保存到文件...
我的前台代码dimCoonAsSqlClient.SqlConnectiondimRsAsNewSqlClient.SqlCommandRs.Connection=CoonRs=NewSqlClien ...
- 【python学习】如何将所绘制的图(单张多张)保存到文件夹,并用绘制实时时间命名图片
python图片保存到文件夹 基本存储(plt.savefig()) 创建文件夹并存储图片(if结构+OS模块) 批量绘制图片+批量存储(for循环) 图片/文件夹命名与所运行时间关联(datatim ...
- 【python学习】如何将所绘制的图(单张/多张)保存到文件夹,并用绘制实时时间命名图片
python图片保存到文件夹 基本存储(plt.savefig()) 创建文件夹并存储图片(if结构+OS模块) 批量绘制图片+批量存储(for循环) 图片/文件夹命名与所运行时间关联(datatim ...
- 如何获取已加载在ImageView中的图片ID
动机:程序的某个Activity中有一个ListView,ListView的每行视图中都有ImageView,程序初始化后,通过Adapter向ImageView中加载图片,现在的需求是,点击该图片能 ...
最新文章
- 微信小程序 提示Toast
- SecureCRT连接linux时主机名,secureCRT连接linux方法
- 浅谈相对定位与绝对定位
- STM32(十一)- 串行FLASH文件系统FatFs
- 表格制作模块xlwt
- 雾霾天出行,如何精确避开“雷区”?2016 SODA数据侠十强
- 德软件开发者否认蓄意植入“心血”安全漏洞
- 小程序源码:王者荣耀吃鸡气泡等等头像框DIY在线生成N种风格-多玩法安装简单
- 联想笔记本触摸板失灵的一个原因及解决方法
- 戴尔dell poweredge r730服务器系统安装以及raid配置详解教程
- 算法第3章上机实践报告
- 如何调试分布式系统:与微服务调试工具“Squash”创始人Idit Levine的对话
- 【C语言】斐波那契数列,依次输出1 1 2 3 5 13等前10个数
- 虚拟现实、增强现实与全息投影的区别
- 同时安装 TensorflowPytorch
- 机械硬盘升级固态硬盘
- 项目管理——软件文档分类简介
- 解决xcode doesn‘t support iphone’s ios 14.6 (18f72)
- 基于Android实现的锁屏软件APP设计
- Delphi 7连接MySql 5.5.15
热门文章
- 实现Unity声音的立体空间感
- Calibre LVS
- Android开发_自定义视图和属性
- 1092 To Buy or Not to Buy
- python和java打架动态图_Python动态图实例与实践,PYTHON
- 第一个神经网络TensorFlow
- version 1.8.0_181 of the JVM is not suitable for this product.Version 11 or greater
- 【阅读记录】3DSSD:Point-based 3D Single Stage Object Detector
- 三、jdk1.8新特新Lambda表达式方法引用
- I2C驱动框架分析(3):DW_I2C驱动分析