这两天改进优化项目中图片上传的代码。考虑到可能有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. ecshop首页调用指定商品分类下的商品品牌列表

    转之--http://www.16css.com/ecshop/735.html 通过二次开发可以实现ECSHOP首页调用指定分类下的品牌列表. 第一步: 打开根目录下的index.php 在最后面 ...

  2. Android虚拟机GenyMotion-- 遇到的问题

    问题: android studio 检测不到 genymotion 原因:没有设置genymotion的adb,也就是sdk的路径. 解决方法:打开genymotion的主页面,设置sdk的位置为你 ...

  3. python下 help()使用方法

    查看python所有的modules:help("modules") 单看python所有的modules中包含指定字符串的modules: help("modules ...

  4. ONVIF Event消息解析(How to work with gSoap)

    Prepare Requirements ONVIF Event gSoap reference ONVIF Specification 问题描述 Event是ONVIF核心规范中一块, 文档解释了如 ...

  5. 『重构--改善既有代码的设计』读书笔记----Inline Temp

    与Inline Method相同,有时候犹豫需要Extract Method,需要对一些临时变量进行内联,而这个往往是Replace Temp with Query的一部分.简单来说,当你看到这种 d ...

  6. CentOS7 开启关闭网卡

    ifdown ifcfg-enp7s0 关闭网卡 ifup ifcfg-enp7s0 开启网卡

  7. 仿猪八戒一个提示(jQuery插件) v0.1 beta

    先看下效果 js jQuery.extend({ prompt: function (text, type, times) { var prompt = $(['<div class=" ...

  8. Websocket 与代理服务器如何交互? How HTML5 Web Sockets Interact With Proxy Servers

    How HTML5 Web Sockets Interact With Proxy Servers Posted by Peter Lubberson Mar 16, 2010 With the re ...

  9. day06

    一.configparser模块 configparser用于处理特定格式的文件,其本质上是利用open来操作文件 1.获取所有节点 import configparser config = conf ...

  10. python学习之旅:array 转 list

    最近学习python,记录学习的点滴. >>> import numpy as np >>> a = np.array([[1,2],[3,4]]) >> ...