一般相机拍摄的照片大小为3-4M左右,这里因为需要完成将拍摄好的照片上传到服务器功能,所以需要将得到的照片进行压缩。这里演示就直接存放在SD卡中。

网上搜索了不少资料,得知可以使用:inSampleSize 设置图片的缩放比例。但是,这里需要注意,

  • inJustDecodeBounds = true; 需要先设置为真,表示只获得图片的资料信息。如果此时检验bitmap会发现bitmap==null;
  • 如果需要加载图片的时候,必须重新设置inJustDecodeBounds = false;

一、实现图片压缩(网上看到别人的,自己稍微修改了一下):

//压缩图片尺寸public Bitmap compressBySize(String pathName, int targetWidth,  int targetHeight) {  BitmapFactory.Options opts = new BitmapFactory.Options();  opts.inJustDecodeBounds = true;// 不去真的解析图片,只是获取图片的头部信息,包含宽高等;  Bitmap bitmap = BitmapFactory.decodeFile(pathName, opts);// 得到图片的宽度、高度;  float imgWidth = opts.outWidth;  float imgHeight = opts.outHeight;  // 分别计算图片宽度、高度与目标宽度、高度的比例;取大于等于该比例的最小整数;  int widthRatio = (int) Math.ceil(imgWidth / (float) targetWidth);  int heightRatio = (int) Math.ceil(imgHeight / (float) targetHeight); opts.inSampleSize = 1;if (widthRatio > 1 || widthRatio > 1) {  if (widthRatio > heightRatio) {  opts.inSampleSize = widthRatio;  } else {  opts.inSampleSize = heightRatio;  }  }  //设置好缩放比例后,加载图片进内容;  opts.inJustDecodeBounds = false;  bitmap = BitmapFactory.decodeFile(pathName, opts);  return bitmap;  }

二、将压缩后的图片存储于SD卡:

//存储进SD卡public void saveFile(Bitmap bm, String fileName) throws Exception {File dirFile = new File(fileName);  //检测图片是否存在if(dirFile.exists()){  dirFile.delete();  //删除原图片}  File myCaptureFile = new File(fileName);  BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));  //100表示不进行压缩,70表示压缩率为30%bm.compress(Bitmap.CompressFormat.JPEG, 100, bos);  bos.flush();  bos.close();  }  

这里注意,由于需要写SD卡,要添加一个权限:

<!-- 写SD卡 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

三、附上一个完整的小Demo:

1)MainActivity.java

package com.face.sendwinrar;import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;public class MainActivity extends Activity {//照片保存地址private static final String FILE_PATH = "/sdcard/gone.jpg";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);try {//压缩图片Bitmap bitmap = compressBySize(FILE_PATH,150,200);//保存图片saveFile(bitmap, FILE_PATH);} catch (Exception e) {e.printStackTrace();}}//压缩图片尺寸public Bitmap compressBySize(String pathName, int targetWidth,  int targetHeight) {  BitmapFactory.Options opts = new BitmapFactory.Options();  opts.inJustDecodeBounds = true;// 不去真的解析图片,只是获取图片的头部信息,包含宽高等;  Bitmap bitmap = BitmapFactory.decodeFile(pathName, opts);// 得到图片的宽度、高度;  float imgWidth = opts.outWidth;  float imgHeight = opts.outHeight;  // 分别计算图片宽度、高度与目标宽度、高度的比例;取大于等于该比例的最小整数;  int widthRatio = (int) Math.ceil(imgWidth / (float) targetWidth);  int heightRatio = (int) Math.ceil(imgHeight / (float) targetHeight); opts.inSampleSize = 1;if (widthRatio > 1 || widthRatio > 1) {  if (widthRatio > heightRatio) {  opts.inSampleSize = widthRatio;  } else {  opts.inSampleSize = heightRatio;  }  }  //设置好缩放比例后,加载图片进内容;  opts.inJustDecodeBounds = false;  bitmap = BitmapFactory.decodeFile(pathName, opts);  return bitmap;  }//存储进SD卡public void saveFile(Bitmap bm, String fileName) throws Exception {File dirFile = new File(fileName);  //检测图片是否存在if(dirFile.exists()){  dirFile.delete();  //删除原图片}  File myCaptureFile = new File(fileName);  BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));  //100表示不进行压缩,70表示压缩率为30%bm.compress(Bitmap.CompressFormat.JPEG, 100, bos);  bos.flush();  bos.close();  }  @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;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();if (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}
}

2)mainfest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.dc.xust.paybyface"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="8"android:targetSdkVersion="15" /><!-- 写SD卡 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name=".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></manifest>

这里直接运行就OK 了,不需要界面,main_activity.xml文件直接就是默认的,这里就不附上来了。

