- 圖像:一個(gè)一個(gè)像素點(diǎn)構(gòu)成滥朱。所有不同的顏色像素點(diǎn)構(gòu)成一幅完整圖像。
- 位圖表示圖像的方法:記錄一幅圖像中所有像素點(diǎn)(pixels)信息
- 圖像(位圖)的深度:表示一個(gè)像素點(diǎn)用多少個(gè)bit位
- 單色位圖:用1bit描述一個(gè)像素點(diǎn)信息毒涧。
- 256色位圖:用8bits描述一個(gè)像素點(diǎn)信息
- 24位位圖:用24bits描述一個(gè)像素點(diǎn)信息
view.getWidth獲取的是像素px
加載大圖片產(chǎn)生OOM問(wèn)題
在使用BitmapFactory的decodeStream,decodeFile,decodeResource方法時(shí)贮预,超出系統(tǒng)分配的內(nèi)存大小(一般是8M)契讲,報(bào)出OOM仿吞。
-
解決方法,設(shè)置采樣率inSampleSize捡偏,用于減少要加載像素個(gè)數(shù)
//加載sd卡上jpg圖片顯示在imageView //Bitmap bm = BitmapFactory.decodeFile("/sdcard/biger.jpg"); //加載大圖片唤冈,產(chǎn)生OOM問(wèn)題,解決辦法:想方設(shè)法減少像素個(gè)數(shù) Options opts = new Options(); opts.inSampleSize = 8;//設(shè)置采樣率霹琼,成倍數(shù)減少像素點(diǎn)务傲。inSamleSize = 8 總像素點(diǎn)是原圖像的1/64 Bitmap bm = BitmapFactory.decodeFile("/sdcard/biger.jpg", opts); //Bitmap.Config.ARGB_8888 描述一個(gè)像素用32bits,Alpha R G B iv.setImageBitmap(bm);
采樣率一般設(shè)置方法:分別獲得屏幕的分辨率(寬方向像素個(gè)數(shù) X 高方向像素個(gè)數(shù))和圖片分辨率(寬方向像素個(gè)數(shù) X 高方向像素個(gè)數(shù))枣申。用圖片的寬方向上像素個(gè)數(shù)除以屏幕的寬方向上像素個(gè)數(shù),用圖片的高方向上像素個(gè)數(shù)除以屏幕的高方向上像素個(gè)數(shù)看杭。取兩個(gè)比值中最大值或均值作為采樣率忠藤。
采樣率設(shè)置之后的寬高應(yīng)該大于ImageView期望的寬高,否則會(huì)被拉伸而變模糊
-
屏幕分辨率
//獲得屏幕分辨率 //1.獲得窗口管理器 WindowManager manager = (WindowManager) getSystemService(WINDOW_SERVICE); //2.獲得默認(rèn)顯示對(duì)象 Display display = manager.getDefaultDisplay(); //在api13之下使用 //int windowWidth = display.getWidth(); //int windowHeight = display.getHeight(); //在api13以上使用 Point outSize = new Point(); display.getSize(outSize);//先傳入對(duì)象楼雹,方法中將數(shù)據(jù)再填入對(duì)象中 int windowWidth = outSize.x; int windowHeight = outSize.y; System.out.println(windowWidth + " * " + windowHeight);
-
獲得jpg圖片的分辨率
int sampleWidth = 0; int samleHeight = 0; //獲得jpg圖片分辨率 try { //獲得Exif接口對(duì)象 ExifInterface exif = new ExifInterface("/sdcard/biger.jpg"); //獲得圖片的寬方向像素個(gè)數(shù) int width = exif.getAttributeInt(ExifInterface.TAG_IMAGE_WIDTH, -1); //獲得圖片的高方向像素個(gè)數(shù) int height = exif.getAttributeInt(ExifInterface.TAG_IMAGE_LENGTH, -1); System.out.println(width + " X " + height); sampleWidth = width / windowWidth; samleHeight = height / windowHeight; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }
其它類(lèi)型圖片png,bmp獲得分辨率(也可以獲取JPG的)
/* //其它類(lèi)型圖片png,bmp獲得分辨率方法 Options opt = new Options(); opt.inJustDecodeBounds = true;//僅獲得圖片的分辨率模孩,寬和高尖阔。并不會(huì)將文件轉(zhuǎn)成bitmap對(duì)象 BitmapFactory.decodeFile("/sdcard/biger.png", opt ); int width = opt.outWidth; int height = opt.outHeight; */
-
計(jì)算采樣率
opts.inSampleSize = sampleWidth > samleHeight ? sampleWidth : samleHeight;
采樣率設(shè)置應(yīng)遵循如下原則
1、BitmapFactory.Options的inJustDecodeBounds 設(shè)置為true榨咐,并加載圖片
2介却、從BitmapFactory.Options中獲取圖片的原始寬高,outHeight块茁、outWidth
3齿坷、計(jì)算采樣率inSampleSize
4、BitmapFactory.Options的inJustDecodeBounds 設(shè)置為false数焊,然后重新加載圖片
寫(xiě)個(gè)demo測(cè)試一下:
傳送門(mén):https://github.com/jiaweizeng/LoadPhotoOOM
package cn.hzjk.loadphotooom;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends AppCompatActivity {
private Bitmap mBitmap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ImageView iv = findViewById(R.id.iv_load);
Button btn = findViewById(R.id.btn_load);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
/*mBitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().
getPath() + "/IMG_2509.JPG");*/
mBitmap = getMySampleBitmap(Environment.getExternalStorageDirectory().
getPath() + "/IMG_2509.JPG",iv.getWidth(),iv.getHeight());
iv.setImageBitmap(mBitmap);
}
});
}
/** 設(shè)置采樣率永淌,防止圖片太大,解析OOM
*
* @param file_path 圖片路徑
* @return
*/
public Bitmap getMySampleBitmap(String file_path, int width, int height) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(file_path, options);
options.inSampleSize = getMySampleSize(width, height, options);
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(file_path, options);
}
private int getMySampleSize(int reqWidth, int reqHeight, BitmapFactory.Options options) {
int inSampleSize = 1;
if (options.outWidth > reqWidth || options.outHeight > reqHeight) {
int widthRatio = Math.round((float) options.outWidth / (float) reqWidth);
int heightRatio = Math.round((float) options.outHeight / (float) reqHeight);
inSampleSize = Math.min(widthRatio, heightRatio);
}
return inSampleSize;
}
}
測(cè)試圖片大小8M
設(shè)置采樣率之前的內(nèi)存變化:
設(shè)置采樣率之后的內(nèi)存變化:
壓縮bitmap
private Bitmap imageZoom(Bitmap bitMap) {
//圖片允許最大空間 單位:KB
double maxSize =1000.00;
//將bitmap放至數(shù)組中佩耳,意在bitmap的大兴熘(與實(shí)際讀取的原文件要大)
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitMap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] b = baos.toByteArray();
//將字節(jié)換成KB
double mid = b.length/1024;
//判斷bitmap占用空間是否大于允許最大空間 如果大于則壓縮 小于則不壓縮
if (mid > maxSize) {
//獲取bitmap大小 是允許最大大小的多少倍
double i = mid / maxSize;
//開(kāi)始?jí)嚎s 此處用到平方根 將寬帶和高度壓縮掉對(duì)應(yīng)的平方根倍 (1.保持刻度和高度和原bitmap比率一致,壓縮后也達(dá)到了最大大小占用空間的大懈珊瘛)
bitMap = zoomImage(bitMap, bitMap.getWidth() / Math.sqrt(i),
bitMap.getHeight() / Math.sqrt(i));
}
return bitMap;
}
/***
* 圖片的縮放方法
*
* @param bgimage
* :源圖片資源
* @param newWidth
* :縮放后寬度
* @param newHeight
* :縮放后高度
* @return
*/
public static Bitmap zoomImage(Bitmap bgimage, double newWidth,
double newHeight) {
// 獲取這個(gè)圖片的寬和高
float width = bgimage.getWidth();
float height = bgimage.getHeight();
// 創(chuàng)建操作圖片用的matrix對(duì)象
Matrix matrix = new Matrix();
// 計(jì)算寬高縮放率
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
// 縮放圖片動(dòng)作
matrix.postScale(scaleWidth, scaleHeight);
Bitmap bitmap = Bitmap.createBitmap(bgimage, 0, 0, (int) width,
(int) height, matrix, true);
return bitmap;
}
/壓縮圖片框架/ compile 'top.zibin:Luban:1.1.1' compile 'id.zelory:compressor:2.0.0'
壓縮網(wǎng)站:https://tinypng.com/