获取与手机屏幕适中的图片

1、背景

我们使用Camera的应用程序捕捉图像时,如:

Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, REQUESTCODE );

然后在onActivityResult()中获取捕捉的图像:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(RESULT_OK == resultCode){
            Bitmap bitmap = data.getExtras().get("data");
            imageView = (ImageView)this.findViewById(R.id.imageView);
            imageView.setImageBitmap(bitmap);
        }
    }

然后我们会看到一个缩略图;

所以在此思考两个问题:
1、如何返回一个Camera 全尺寸的图像?
2、如何把图像使用屏幕的大小?

2、思路

1、如何返回一个Camera 全尺寸的图像?

android提供了方法获取全尺寸的图像,我们可以通过以下代码实现:
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
imageFile = new File(Environment.getExternalStorageDirectory() + "/picture.jpg");
Uri imageUri = Uri.fromFile(imageFile);
intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, REQUESTCODE );

我们通过给触发Camera应用程序的Intent添加一个附加值,该附加值表示捕获的图像将要保存的位置(以Uri的形式表示);

但我们此时运行程序根据手机不通可能还会出现一个问题?
如果我们的手机的像素太高,可能会耗尽内存!

我们如何解决呢?
BitmapFactory.Options sampleOption = new BitmapFactory.Options();
sampleOption.inSampleSize = 4;
它表示产生一个原来图像的1/4大小的图像;可以有效的解决内存耗尽问题;

2、如何把图像使用屏幕的大小?

虽然我们可以通过设置 sampleOption.inSampleSize = 4;可以解决内存耗尽,但往往我们需要获得适应屏幕大小的图像;
这时我们使用:

sampleOption.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath(), sampleOption);

我们把sampleOption.inJustDecodeBounds设为true,那么BitmapFactory.decodeFile(String path, Options opt)并不会真的返回一个Bitmap给你,它仅仅会把它的宽,高取回来给你,这样就不会占用太多的内存,也就不会那么频繁的发生OOM了。

然后获取屏幕的大小:

Display display = getWindowManager().getDefaultDisplay();
    int mWidth = display.getWidth();
    int mHeight = display.getHeight();

获取显示比率:

int widthRatio = (int) Math.ceil(sampleOption.outWidth/(float)mWidth);
int heightRatio = (int) Math.ceil(sampleOption.outHeight/(float)mHeight);

把显示比率赋给:sampleOption.inSampleSize ,就可以获得适应屏幕大小的图像了;

3、代码

1、布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" 
    android:orientation="vertical"
    >
    <ImageView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/imageView"
        />
</LinearLayout>

2、activity

package com.example.innercamera;

import java.io.File;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.util.DisplayMetrics;
import android.view.Display;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity {

    private ImageView imageView;
    private File imageFile;

    private static final  int REQUESTCODE = 0x100;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        imageFile = new File(Environment.getExternalStorageDirectory() + "/picture.jpg");
        Uri imageUri = Uri.fromFile(imageFile);
        intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageUri);
        startActivityForResult(intent, REQUESTCODE );
    }

    private void initView() {
        imageView = (ImageView) this.findViewById(R.id.imageView);
    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(RESULT_OK == resultCode){
            BitmapFactory.Options sampleOption = new BitmapFactory.Options();
            sampleOption.inJustDecodeBounds = true;
            Bitmap bitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath(), sampleOption);

            Display display = getWindowManager().getDefaultDisplay();
            int mWidth = display.getWidth();
            int mHeight = display.getHeight();

            int widthRatio = (int) Math.ceil(sampleOption.outWidth/(float)mWidth);
            int heightRatio = (int) Math.ceil(sampleOption.outHeight/(float)mHeight);

            if(widthRatio > 1 && heightRatio >1){
                if(widthRatio >= heightRatio){
                    sampleOption.inSampleSize = widthRatio;
                }else if(heightRatio > widthRatio){
                    sampleOption.inSampleSize = heightRatio;
                }
            }
            sampleOption.inJustDecodeBounds = false;
            bitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath(), sampleOption);
            if(bitmap != null){
                imageView.setImageBitmap(bitmap);
                Toast.makeText(this, "! NULL", Toast.LENGTH_LONG).show();
            }
        }
    }
}

4、代码改进

通过Android的MediaStore(媒体内容提供器)来保存图像,获取图像:

package com.example.capturepicture;

import java.io.FileNotFoundException;

import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.Display;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends Activity implements OnClickListener{

    private ImageView imageView;
    private Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        imageView = (ImageView) this.findViewById(R.id.imageView);
        button = (Button) this.findViewById(R.id.button);
        button.setOnClickListener(this);
    }

    private Uri imageUri;
    private static int REQUESTCODE = 0x100;
    @Override
    public void onClick(View v) {
        //1.向MdiaStore.Images中首先插入图片信息;
        /*ContentValues values = new ContentValues(3);
        values.put(Media.DISPLAY_NAME, System.currentTimeMillis()+"");
        values.put(Media.DESCRIPTION, "this is description !");
        values.put(Media.MIME_TYPE, "image/jpeg");*/
        //2.返回出入图片信息的Uri
        imageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new ContentValues() );

        Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        //3.把相机捕捉的图片保存到imageUri所对应的SD卡中
        intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageUri);
        startActivityForResult(intent, REQUESTCODE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(RESULT_OK == resultCode){
            try {
                Options opts = new Options();
                opts.inJustDecodeBounds = true;
                BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri), null, opts);

                Display display = getWindowManager().getDefaultDisplay();
                int mWidth = display.getWidth();
                int mHeight = display.getHeight();

                int widthRatio = (int) Math.ceil(opts.outWidth/(float)mWidth);
                int heightRatio = (int) Math.ceil(opts.outHeight/(float)mHeight);
                if(widthRatio > 1 && heightRatio > 1){
                    if(widthRatio >= heightRatio){
                        opts.inSampleSize = widthRatio;
                    }else{
                        opts.inSampleSize = heightRatio;
                    }
                }else{
                    opts.inSampleSize = 4;
                }
                opts.inJustDecodeBounds = false;
                Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri), null, opts);
                if(null != bitmap){
                    imageView.setImageBitmap(bitmap);
                }
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值