Android画像圧縮テクニック


他人の労働成果を尊重してください.転載は出所を明記してください.
http://blog.csdn.net/fengyuzhengfan/article/details/41759835
Androidクライアントの画像をサーバーにアップロードする必要がある場合、よく画像を圧縮する必要があります.画像の圧縮方法については、いくつかの一般的な方法を共有します.
第一の方法:圧縮の目的を達成するために裁断する.
「Androidが開発した裁断写真」の中で、写真をどのように裁断するかを詳しく紹介しました.興味のある友達は見に行ってもいいです.
第二の方法:画像を劣化処理(すなわち画像の品質を低下させる)し、圧縮の目的を達成する.
このような方法もよく使われています.画像の劣化方法を紹介します.
画像を質的に低減するにはBitmapのこの方法が使えます.bootlean android.graphics.Bitmap.com mpres(Comppress Format format,int quality,OutputStream stream)
ここで、パラメータformatは圧縮後のフォーマットを表し、quality圧縮後のピクチャ品質(0は最低、100は非圧縮を表します)は、streamは圧縮後のピクチャを保存する出力ストリームを表します.
以下は詳細コードです.
/**
 *           
 * @author JPH
 * @param bitmap       
 * @param imgPath        
 * @date 2014-12-5  11:30:43
 */
public static void compressImageByQuality(final Bitmap bitmap,final String imgPath){
	new Thread(new Runnable() {//           
		@Override
		public void run() {
			// TODO Auto-generated method stub
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			options = 100;
			bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);//      ,          baos  (100     ,0       )
			while (baos.toByteArray().length / 1024 > 100) {//               100kb,               
				baos.reset();//  baos                
				options -= 10;//        10
				if(options<0)options=0;//        10,             
				bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);//          baos 
				if(options==0)break;//             ,      
			}
			try {
				FileOutputStream fos = new FileOutputStream(new File(imgPath));//                  
				fos.write(baos.toByteArray());
				fos.flush();
				fos.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}).start();
}
メソッド解析:
この方法にはI/O操作と再帰的呼び出しが含まれていますので、マルチスレッドで処理します.
第三の方法:画像のピクセルを比例的に縮小して圧縮の目的を達成する.
この方法は主にAndroid.graphics.BitmapFactory.Options.Options()の方法で指定された采用率で画像をメモリにロードして当地に出力し、圧縮画素を達成する目的である.
詳細コード:
/**
 *                   
 * @author JPH
 * @param imgPath
 * @date 2014-12-5  11:30:59
 */
public static void compressImageByPixel(String imgPath) {
	BitmapFactory.Options newOpts = new BitmapFactory.Options();
	newOpts.inJustDecodeBounds = true;//   ,    
	Bitmap bitmap = BitmapFactory.decodeFile(imgPath, newOpts);
	newOpts.inJustDecodeBounds = false;
	int width = newOpts.outWidth;
	int height = newOpts.outHeight;
	float maxSize = 1000f;//  1000px
	int be = 1;
	if (width > height && width > maxSize) {//   ,                  
		be = (int) (newOpts.outWidth / maxSize);
	} else if (width < height && height > maxSize) {
		be = (int) (newOpts.outHeight / maxSize);
	}
	be++;
	newOpts.inSampleSize = be;//     
	newOpts.inPreferredConfig = Config.ARGB_8888;//       ,   
	newOpts.inPurgeable = true;//         
	newOpts.inInputShareable = true;//。                
	bitmap = BitmapFactory.decodeFile(imgPath, newOpts);
	
	ByteArrayOutputStream baos = new ByteArrayOutputStream();
	bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
	try {
		FileOutputStream fos = new FileOutputStream(new File(imgPath));
		fos.write(baos.toByteArray());
		fos.flush();
		fos.close();
	} catch (Exception e) {
		e.printStackTrace();
	}
}
第四の方法:画像をまず比例圧縮してから質を下げる.
この方式は主に第二及び第三の方法を組み合わせて以下のように詳細コードである.
/**
 *           
 * @author JPH
 * @param bitmap       
 * @param imgPath        
 * @date 2014-12-5  11:30:43
 */
public static void compressImageByQuality(final Bitmap bitmap,final String imgPath){
	new Thread(new Runnable() {//           
		@Override
		public void run() {
			// TODO Auto-generated method stub
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			options = 100;
			bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);//      ,          baos  (100     ,0       )
			while (baos.toByteArray().length / 1024 > 100) {//               100kb,               
				baos.reset();//  baos                
				options -= 10;//        10
				if(options<0)options=0;//        10,             
				bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);//          baos 
				if(options==0)break;//             ,      
			}
			try {
				FileOutputStream fos = new FileOutputStream(new File(imgPath));//                  
				fos.write(baos.toByteArray());
				fos.flush();
				fos.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}).start();
}
/**
 *                   
 * @author JPH
 * @param imgPath
 * @date 2014-12-5  11:30:59
 */
public static void compressImageByPixel(String imgPath) {
	BitmapFactory.Options newOpts = new BitmapFactory.Options();
	newOpts.inJustDecodeBounds = true;//   ,    
	Bitmap bitmap = BitmapFactory.decodeFile(imgPath, newOpts);
	newOpts.inJustDecodeBounds = false;
	int width = newOpts.outWidth;
	int height = newOpts.outHeight;
	float maxSize = 1000f;//  1000px
	int be = 1;
	if (width > height && width > maxSize) {//   ,                  
		be = (int) (newOpts.outWidth / maxSize);
	} else if (width < height && height > maxSize) {
		be = (int) (newOpts.outHeight / maxSize);
	}
	be++;
	newOpts.inSampleSize = be;//     
	newOpts.inPreferredConfig = Config.ARGB_8888;//       ,   
	newOpts.inPurgeable = true;//         
	newOpts.inInputShareable = true;//。                
	bitmap = BitmapFactory.decodeFile(imgPath, newOpts);
	compressImageByQuality(bitmap,imgPath);//                 
}