Android 照相机拍摄照片,压缩-储存于SD卡相关推荐

  1. android加密设备,用于Android手机的加密设备和加密外部SD卡

    电话被盗或丢失后,隐私将被泄露. Android手机具有"加密设备"和"加密外部SD卡"功能. 那么这两个功能有什么区别? 加密设备 加密设备后,内置SD卡上的 ...

  2. android 音乐播放器 获取sd卡所有音乐文件,Android Studio音乐播放器无法读取SD卡,只有内部存储器...

    我很抱歉,如果这原来是一个愚蠢的问题,它可能会成为一个快速修复,但我只是无法弄清楚.我在android studio中创建了音乐播放器,并且没有任何sdcard上的歌曲不会显示在列表视图中,只有内部内 ...

  3. android 6.0 存储卡,Android 6.0区别U盘和SD卡设备的方法详解

    如下所示: public static boolean isSdcardExists(Context context) { StorageManager storageManager = Storag ...

  4. android 4.4以上sd卡,怎样无根绕过Android 4.4(KitKat)外部SD卡限制

    步骤1:准备工作 您需要的是一款能够移动文件的应用.在这里,我们将使用B1 File Manager和B1 Free Archiver.两者都具有相似的文件管理功能(尽管第一个实际上更胜一筹). 它们 ...

  5. 扫盲:关于Android手机内存ROM、RAM还有SD卡的解释

    买Android手机,除了CPU外,接下来最重要的可能就是ROM.RAM.SD卡的大小了.那就赶紧来了解一下手机内存ROM.RAM还有SD卡的重要性吧,不然在买手机的时候可能会吃亏. 因为一些手机厂家 ...

  6. 安卓从sd引导linux,从android中的adb shell手动挂载SD卡

    我不敢相信没有人在2个月内回复你?哇-多么懈怠! 好吧无论如何我想我应该填写一些信息并提出一些问题. 1).您是否拥有root权限,或者是否从发布映像/固件中获取了系统vold?像Linux Supe ...

  7. android 5.0 sd卡读写,如何使用为Android 5.0(Lollipop)提供的新SD卡存取API?

    很多好的问题,让我们深入.:) 你如何使用它? 这是一个伟大的教程与KitKat中的存储访问框架交互: 在Lollipop中与新的API交互非常相似.要提示用户选择目录树,您可以启动这样的意图: In ...

  8. android 模拟器手机如何添加文件到sd卡?

    在DDMS中直接添加文件到模拟器sd卡如果出现错误类似:Failed to push XXXXX.txt on emulator- : Read-only file system的错误,原因是你的sd ...

  9. 删除的照片如何恢复?SD卡数据恢复妙招

    删除的照片如何恢复? 生活中我们用到相机的机会很多,如果不小心删除了相机里面的照片有什么补救的方法吗?当然是有的,随着科技的进步,数据恢复软件的功能也越来越强大,下面就给大家分享一下相机照片恢复方法. ...

最新文章

  1. css设置不允许复制文本内容
  2. MATLAB库函数upfirdn(分数倍采样率变换)的C语言实现(采用了STL::vector)
  3. linux文本文件和win文本文件的格式互换
  4. 2022届秋招笔试题小结:图
  5. linux raid类型,Linux学习笔记:RAID种类
  6. Latex学习--参考文献排版(ieee access 模板)
  7. 内网中使用TeamViewer进行远程操作
  8. 零成本拥有邮件归档系统
  9. 网易编程题之地牢逃脱
  10. 大数据热点案例(含图)
  11. 如何进行美国站税务审核
  12. 电磁循迹小车赛后总结
  13. R语言之一元线性回归xt2.15
  14. Unity3D 2D游戏摄像机的跟随实现
  15. 浅谈上海装修设计公司吊顶安装的注意要点
  16. python文件同时读写_如何用python同时读写文件
  17. linux系统中XLib在什么位置,什么是glibc?glibc是什么?什么是freetype?freetype是什么?什么是?Xlib是什么?什么是lo...
  18. python使用hyper下载https2.0网站的excel
  19. Apache Hue:Hue集成Hbase
  20. 微博付费打赏架构:一个社交场景下准金融项目开发和实践

热门文章

  1. 2020年计算机应用基础统考时间,2020网络教育,这四门科目考试时间已定你知道吗...
  2. Word中LNCS格式模板使用教程
  3. android string.trim,String.Trim 方法 (System) | Microsoft Docs
  4. 基于深度神经网络的安卓移动端智能花卉识别算法研究
  5. 原生JS实现的h5小游戏-植物大战僵尸
  6. Excel中如何批量合并单元格
  7. RNA-seq(2):下载参考基因组及基因注释,及测序数据-学习笔记
  8. 你不知道的锁屏方式!把锁屏密码设置成当前时间!随时间永远变动
  9. php word权限,快速解决PHP调用Word组件DCOM权限的问题
  10. 网易云修改音乐名字(不能是在线的)