Android笔记之 文件保存、压缩与清空删除

Android笔记之 文件保存、压缩与清空删除

大家好,又见面了,我是全栈君。

这两天改进优化项目中图片上传的代码。考虑到可能有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 ;
        }  
    } 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115669.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ios uiview和calayer_ipad的assistive touch在哪里

    ios uiview和calayer_ipad的assistive touch在哪里IOS笔记CALayer的position和anchorPointCALayer有2个非常重要的属性:position和anchorPoint@propertyCGPointposition;用来设置CALayer在父层中的位置以父层的左上角为原点(0,0)@propertyCGPointanchorPoint;称为”定位点”,“锚点”决定着CALayer身上的哪个点会在poistion属性所指的位置以自己的左上角为原点(0,0)它的x,y取值范围都是0~1默认值为(0.5,0.

    2022年10月8日
    2
  • web hosting_hotlines

    web hosting_hotlinesBelowyoullfindalistofthe10BestHostsasreviewedbyconsumersandexperiencedwebmasters. Thefollowingwebhostsarerankedbyprice,serverreliability,popularity,softwareusability,di

    2022年10月8日
    1
  • 一个好玩的小游戏(纯C语言编写)

    一个好玩的小游戏(纯C语言编写)最近在看知乎是发现了一个这一个专栏https://zhuanlan.zhihu.com/c2game从中获取的许多知识,本文中的游戏也是从里面学到的,不过本人又自己加了一些功能。这是一个类似于飞机大战的游戏,不过目前代码量比较小,所以看起来非常简陋游戏界面如下更新日志,本人将原来的原来的代码有进一步的优化了一下,之前是只有一个非常小的战机现在更新后可以产生一个非常大的战机(看起来也更

    2022年5月19日
    44
  • 快手用户群体分析_抖音、快手竞品分析报告

    快手用户群体分析_抖音、快手竞品分析报告一、产品初步体验介绍体验环境:RedmiNote5A体验时间:2018.7体验人:Cinnamon抖音快手抖音的logo以暗黑色为底,一个大大的亮白立体音符占据中央,强调了抖音重点在于结合音乐,给人的第一感觉就是炫酷,符合年轻人的审美。快手的logo以黄色为主,是一个立体的摄像机,体现了快手重点在于记录。应用首页抖音的底部button遵循传统的排版:刷新-附近/推荐(首页)、关注、拍摄、消息和我…

    2022年5月10日
    89
  • java tess4j 示例_java 使用tess4j实现OCR的最简单样例[通俗易懂]

    java tess4j 示例_java 使用tess4j实现OCR的最简单样例[通俗易懂]网上很多教程没有介绍清楚tessdata的位置,以及怎么配置,并且对中文库的描述也存在问题,这里介绍一个最简单的样例。1、使用maven,直接引入依赖,确保你的工程JDK是1.8以上net.sourceforge.tess4jtess4j4.3.12、实现代码publicclassOCRDemo{publicstaticvoidmain(Stringargs[])throwsExce…

    2022年5月12日
    40
  • java-xml文件

    java-xml文件使用DOM思想,读取xml文件介绍dom4j核心类1。SAXReaderDOM解析思想的核心类方法:read(绑定了这个xml文件的输入流)读取xml文件返回文档对象,返回值是Doucment对象2.Doucment对象方法:getRootElement()获取文档的根标签返回值:返回的是标签对象Element3.Element标签对象方法获取子标签Listelements()返回所有子标签集合List方法:StringattributeValues(String属性

    2022年7月8日
    20

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号