获取与手机屏幕适中的图片
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();
}
}
}
}
相关文章推荐
- 模仿豌豆荚以及某些刷机软件获取手机屏幕图片
- Android 获取屏幕尺寸与密度 遇到一个问题,我的地图浮标图片在WVGA手机上正好,在QVGA上就显的太大,所以我要根据屏幕的不同调整浮标的大小使其在QVGA大小合适。有的同事提出了依据
- 获取手机屏幕大小和图片自动适应大小
- 获取android 手机屏幕的大小以及动态设置背景图片的两种方法;
- 根据手机屏幕的密度获取drawable对应目录下的图片
- 【Android】获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图片、应用名、包名等) 收藏
- 【Android】获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图片、应用名、包名等) 收藏
- 获取Android手机上的图片和视频缩略图
- 获取手机屏幕大小的两种方法
- 获取手机屏幕分辨率
- Android中获取网络图片的方法(如果手机缓存里面有就从缓存获取)
- 【Android】获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图片、应用名、包名等) 收藏
- C# 获取当前屏幕的图片
- Android杂谈---获取手机屏幕大小
- Android中获取网络图片的方法(如果手机缓存里面有就从缓存获取)
- Android中如何获取手机屏幕大小
- Android中如何获取手机屏幕大小
- Qt 获取手机屏幕大小
- 获取手机屏幕分辨率
- 【Android】获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图片、应用名、包名等