您的位置:首页 > 移动开发 > Android开发

Android下的图片显示与处理_android数据(XML、JSON、image)

2012-09-20 13:52 453 查看
系统提供的相册,图片浏览是如何实现图片缩放的???

关于图片:

通过BitmapFactory decodeStream(is); 可以返回一个Bitmap对象,该对象可以设置到ImageView上;

但是BitmapFactory 对InputStream进行解码,是有熟性设置的,BitmapFactory.Options;

BitmapFactory.Options.inJustDecodeBounds(true/false); 是否只对文件头进行解码。

BitmapFactory.Options.outWidth; 原图片的宽;

BitmapFactory.Options.outHeight; 原图片的高;

BitmapFactory.Options.inSampleSize;原图是位图的多少倍; 如果值为4,那么会返回 BitmapFactory.Options.outWidth的1/4;

缩放比例:

BitmapFactory.Options.inSampleSize的值其实就是缩放比例;

如何确定缩放比例?结合屏幕宽高来计算;

关于屏幕:

通过WindowManager可以获取Display; Activity.getWindowManager(),WindowManager.getDefaultDisplay();

通过Display可以获取显示屏的Width and Height;

Display.getWith();

Display.getHeight();

获取位图:

int scaley = bitmapHeight / windowHeight;

int scalex = bitmapWidth / windowWidth;

if(scalex>scaley&&scaley>1){

opts.inSampleSize = scalex;

}

if(scaley>scalex&&scalex>1){

opts.inSampleSize = scaley;

}

opts.inJustDecodeBounds = false;// 由于已经得到了缩放比例 ,让位图工厂真正的解析这个位图

// 由于前面 我们已经解析了这个输入流, 需要重新初始化这个输入流

is = getContentResolver().openInputStream(uri);

Bitmap bitmap = BitmapFactory.decodeStream(is);

小结:

1.设备相关

WindowManager

getDefaultDisplay()

Display

getWith()

getHeight()

2.文件相关

BitmapFactory

decodeStream(InputStream);

BitmapFactory.Options

inJustDecodeBounds;

outWidth;

outHeight;

inSampleSize;

3.IO相关

ContentResolver

InputStream ContentResolver.openInputStream(Uri uri);

OutputStream ContentResolver.openOutputStream(Uri uri)

code:

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStream;

import android.app.Activity;

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.view.Display;

import android.view.View;

import android.view.WindowManager;

import android.widget.ImageView;

public class LoadImageActivity extends Activity {

private ImageView iv;

private WindowManager wm;

private Display display;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

iv = (ImageView) findViewById(R.id.iv);

wm = getWindowManager();

//获取手机的屏幕宽高

display = wm.getDefaultDisplay();

}

public void selectImage(View view) {

Intent intent = new Intent();

intent.setAction("android.intent.action.PICK");

intent.addCategory("android.intent.category.DEFAULT");

intent.setType("image/*");

startActivityForResult(intent, 0);

}

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

try {

if (data != null) {

// 得到点击图片的uri

Uri uri = data.getData();

//对 要加载的图片进行缩放

//1.得到图片的宽度和高度.

//由于我们只想得到图片的宽度和高度,这个时候 只需要解析图片的头信息

BitmapFactory.Options opts = new Options();

opts.inJustDecodeBounds = true;//让 bimapfactory假的解析这个位图,只获取位图的边框信息

InputStream is = getContentResolver().openInputStream(uri);

BitmapFactory.decodeStream(is);

int bitmapHeight = opts.outHeight;

int bitmapWidth = opts.outWidth;

int windowHeight = display.getHeight();

int windowWidth = display.getWidth();

//获取水平和垂直方向的缩放比

int scaley = bitmapHeight / windowHeight;

int scalex = bitmapWidth / windowWidth;

if(scalex>scaley&&scaley>1){

opts.inSampleSize = scalex;

}

if(scaley>scalex&&scalex>1){

opts.inSampleSize = scaley;

}

opts.inJustDecodeBounds = false;// 由于已经得到了缩放比例 ,让位图工厂真正的解析这个位图

// 由于前面 我们已经解析了这个输入流, 需要重新初始化这个输入流

is = getContentResolver().openInputStream(uri);

Bitmap bitmap = BitmapFactory.decodeStream(is);

iv.setImageBitmap(bitmap);

}

} catch (Exception e) {

e.printStackTrace();

}

super.onActivityResult(requestCode, resultCode, data);

}

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