在安卓系统中,照片的大小是根据摄像头的分辨率而定的,一般是分辨率X4,就是照片的大。由于安卓系统中规定照片大小不能超过16M,因此,如果直接将照片存入内存,会造成OOM(内存溢出),故采用二次采样的方式对照片进行存储。下面分三种情景分别研究
1.直接取系统已经压缩过的缩略图:
public class MainActivity extends AppCompatActivity {
private ImageView imageView;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView= (ImageView) findViewById(R.id.imageView);
}
//button的监听方法
public void open(View v){
//打开系统相机
Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent,0);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==0&&resultCode==RESULT_OK){
Bitmap bitmap=data.getParcelable("data);
imageView.setImageBitmap(bitmap);
}
}
}
2.取出原图,(根据File类)但取出原图,一般情况下会内存溢出,这种方式是不可取的
public class MainActivity extends AppCompatActivity {
private ImageView imageView;
private File file;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView= (ImageView) findViewById(R.id.imageView);
//将拍好的照片存储在外部路径下
file=new File(Environment.getExternalStorageDirectory(),"text.jpg");
}
public void open(View v){
Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
startActivityForResult(intent,0);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode==RESULT_OK){
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
imageView.setImageBitmap(bitmap);
}
}
}
3.通过二次采样,二次采样的原理如下:
3.1.第一次,先取出图片的宽高,不取它的真实大小,因此bitmap是空的;
3.2.第二次,取出它的大小,并进行压缩处理。
代码:
public class MainActivity extends AppCompatActivity {
private ImageView imageView;
private File file;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView= (ImageView) findViewById(R.id.imageView);
file=new File(Environment.getExternalStorageDirectory(),"text.jpg");
}
public void open(View v){
Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
startActivityForResult(intent,0);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==0&&resultCode==RESULT_OK){
BitmapFactory.Options options = new BitmapFactory.Options();
// 第一次:设为true时,仅仅得到边界,即宽高
options.inJustDecodeBounds=true;
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath(),options);
// 第二次:将options的值设为Config.RGB_565,会比默认的Config.ARGB_8888减少一半内存;
options.inPreferredConfig= Bitmap.Config.RGB_565;
//
将边框缩减到原来宽高的1/100;
options.inSampleSize=Math.max(options.outWidth,options.outHeight)/100;
//
设置为false,表示不仅仅加载边框,
options.inJustDecodeBounds=false;
bitmap=BitmapFactory.decodeFile(file.getAbsolutePath(),options);
Toast.makeText(MainActivity.this, options.outWidth+"X"+options.outHeight, Toast.LENGTH_SHORT).show();
imageView.setImageBitmap(bitmap);
}
}
}
这样,就OK了!