这两天改进优化项目中图片上传的代码。考虑到可能有7、8M的比較大的图片,由于要先进行压缩。所以设计到文件的压缩,保存与清空删除操作。

在这里记下笔记。

/**
* 压缩并另存为,每次先清空再保存
*/
private void compressFile(){
//清空保存文件夹下的旧照片
String saveDir = Environment.getExternalStorageDirectory()
+ "/bag/uploadPictures";
File imageDir = new File(saveDir);
if (imageDir.exists()) {
clearFolder(imageDir);
}else{
imageDir.mkdirs();
}
//推断图片大小。大于300k则压缩
for (int i = 0; i < imagePathList.size(); i++) {
Bitmap bitmap = compressImage(imagePathList.get(i));
imagePathList.set(i, saveImage(saveDir,bitmap));
}
} /**保存图片,输入保存文件夹和bitmap。以日期命名。返回保存路径
*
* @param path
* @param bitmap
* @return
*/
private String saveImage(String path ,Bitmap bitmap){
Date dt = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
String imageName =sdf.format(dt)+".jpg"; File file = new File(path,imageName );
if (file.exists()) {
file.delete();
}
try {
FileOutputStream out = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
out.close();
Log.d(TAG, "图片已经保存");
return path+"/"+imageName;
} catch (FileNotFoundException e) {
Log.d(TAG, "文件不存在");
e.printStackTrace();
return "";
} catch (IOException e) {
Log.d(TAG, "IO异常"+e.toString());
e.printStackTrace();
return "";
}
} /**
* 压缩图片
* @param imagePath
* @return
*/
private Bitmap compressImage(String imagePath) {
PhotoUpBitmapCache bitmapCache = new PhotoUpBitmapCache();
//取1280*720大小
Bitmap image = bitmapCache.revitionImage(imagePath, 1280,720);
//用以下这个行代码会造成OOM,所以必须用Android 自带的方法去先压缩再导入
// Bitmap image = BitmapFactory.decodeFile(imagePath);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩。把压缩后的数据存放到baos中
int options = 100;
while ( baos.toByteArray().length /1024 > 300) { //循环推断假设压缩后图片是否大于100kb,大于继续压缩
baos.reset();//重置baos即清空baos
image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中
options -= 5;//每次都降低5%
}
ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中
Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片
Log.d(TAG, "文件压缩成功");
return bitmap;
} /**
* 清空文件夹里面全部子文件
*/
private void clearFolder(File file) { if(file.isDirectory()){
File[] childFiles = file.listFiles();
if (childFiles == null || childFiles.length == 0) { return;
} for (int i = 0; i < childFiles.length; i++) {
childFiles[i].delete();
} return ;
}
}

Android笔记之 文件保存、压缩与清空删除的更多相关文章

  1. Linux学习笔记14—文件的压缩与打包

    1..gz   gzip 压缩工具压缩的文件 .bz2   bzip2 压缩工具压缩的文件 .tar   tar 打包程序打包的文件(tar并没有压缩功能,只是把一个目录合并成一个文件) .tar.g ...

  2. Android数据保存之文件保存

    前言: 上一篇文章写了在Android中利用SharedPreferences保存数据,SharedPreferences在保存数据的时候主要是保存一些应用程序的设置信息或者少量的用户信息,并且是以k ...

  3. Android菜鸟的成长笔记(15)—— Android中的状态保存探究(下)

    原文:Android菜鸟的成长笔记(15)-- Android中的状态保存探究(下) 在上一篇中我们简单了解关于Android中状态保存的过程和原理,这一篇中我们来看一下在系统配置改变的情况下保存数据 ...

  4. Android下文件的压缩和解压(Zip格式)

    Zip文件结构 ZIP文件结构如下图所示, File Entry表示一个文件实体,一个压缩文件中有多个文件实体. 文件实体由一个头部和文件数据组,Central Directory由多个File he ...

  5. Linux 学习笔记 5 文件的下载、压缩、解压、初步认识yum

    写在前面 上节我们通过简单的几组命令,已经完全的实现了文件的移动.删除.更名.以及复制,我们最常用的基本玩法,本节将带着大家学习压缩.解压的相关步骤. Linux 学习笔记 4 创建.复制.移动.文件 ...

  6. Android如何正确的保存文件

    在Android 官方开发文档中有一篇文档来介绍如何保存应用的数据,但笔者用过很多程序(从知名的到不知名的)处理的都不是很完美,或者 没有按照Android 开发团队建议的方式去保存他们应用的数据.当 ...

  7. Android菜鸟的成长笔记(14)—— Android中的状态保存探究(上)

    原文:[置顶] Android菜鸟的成长笔记(14)—— Android中的状态保存探究(上) 我们在用手机的时候可能会发现,即使应用被放到后台再返回到前台数据依然保留(比如说我们正在玩游戏,突然电话 ...

  8. Java学习笔记之I/O流(读取压缩文件以及压缩文件)

    1.读取压缩文件:ZipInputStream 借助ZipFile类的getInputStream方法得到压缩文件的指定项的内容,然后传递给InputStreamReader类的构造方法,返回给Buf ...

  9. Android 学习笔记之实时保存数据-现场保护onSaveInstanceState()

    数据保存:在软件开发中我们希望保存下各个Activity数据,以实现客户数据的时时保存,达到较好的用户体验. 那么我们需要解决如下问题: 1.什么时候保存? 2.保存哪些数据?     我想保存应用产 ...

随机推荐

  1. android-'Using 1.7 requires compiling with Android 4.4 (KitKat); currently using API 8'

    解决的方案是将jdk1.7制定的版本定制为jdk.6.即 在eclipse中,右键项目->Properties->Java Compiler->enable "projec ...

  2. Data Types

    原地址: Home / Database / Oracle Database Online Documentation 11g Release 2 (11.2) / Database Administ ...

  3. 30.SSH配置文件模板.md

    [toc] 1.struts2 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts ...

  4. android 05

    控件:RadioButton CheckedBox RatingBar ProgressBar 下拉列表:ListView Spinner <!-- 单选按钮必须放在单选按钮组当中才能生效 ,并 ...

  5. Hibernate的CRUD

    1.CRUD: C:sesion.save() R:session.get()? session.load() D:session.delete() U:session.update() 2.读取数据 ...

  6. php 带cookie采集某页面

    <?php error_reporting(0); define("temp_dir", dirname(__FILE__)."/Public/"); d ...

  7. Day2 数据类型

    1.数字:int(整型) 32位机器:-2**31~2**31-1 64位机器:-2**63~2**63-1 float(浮点型) 2.布尔值 真或假 1或0 bool(0) 3.字符串 name = ...

  8. Swift互用性:采用Cocoa设计模式(Swift 2.0版)-b

    本页包含内容: 委托(Delegation) 错误处理(Error Handling) 键值观察(Key-Value Observing) Target-Action模式(Target-Action) ...

  9. Caffe Python特征抽取

    Caffe Python特征抽取 转载 http://www.cnblogs.com/louyihang-loves-baiyan/ Caffe大家一般用到的深度学习平台都是这个,关于Caffe的训练 ...

  10. 【Maven实战】Maven开发环境的搭建和案例展示

    1.首先到www.apache.org中下载maven,得到一个apache-maven-3.1.0-bin.zip的压缩包. 2.将此压缩包解压,这里解压到D:\docs中,然后找到maven的bi ...