亲爱的同学们,相信我们在软件开发中经常会遇到拍照,选择相册上传的功能。前几天遇到一个这样的一个问题。后台要求我上传的图片不能超过500KB,大家知道我们现在的智能手机像素越来越高,拍照的照片一般都是几兆甚至一二十兆。那么我们改怎么做呢,答案是一定的,那就是先进行压缩,然后在保存压缩后的图片上传。最近在网络上也搜索到了很多关于压缩的内容,相信大家会有和我同感,为什么都写的不清楚,或许我们可以实现我们的功能,但是这是如何实现的,为什么呢。下面我就贴出我的代码,每一步骤都会有详细的注释。希望会帮到大家。

第一,就是压缩图片的方法。在我们选择照片或者拍照之后,将图片路径传入进去就可以进行压缩,然后返回我们一个Bitmap的对象。注释的比较清楚,哪里不明白的可以给我评论留言。

/*** @param path* @return* @throws IOException* 压缩图片*/public static Bitmap revitionImageSize(String path) throws IOException {//根据文件路径,创建一个字节缓冲输入流BufferedInputStream in = new BufferedInputStream(new FileInputStream(new File(path)));BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;//根据流返回一个位图也就是bitmap,当options.inJustDecodeBounds = true的时候不需要完全解码,// 它仅仅会把它的宽,高取回来给你,这样就不会占用太多的内存,也就不会那么频繁的发生OOM了BitmapFactory.decodeStream(in, null, options);//关闭流in.close();int i = 0;Bitmap bitmap = null;while (true) {// options.outWidth >> i 。右移运算符,num >> 1,相当于num除以2if ((options.outWidth >> i <= 1000) && (options.outHeight >> i <= 1000)) {//得到一个输入流in = new BufferedInputStream(new FileInputStream(new File(path)));//为了解决图片解码时候出现SanpleSize错误,设置恰当的inSampleSize可以使BitmapFactory分配更少的空间以消除该错误//你将 inSampleSize 赋值为2,那就是每隔2行采1行,每隔2列采一列,那你解析出的图片就是原图大小的1/4.// Math.pow(2.0D, i)次方运算,2的i次方是多少options.inSampleSize = (int) Math.pow(2.0D, i);// 这里之前设置为了true,所以要改为false,否则就创建不出图片options.inJustDecodeBounds = false;bitmap = BitmapFactory.decodeStream(in, null, options);break;}i += 1;}return bitmap;}

第二、当我们拿到这个Bitmap对象之后,我们就可以进行保存的操作,因为我们这个毕竟是个对象,我们通常的上传过程是需要上传的文件的。

 /*** @param bitmap* 保存图片到SD卡的方法*/public void saveBitmapFile(Bitmap bitmap){//Environment.getExternalStorageDirectory() 获取Android外部存储的空间,当有外部SD卡就在外部SD卡上建立。//没有外部SD卡就在内部SD卡的非data/data/目录建立目录。(data/data/目录才是真正的内存目录。)//IMAGE_NAME文件的名字,随便起。比如(xxx.jpg)File tempFile = new File(Environment.getExternalStorageDirectory(), IMAGE_NAME );try {//创建一个输出流,将数据写入到创建的文件对象中。BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(tempFile));30 是压缩率,表示压缩70%; 如果不压缩是100,bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);/* 为什么要调用flush()方法?当FileOutputStream作为BufferedOutputStream构造函数的参数传入,然后对BufferedOutputStream进行写入操作,才能利用缓冲及flush()。查看BufferedOutputStream的源代码,发现所谓的buffer其实就是一个byte[]。BufferedOutputStream的每一次write其实是将内容写入byte[],当buffer容量到达上限时,会触发真正的磁盘写入。而另一种触发磁盘写入的办法就是调用flush()了。*/bos.flush();//关闭流对象bos.close();} catch (IOException e) {e.printStackTrace();}} 
   最后告诉大家,可以先看看java中的文件流和字节流操作,以及Android的Bitmap对象,对理解上述的代码会很有帮助。希望能帮助到大家。共同进步,欢迎转载和留言。一起探讨。
关注微信公众号:

Android压缩图片并且保存到本地内存卡中相关推荐

  1. Android实现将View转化为图片并保存到本地

    一.概述 app中有需求需要将View转化为图片并保存到本地,这里分两种情况: 1.View本身已经显示在界面上 2.View还没有添加到界面上或者没有显示(绘制)过 二.实现方法 对于上述的第一种情 ...

  2. Android pdf转换bitmap保存到本地

    Android pdf转换bitmap保存到本地 PDF转换成图片保存到本地 Android有自带的API提供 首先要把PDF文件下载到本地,下载成功使用 下载就最简单的IO下载都行 例如: try ...

  3. (Metro学习三)图片uri保存到本地图片库

    已知网络上图片的uri地址,如何将网络图片保存到本地呢?代码如下: 保存图片到本地 private async Task SaveImageFromUrl(string uri, string fil ...

  4. php curl 下载图片,CURL实现下载远程图片并保存到本地

    WEB开发中我们经常使用一些简单的采集功能,这样可以自动把远程服务器的图片或资源直接采集保存到本地服务器中:实现下载远程图片并把它保存到本地有很多方法,比如可以直接能过file_get_content ...

  5. [转]使用URLConnection下载文件或图片并保存到本地

    Code import java.io.FileOutputStream;    import java.io.InputStream;    import java.io.OutputStream; ...

  6. php 远程图片大小,PHP下载远程图片并保存到本地方法总结

    这篇文章主要介绍了PHP下载远程图片并保存到本地方法总结的相关资料,需要的朋友可以参考下 1.获取远程文件大小及信息的函数 function getFileSize($url){ $url = par ...

  7. python爬虫网页图片并保存到本地

    #coding=utf-8 import urllib import re #py抓取页面图片并保存到本地 #获取页面信息 def getHtml(url): page = urllib.urlope ...

  8. python save保存图片到本地_python爬取网站上的图片并保存到本地

    1.导入需要的模块requests,BeautifulSoup,os(用于文件读写). 2.创建一个类,并初始化. class BeautifulPicture: def __init__(self) ...

  9. 简单的图片爬取,爬取豆瓣电影图片并保存到本地

    文章目录 前言 一.前提准备 1.对页面进行分析 2.准备框架 二.代码实现 三.总结 前言 这是本人第一次写博客,如有失误请见谅.这段时间,由于疫情原因,在家无聊,再加上这学期要学习爬虫这们课程.所 ...

最新文章

  1. cordova 发布 android release 签名打包
  2. [YTU]_2907(类重载实现矩阵加法)
  3. No PIL installation found INFO:superset.utils.screenshots:No PIL installation found
  4. 2015.5.12站立会议
  5. 11.QT中同一个源文件对应两个不同的ui
  6. 什么是微型计算机的组成原理,1微型计算机基本组成原理.ppt
  7. 转Java调用C/C++编写的第三方dll动态链接库(非native API)--- JNI
  8. Atitit 《摩奴法典》overivew 读后感 不是由国王 颁布的,而是 僧侣编制
  9. java 车牌号归属地_本地化JavaAnpr用于本地的车牌
  10. 怎样读书(繁体版)读书笔记
  11. uniapp 配置 底部 TabBar
  12. GTD时间管理 | 高效能人士的工作习惯
  13. LeetCode动画 | 218.天际线问题
  14. 西工大计算机学院博士考试,【经验指导】西北工业大学2019年博士研究生报考指南及考博注意事...
  15. (10.2)【隐写实现】简介、流程图、具体步骤
  16. 利用Flashbug插件查看AMF数据
  17. 【PIC32MZ】开发环境的搭建
  18. raid0,raid1,raid10,raid5,raid50,raid6,raid60的功能总结简述(转老金)
  19. R语言-机器学习概述
  20. CoAP协议学习笔记(一)

热门文章

  1. Android获取系统的硬件信息、系统版本以及如何检测ROM类型
  2. Kubernets集群管理-升级 kubernetes 集群版本到v1.21.14
  3. JS获取网页大小和鼠标当前坐标
  4. 快速排序(升序+降序)
  5. redis的字典(Hash)
  6. spring常见漏洞总结
  7. 图像处理随笔之峰值信噪比(peak signal to noise ratio)
  8. 机器学习模型——回归模型
  9. win10下如何为jdk配置环境变量
  10. 嵌入式linux内核 浮点运算,ARM处理器Linux下浮点运算单元运用