首页 > 代码库 > Android 照相机拍摄照片,压缩后储存于SD卡

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

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.   
  7.     <uses-sdk  
  8.         android:minSdkVersion="8"  
  9.         android:targetSdkVersion="15" />  
  10.     <!-- 写SD卡 -->  
  11.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  
  12.   
  13.     <application  
  14.         android:allowBackup="true"  
  15.         android:icon="@drawable/ic_launcher"  
  16.         android:label="@string/app_name"  
  17.         android:theme="@style/AppTheme" >  
  18.         <activity  
  19.             android:name=".MainActivity"  
  20.             android:label="@string/app_name" >  
  21.             <intent-filter>  
  22.                 <action android:name="android.intent.action.MAIN" />  
  23.   
  24.                 <category android:name="android.intent.category.LAUNCHER" />  
  25.             </intent-filter>  
  26.         </activity>  
  27.     </application>  
  28.   
  29. </manifest>  

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

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