android 不压缩保存图片格式,Android中图片的压缩方法
Bitmap
Android中圖片是以Bitmap(位圖)形式存在,位圖常見的文件格式有:.bmp .jpg .png .gif 。
Bitmap的大小計算 = 圖片的長度圖片的寬度單位像素所占用的字節數。
Bitmap的優缺點
優點:色彩變化豐富,可以改變任何形狀的區域色彩顯示效果。
缺點:放大和縮小都會引起像素的增加和縮小,這樣會使圖片出現失真或者鋸齒形。另一個缺點就是像素越高數據量越大占用的內存越大。
常用壓縮方法
質量壓縮
質量壓縮是不會改變圖片的寬高(像素),是去改變圖片的位深和透明度的。
png是無損壓縮的,所以質量壓縮對png是不起作用的
/**
* 質量壓縮
* 降低圖片的質量,不會減少圖片的像素,改變圖片的位深和透明度,沒有改變像素大小,所以不會減少占據的內存大小。
*/
private void qualityCompress(Bitmap.CompressFormat format, int quality, String type) {
try {
File file = new File(Environment.getExternalStorageDirectory(), "test_" + quality + format + "_" + type + ".jpg");
//得到一個文件輸入流
mFileOutputStream = new FileOutputStream(file);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_pic);
// 圖片的格式 quality是壓縮完之后保存圖片設置的質量參數 png是無損壓縮,quality參數對png無效
bitmap.compress(format, quality, mFileOutputStream);
} catch (FileNotFoundException exception) {
exception.printStackTrace();
} finally {
if (mFileOutputStream != null) {
try {
mFileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
采樣率壓縮
降低圖片的像素。數值越高,圖片像素越低。
/**
* 尺寸壓縮中的采樣率壓縮
* 改變了像素,減少了圖片占用的內存,同樣照片的清晰度也降低了。
* inSampleSize = 2 內存將減少 1/4 內存大小 = 圖片寬/inSampleSize * 圖片高/inSampleSize * 單位像素占用的字節大小
*/
private void loadImage() {
BitmapFactory.Options options = new BitmapFactory.Options();
//設置為true 并會將圖片加載到內存中,但是可以獲取到圖片的寬和高 通過options
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.drawable.ic_pic, options);
int outWidth = options.outWidth;
int outHeight = options.outHeight;
Log.d(TAG, "loadImage: width = " + outWidth);
Log.d(TAG, "loadImage: height = " + outHeight);
//這個地方根據獲取到大小和想要顯示的大小做縮放
options.inSampleSize = calculateInSampleSize(options, 200, 200);
Log.d(TAG, "loadImage: inSampleSize = " + options.inSampleSize);
//設置為false 這回再去解碼圖片可以將其讀取到內存中了。
options.inJustDecodeBounds = false;
mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_pic, options);
File file = new File(Environment.getExternalStorageDirectory(), "text_" + "just_100_no_inSampleSize.jpg");
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(file);
mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// mImageView.setImageBitmap(mBitmap);
}
/**
* 計算圖片的縮放比例
*
* @param options
* @param reqHeight
* @param reqWidth
*/
private int calculateInSampleSize(BitmapFactory.Options options, int reqHeight, int reqWidth) {
int height = options.outHeight;
int width = options.outWidth;
//縮放的比例
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
int halfHeight = height / 2;
int halfWidth = width / 2;
while ((halfHeight / inSampleSize) >= reqHeight && (halfWidth / inSampleSize) >= reqWidth) {
inSampleSize *= 2;
}
}
return inSampleSize;
}
縮放法壓縮
減小圖片的像素,生成的圖片file的大小也變小了。
/**
* 尺寸壓縮中的 按縮放比壓縮 這里的縮放比是事先定義好的 和采樣率相比 采樣率是根據給定的預期大小去計算縮放比
*
* @param mBitmap
* @param mFile
*/
private void compressBitmapToFile(Bitmap mBitmap, File mFile) {
//設置壓縮倍數
int ratio = 2;
//壓縮Bitmap到對應的尺寸 壓縮格式 ARGB_8888 4字節 一個像素需要4個字節來存儲
Bitmap resultBitmap = Bitmap.createBitmap(mBitmap.getWidth() / ratio, mBitmap.getHeight() / ratio, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(resultBitmap);
Rect rect = new Rect(0, 0, mBitmap.getWidth() / ratio, mBitmap.getHeight() / ratio);
canvas.drawBitmap(mBitmap, null, rect, null);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
File file = new File(Environment.getExternalStorageDirectory(), "test_compress_100.jpg");
resultBitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
try {
mFileOutputStream1 = new FileOutputStream(file);
mFileOutputStream1.write(byteArrayOutputStream.toByteArray());
mFileOutputStream1.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (mFileOutputStream1 != null) {
try {
mFileOutputStream1.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
總結
以上是生活随笔為你收集整理的android 不压缩保存图片格式,Android中图片的压缩方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android商城开发(一)——一次活动
- 下一篇: SSH秘钥认证