您的位置:首页 > 其它

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

2016-08-20 17:40 323 查看

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();
}
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  手机 应用 图片
相关文章推荐