04 ImageView中图片保存到文件
来源:互联网 发布:微信拓客软件怎么用 编辑:程序博客网 时间:2024/05/29 04:14
最近做的一个小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-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android: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"; } else return "/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" > <ImageView android: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" /> <TextView android:id="@+id/ID_tvPath" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="保存路径: " /> <EditText android:id="@+id/ID_etFileName" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" > </EditText> <Button android: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"; } else return "/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 customer public 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 block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
源码程序下载
- 04 ImageView中图片保存到文件
- ImageView中图片保存到文件
- ImageView中图片保存到文件
- ImageView中的图片保存到SD卡;sd卡中图片显示在ImageView中
- imageView图片保存到本地和相册
- 保存图片到文件
- 将项目中图片文件保存到SD卡中
- Android中把Bitmap图片保存到文件中
- 将ImageView中的图片保存到本地相册
- Android长按imageview把图片保存到本地
- Android长按imageview把图片保存到本地
- Android将ImageView中的图片保存到本地图库
- 保存图片到XML文件
- (轉)将图片保存到XML文件中
- 将图片等文件保存到sqlite中(c#)
- 将图片等文件保存到sqlite中(c#)
- C#保存文件及图片到数据库中
- VC中生成文字图片并保存到文件目录
- 进程和线程的区别
- Android使用UncaughtExceptionHandler捕获全局异常
- C语言中的#undef
- ubuntu flash插件安装
- Linkedin网站技术架构简介
- 04 ImageView中图片保存到文件
- Hadoop十大应用领域--从互联网行业到传统行业
- js this object
- centos 6.4安装subversion-1.7.9记录
- 程序员杂谈
- 我是怎么招聘程序员的
- QtCreator插件开发之学习日记1
- PB调用WebService_1
- opencv之金字塔实现图像分割