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);
}
}
关于图片:
通过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);
}
}
相关文章推荐
- Android XML和JSON数据的处理
- ImageView的Scaletype决定了图片在View上显示时的样子,如进行何种比例的缩放,及显示图片的整体还是部分,等等。 设置的方式包括: 1. 在layout xml中定义Android:s
- android 从网络上获取数据(图片,网页,xml,json等)
- Android访问网络系列之--服务端返回XML或JSON格式数据,Android 进行解析并显示
- Android访问网络:服务端返回XML或JSON格式数据,Android 进行解析并使用ListView显示
- 【android初级】之Android之从网络上获取数据(图片,网页,xml,json等)
- Android访问网络系列之--服务端返回XML或JSON格式数据,Android 进行解析并显示
- Android - 获取网络数据,Bitmap,ANR,主线程模型,消息机制,UserAgent,乱码问题,xml生成与解析,JSON解析,MVC,SmartImageView
- [转]Android ListView最佳处理方式,ListView拖动防重复数据显示,单击响应子控件
- Android的TextView/EditText使用CharacterStyle&SpannableString来处理图片显示、字体样式、超链接等
- Android的TextView使用Html来处理图片显示、字体样式、超链接等
- ajax处理数据(html,xml,json)
- Android上传图片到服务器并显示(后台用Java处理)
- Android利用Volley异步加载数据(JSON和图片)完整示例
- Android开发 Lollipop通知栏图片显示异常的原因及处理
- Android下网络请求数据,返回数据显示不全,解析json no value for xxx
- Android ImageView,布局或控件显示网络图片教程
- android使用json数据格式同时上传图片和文本
- 对于json数据中的图片处理和图片缓存
- Android利用Volley异步加载数据(JSON和图片)完整示例