android圖片壓縮的3種方法實例
android 圖片壓縮方法:
第一:質(zhì)量壓縮法:
private Bitmap compressImage(Bitmap image) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//質(zhì)量壓縮方法,這里100表示不壓縮,把壓縮后的數(shù)據(jù)存放到baos中
int options = 100;
while ( baos.toByteArray().length / 1024>100) { //循環(huán)判斷如果壓縮后圖片是否大于100kb,大于繼續(xù)壓縮
baos.reset();//重置baos即清空baos
options -= 10;//每次都減少10
image.compress(Bitmap.CompressFormat.JPEG, options, baos);//這里壓縮options%,把壓縮后的數(shù)據(jù)存放到baos中
}
ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把壓縮后的數(shù)據(jù)baos存放到ByteArrayInputStream中
Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream數(shù)據(jù)生成圖片
return bitmap;
}
第二:圖片按比例大小壓縮方法(根據(jù)路徑獲取圖片并壓縮):
private Bitmap getimage(String srcPath) {
BitmapFactory.Options newOpts = new BitmapFactory.Options();
//開始讀入圖片,此時把options.inJustDecodeBounds 設(shè)回true了
newOpts.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeFile(srcPath,newOpts);//此時返回bm為空
newOpts.inJustDecodeBounds = false;
int w = newOpts.outWidth;
int h = newOpts.outHeight;
//現(xiàn)在主流手機比較多是800*480分辨率,所以高和寬我們設(shè)置為
float hh = 800f;//這里設(shè)置高度為800f
float ww = 480f;//這里設(shè)置寬度為480f
//縮放比。由于是固定比例縮放,只用高或者寬其中一個數(shù)據(jù)進行計算即可
int be = 1;//be=1表示不縮放
if (w > h && w > ww) {//如果寬度大的話根據(jù)寬度固定大小縮放
be = (int) (newOpts.outWidth / ww);
} else if (w < h && h > hh) {//如果高度高的話根據(jù)寬度固定大小縮放
be = (int) (newOpts.outHeight / hh);
}
if (be <= 0)
be = 1;
newOpts.inSampleSize = be;//設(shè)置縮放比例
//重新讀入圖片,注意此時已經(jīng)把options.inJustDecodeBounds 設(shè)回false了
bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
return compressImage(bitmap);//壓縮好比例大小后再進行質(zhì)量壓縮
}
圖片比例壓縮時, 我看到一個算法,說比較快。。
be = (int) ((w / STANDARD_WIDTH + h/ STANDARD_HEIGHT) / 2);
結(jié)論二:圖片比例壓縮倍數(shù) 就是 (寬度壓縮倍數(shù)+高度壓縮倍數(shù))/2..
第三:圖片按比例大小壓縮方法(根據(jù)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%,把壓縮后的數(shù)據(jù)存放到baos中
}
ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
BitmapFactory.Options newOpts = new BitmapFactory.Options();
//開始讀入圖片,此時把options.inJustDecodeBounds 設(shè)回true了
newOpts.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
newOpts.inJustDecodeBounds = false;
int w = newOpts.outWidth;
int h = newOpts.outHeight;
//現(xiàn)在主流手機比較多是800*480分辨率,所以高和寬我們設(shè)置為
float hh = 800f;//這里設(shè)置高度為800f
float ww = 480f;//這里設(shè)置寬度為480f
//縮放比。由于是固定比例縮放,只用高或者寬其中一個數(shù)據(jù)進行計算即可
int be = 1;//be=1表示不縮放
if (w > h && w > ww) {//如果寬度大的話根據(jù)寬度固定大小縮放
be = (int) (newOpts.outWidth / ww);
} else if (w < h && h > hh) {//如果高度高的話根據(jù)寬度固定大小縮放
be = (int) (newOpts.outHeight / hh);
}
if (be <= 0)
be = 1;
newOpts.inSampleSize = be;//設(shè)置縮放比例
newOpts.inPreferredConfig = Config.RGB_565;//降低圖片從ARGB888到RGB565
//重新讀入圖片,注意此時已經(jīng)把options.inJustDecodeBounds 設(shè)回false了
isBm = new ByteArrayInputStream(baos.toByteArray());
bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
return compressImage(bitmap);//壓縮好比例大小后再進行質(zhì)量壓縮
}
相關(guān)文章
android開發(fā)教程之startActivityForResult使用方法
這篇文章主要介紹了android開發(fā)教程之startActivityForResult使用方法,需要的朋友可以參考下2014-03-03學習使用Material Design控件(三)使用CardView實現(xiàn)卡片效果
這篇文章主要為大家介紹了學習使用Material Design控件的詳細教程,如何使用CardView實現(xiàn)卡片效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07Android自定義GestureDetector實現(xiàn)手勢ImageView
這篇文章主要為大家詳細介紹了Android自定義GestureDetector實現(xiàn)手勢ImageView的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03仿iPhone風格對話框(附件包含例子/jar包/jar包源碼)
這個對框完全繼承、仿照AlertDialog,只是實現(xiàn)了自定義效果;另外,沒有實現(xiàn)setIcon,因為iphone中的對話框多數(shù)都沒有圖標;附件包含例子、jar包、jar包源碼2013-01-01Android編程實現(xiàn)將應(yīng)用強制安裝到手機內(nèi)存的方法
這篇文章主要介紹了Android編程實現(xiàn)將應(yīng)用強制安裝到手機內(nèi)存的方法,分析了Android程序安裝的相關(guān)屬性設(shè)置技巧及注意事項,需要的朋友可以參考下2015-12-12Android Jetpack組件中LiveData的優(yōu)劣
LiveData是Jetpack組件的一部分,更多的時候是搭配ViewModel來使用,相對于Observable,LiveData的最大優(yōu)勢是其具有生命感知的,換句話說,LiveData可以保證只有在組件(?Activity、Fragment、Service)處于活動生命周期狀態(tài)的時候才會更新數(shù)據(jù)2023-04-04