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

本文介绍了一种使用Android系统的BitmapFactory及Options类实现图片缩放的方法,确保图片在不同分辨率屏幕上显示时既清晰又流畅。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


系统提供的相册,图片浏览是如何实现图片缩放的???


关于图片:

通过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);
    }
}                 

         

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值