Android 照相机拍摄照片,压缩后储存于SD卡

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

网上搜索了不少资料,得知可以使用:inSampleSize 设置图片的缩放比例。

但是,这里需要注意:

1)inJustDecodeBounds = true; 需要先设置为真,表示只获得图片的资料信息。如果此时检验bitmap会发现bitmap==null;

2)如果需要加载图片的时候,必须重新设置inJustDecodeBounds = false;

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

[java] view plaincopyprint?

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

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

[java] view plaincopyprint?

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

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

[html] view plaincopyprint?

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

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

1)MainActivity.java

[java] view plaincopyprint?

  1. package com.face.sendwinrar;
  2. import java.io.BufferedOutputStream;
  3. import java.io.File;
  4. import java.io.FileOutputStream;
  5. import android.app.Activity;
  6. import android.graphics.Bitmap;
  7. import android.graphics.BitmapFactory;
  8. import android.os.Bundle;
  9. import android.view.Menu;
  10. import android.view.MenuItem;
  11. public class MainActivity extends Activity {
  12. //照片保存地址
  13. private static final String FILE_PATH = "/sdcard/gone.jpg";
  14. @Override
  15. protected void onCreate(Bundle savedInstanceState) {
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.activity_main);
  18. try {
  19. //压缩图片
  20. Bitmap bitmap = compressBySize(FILE_PATH,150,200);
  21. //保存图片
  22. saveFile(bitmap, FILE_PATH);
  23. } catch (Exception e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. //压缩图片尺寸
  28. public Bitmap compressBySize(String pathName, int targetWidth,
  29. int targetHeight) {
  30. BitmapFactory.Options opts = new BitmapFactory.Options();
  31. opts.inJustDecodeBounds = true;// 不去真的解析图片,只是获取图片的头部信息,包含宽高等;
  32. Bitmap bitmap = BitmapFactory.decodeFile(pathName, opts);
  33. // 得到图片的宽度、高度;
  34. float imgWidth = opts.outWidth;
  35. float imgHeight = opts.outHeight;
  36. // 分别计算图片宽度、高度与目标宽度、高度的比例;取大于等于该比例的最小整数;
  37. int widthRatio = (int) Math.ceil(imgWidth / (float) targetWidth);
  38. int heightRatio = (int) Math.ceil(imgHeight / (float) targetHeight);
  39. opts.inSampleSize = 1;
  40. if (widthRatio > 1 || widthRatio > 1) {
  41. if (widthRatio > heightRatio) {
  42. opts.inSampleSize = widthRatio;
  43. } else {
  44. opts.inSampleSize = heightRatio;
  45. }
  46. }
  47. //设置好缩放比例后,加载图片进内容;
  48. opts.inJustDecodeBounds = false;
  49. bitmap = BitmapFactory.decodeFile(pathName, opts);
  50. return bitmap;
  51. }
  52. //存储进SD卡
  53. public void saveFile(Bitmap bm, String fileName) throws Exception {
  54. File dirFile = new File(fileName);
  55. //检测图片是否存在
  56. if(dirFile.exists()){
  57. dirFile.delete();  //删除原图片
  58. }
  59. File myCaptureFile = new File(fileName);
  60. BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));
  61. //100表示不进行压缩,70表示压缩率为30%
  62. bm.compress(Bitmap.CompressFormat.JPEG, 100, bos);
  63. bos.flush();
  64. bos.close();
  65. }
  66. @Override
  67. public boolean onCreateOptionsMenu(Menu menu) {
  68. // Inflate the menu; this adds items to the action bar if it is present.
  69. getMenuInflater().inflate(R.menu.main, menu);
  70. return true;
  71. }
  72. @Override
  73. public boolean onOptionsItemSelected(MenuItem item) {
  74. // Handle action bar item clicks here. The action bar will
  75. // automatically handle clicks on the Home/Up button, so long
  76. // as you specify a parent activity in AndroidManifest.xml.
  77. int id = item.getItemId();
  78. if (id == R.id.action_settings) {
  79. return true;
  80. }
  81. return super.onOptionsItemSelected(item);
  82. }
  83. }

2)mainfest

