关于开发Android应用时写从图库选择头像功能时遇到的一些问题。

首先是最基本的调用图库获取图像的代码。我直接贴出来。也是当个笔记吧。事实是我记不下来。。。

先是调用系统图库

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
intent.putExtra("crop", true);
intent.putExtra("return-data", true);
startActivityForResult(intent, 2);

然后是获取选择到得图片的uri

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        if (requestCode == 2) {
            Uri uri = data.getData();
            ContentResolver cr = this.getContentResolver();
            try {
                Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri));
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
}

这样就获取到图片了。But。。现在手机都那么好。随随便便一张照片就十几MB、秒秒钟OOM报错呀。

所以接下来我就改了改代码。

BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true;//指定加载图片方式为只加载头信息
BitmapFactory.decodeStream(cr.openInputStream(uri), null, opts);//将头信息加载到opts中
//3.计算缩放比例
double dx = opts.outWidth/300.0;
double dy = opts.outHeight/300.0;
int scale = 1;
if(dx>dy&&dy>1){
	System.out.println("按照水平方法缩放,缩放比例:"+dx);
	scale = (int)(dx+0.5);
}
if(dy>dx&&dx>1){
	System.out.println("按照垂直方法缩放,缩放比例:"+dy);
	scale = (int)(dy+0.5);
}
//4.缩放加载图片到内存。
opts.inSampleSize = scale;
opts.inJustDecodeBounds = false;//真正的去解析这个位图。
Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri), null, opts);

这段代码主要是利用图片前面都会带有一段信息是图片信息的。第一次加载仅仅是加载头信息。获取到图片的宽高后再根据宽高来设置缩放比例。以避免OOM

But。这有有问题了。这样缩放是等比缩放。然后头像一般都是正方形的。然而我帅气的自拍是长方形的呀。我处女座就不能忍那两边留有的空白了。

于是我默默地弄了两种处理方式:

1.拉伸。。。

就是吧图片拉伸成正方形

int width = bitmap.getWidth();
int height = bitmap.getHeight();
// 计算缩放比例
float scaleWidth = ((float) 300) / width;
float scaleHeight = ((float) 300) / height;
// 取得想要缩放的matrix参数
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
// 得到新的图片
Bitmap bitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);

写好测试后我立马就疯了。这拉伸。哎。不能放在头像功能这。把我帅气的自拍弄得太丑了。简直不能忍,

2.截取部分图片。

int width = bitmap.getWidth();
int height = bitmap.getHeight();
if (width>height){
	Bitmap bitmap = Bitmap.createBitmap(bitmap,(width-height)/2,0,height,height);
}else {
	Bitmap bitmap = Bitmap.createBitmap(bitmap,0,(height-width)/2,width,width);
}

这样就成功从图片中间截取正方形部分出来了。恩。爽多了。其实这个功能可以改改的。让用户自己从图片上选取正方形部分出来。昂。我是想可以这么做的。But。还没这么干。回头写好了再贴出来吧。


PS:以上观点仅仅是作者自己的想法。如果有更好的处理方案什么的。欢迎各位指出。谢谢谢谢谢、

你可能感兴趣的:(Bitmap,Android)