Android有关图片压缩的几种方法

第一种:图片质量压缩  

private Bitmap compressImage(Bitmap image) {  
 
       ByteArrayOutputStream baos = new ByteArrayOutputStream();  
       image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中  
       int options = 100;  
       while ( baos.toByteArray().length / 1024>100) {  //循环判断如果压缩后图片是否大于100kb,大于继续压缩         
           baos.reset();//重置baos即清空baos  
           image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中  
           options -= 10;//每次都减少10  
       }  
       ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中  
       Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片  
       return bitmap;  
   }  

第二种:图片按比例大小压缩方法(根据路径获取图片并压缩)

private Bitmap getimage(String srcPath) {  
       BitmapFactory.Options newOpts = new BitmapFactory.Options();  
       //开始读入图片,此时把options.inJustDecodeBounds 设回true了  
       newOpts.inJustDecodeBounds = true;  
       Bitmap bitmap = BitmapFactory.decodeFile(srcPath,newOpts);//此时返回bm为空  
         
       newOpts.inJustDecodeBounds = false;  
       int w = newOpts.outWidth;  
       int h = newOpts.outHeight;  
       //现在主流手机比较多是800*480分辨率,所以高和宽我们设置为  
       float hh = 800f;//这里设置高度为800f  
       float ww = 480f;//这里设置宽度为480f  
       //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可  
       int be = 1;//be=1表示不缩放  
       if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放  
           be = (int) (newOpts.outWidth / ww);  
       } else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放  
           be = (int) (newOpts.outHeight / hh);  
       }  
       if (be <= 0)  
           be = 1;  
       newOpts.inSampleSize = be;//设置缩放比例  
       //重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了  
       bitmap = BitmapFactory.decodeFile(srcPath, newOpts);  
       return compressImage(bitmap);//压缩好比例大小后再进行质量压缩  
   }  

设置压缩比例inSampleSize,但是这个压缩比例设置多少就是个问题,所以我们解析图片可以分为俩个步骤,第一步就是获取图片的宽高,这里要设置Options.inJustDecodeBounds=true,这时候decode的bitmap为null,只是把图片的宽高放在Options里,然后第二步就是设置合适的压缩比例inSampleSize,这时候获得合适的Bitmap.

第三种:图片按比例大小压缩方法(根据Bitmap图片压缩)

private Bitmap comp(Bitmap image) {  
   ByteArrayOutputStream baos = new ByteArrayOutputStream();         
   image.compress(Bitmap.CompressFormat.JPEG, 100, baos);  
   if( baos.toByteArray().length / 1024>1024) {//判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出    
       baos.reset();//重置baos即清空baos  
       image.compress(Bitmap.CompressFormat.JPEG, 50, baos);//这里压缩50%,把压缩后的数据存放到baos中  
   }  
   ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());  
   BitmapFactory.Options newOpts = new BitmapFactory.Options();  
   //开始读入图片,此时把options.inJustDecodeBounds 设回true了  
   newOpts.inJustDecodeBounds = true;  
   Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);  
   newOpts.inJustDecodeBounds = false;  
   int w = newOpts.outWidth;  
   int h = newOpts.outHeight;  
   //现在主流手机比较多是800*480分辨率,所以高和宽我们设置为  
   float hh = 800f;//这里设置高度为800f  
   float ww = 480f;//这里设置宽度为480f  
   //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可  
   int be = 1;//be=1表示不缩放  
   if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放  
       be = (int) (newOpts.outWidth / ww);  
   } else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放  
       be = (int) (newOpts.outHeight / hh);  
   }  
   if (be <= 0)  
       be = 1;  
   newOpts.inSampleSize = be;//设置缩放比例  
   //重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了  
   isBm = new ByteArrayInputStream(baos.toByteArray());  
   bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);  
   return compressImage(bitmap);//压缩好比例大小后再进行质量压缩  
}  


图片旋转:

/**
* bitmap旋转
* @param rotation
* @param path
* @return
*/
public static Bitmap BmpRotation(int rotation, String path) {
Bitmap dstbmp = null;
try {
FileInputStream fis = new FileInputStream(path);
Bitmap bitmap = BitmapFactory.decodeStream(fis);
Matrix m = new Matrix();
m.postRotate(rotation);  
       dstbmp = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), 500,  m, true);  
} catch (Exception e) {
Log.e("BmpRatation Exception", e.toString());
}
return dstbmp;
}


/**
* 本地图像(Bitmap转byte数组)

* @param path
*            本地文件路径(含文件名称)
*     将原图片压缩为原来的70%
*/
public static byte[] Bitmap2Byte(String path) {
Bitmap bitmap = null;
try {
FileInputStream fis = new FileInputStream(path);
bitmap  = BitmapFactory.decodeStream(fis);
} catch (Exception e) {
Log.e("Bitmap2Byte exception", e.toString());
}
if (bitmap != null) {
int size = bitmap.getWidth() * bitmap.getHeight() * 4;
// 创建一个字节数组输出流,流的大小为size
ByteArrayOutputStream baos = new ByteArrayOutputStream(size);
// 设置位图的压缩格式,质量为100%,并放入字节数组输出流中
bitmap.compress(Bitmap.CompressFormat.PNG, 10, baos);
// 将字节数组输出流转化为字节数组byte[]
byte[] imagedata = baos.toByteArray();
return imagedata;
}
return null;
}




你可能感兴趣的:(android,图片压缩,图片旋转)