[html] view plaincopyprint?

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.dc.xust.paybyface"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6. <uses-sdk
  7. android:minSdkVersion="8"
  8. android:targetSdkVersion="15" />
  9. <!-- 写SD卡 -->
  10. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  11. <application
  12. android:allowBackup="true"
  13. android:icon="@drawable/ic_launcher"
  14. android:label="@string/app_name"
  15. android:theme="@style/AppTheme" >
  16. <activity
  17. android:name=".MainActivity"
  18. android:label="@string/app_name" >
  19. <intent-filter>
  20. <action android:name="android.intent.action.MAIN" />
  21. <category android:name="android.intent.category.LAUNCHER" />
  22. </intent-filter>
  23. </activity>
  24. </application>
  25. </manifest>

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

时间: 2024-11-02 11:33:54

Android 照相机拍摄照片,压缩后储存于SD卡的相关文章

Android中使用log4j输出log内容到sd卡

在android中,实现输出log内容到sd卡中的文件里面,做法是: 还是相对来说,log4j,算是好用. 1.下载android的log4j的库(的封装) 去:http://code.google.com/p/android-logging-log4j/ 下载对应的android-logging-log4j-1.0.3.jar,加到项目中. 2.再去下载所依赖的apache的log4j库 去:http://logging.apache.org/log4j/1.2/download.html 下

Android(java)学习笔记173:Sd卡状态广播接收者

1.广播接受者 >什么是广播.收音机. 电台:对外发送信号. 收音机:接收电台的信号. >在android系统里面,系统有很多重要的事件: 电池电量低,插入充电器,sd卡被移除,有电话打出去,有短信发送进来. 使用广播机制步骤: (1)买收音机         public class SDStatusReceiver extends BroadcastReceiver (2)装电池          <receiver android:name="com.itheima.sd

Android自定义照相机实现(拍照、保存到SD卡,利用Bundle在Acitivity交换数据)

Android自定义照相机实现 近期小巫在学校有一个创新项目,也不是最近,是一个拖了很久的项目,之前一直没有去搞,最近因为要中期检查,搞得我跟小组成员一阵忙活,其实开发一款照相机软件并不太难,下面就是通过自定义的方式来实现手机照相的功能. 创建一个项目:FingerTakePicture 首先来搞一下界面: <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=&qu

Android相机、相册获取图片显示(压缩)并保存到SD卡

做过类似需求的同学都知道,在Activity中通过如下代码可以启动相机,然后在重写的onActivityResult方法中可以获取到返回的照片数据: Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(openCameraIntent, TAKE_PICTURE); 在onActivityResult方法里通过Intent的getData方法获取的数据转换成bi

android Loger日志类(获取内置sd卡)

Android手机自带内部存储路径的获取 原文地址:http://my.oschina.net/liucundong/blog/288183 直接贴代码: public static String getExternalSdCardPath() { if (SDCardUtils.isSDCardEnable()) { File sdCardFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath());

Android将应用调试log信息保存在SD卡

转载:http://blog.csdn.net/way_ping_li/article/details/8487866 把自己应用的调试信息写入到SD卡中. package com.sdmc.hotel.util; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOEx

Android:创建文件或文件夹以及获取sd卡根目录

目录结构: 功能,可以根据录入的目录或者文件夹生成相应的文件或者文件夹 首先需要添加一个权限: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> MainActivity.java: package com.wyl.xml; import com.wyl.download.FileUtils; import android.app.Activity; import andr

Android拍照,剪切,并放入SD卡

android拍照之后,先对图片进行一次剪切,最后将图片保存到指定的目录.在项目需要用户拍照,并对图片进行剪切后,发送到服务器端做验证.这里贴出来一个小例子,能够实现基本的功能.文章最后会给出来demo.界面上就是一个点击事件. 1.首先点击事件中启动拍照,这里写死了图片的名称.实际上可以通过在公用的类中定义一个静态变量来操作. public void tackPhoto() { String status = Environment.getExternalStorageState(); if

Android 获取屏幕截图 和保存到本地的sd卡路径下

/** * 获取和保存当前屏幕的截图 */ private void GetandSaveCurrentImage() { //1.构建Bitmap WindowManager windowManager = getWindowManager(); Display display = windowManager.getDefaultDisplay(); int w = display.getWidth(); int h = display.getHeight(); Bitmap Bmp = Bi