zoukankan      html  css  js  c++  java
  • Android 加载大图片到内存

    本文演示android中图片加载到内存

    首先设计界面:

    代码如下:

    <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"
        android:orientation="vertical"
        tools:context=".MainActivity" >
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="load"
            android:text="加载图片到内存" />
    
        <ImageView
            android:id="@+id/iv"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />
    
    </LinearLayout>

    往mnt/sdcard中上传测试图片

    添加逻辑部分代码:

    public class MainActivity extends Activity {
    
        private ImageView iv;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            iv = (ImageView) findViewById(R.id.iv);
    
        }
    
        public void load() {
            Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/a.jpg");
            iv.setImageBitmap(bitmap);
    
        }
    }

    运行代码,产生错误,原因是图片太大(选取的是大照片)

    可以使用BitmapFactory中包含的静态类Options在不解析图片信息的前提下得到图片的宽高信息:

        BitmapFactory.Options opts = new Options();
            // 不去解析图片信息,只是得到图片的头部信息 宽高
            opts.inJustDecodeBounds = true;
    
            BitmapFactory.decodeFile("/sdcard/a.jpg", opts);
            int imageHeight = opts.outHeight;
            int imagewidth = opts.outWidth;
            System.out.println("图片宽:" + imagewidth);
            System.out.println("图片高" + imageHeight);

    运行一下:

    09-04 06:09:10.519: I/System.out(1812): 图片宽:2560
    09-04 06:09:10.519: I/System.out(1812): 图片高1920

    接下来得到手机屏幕的宽高:

            //得到手机屏幕的宽高
            WindowManager wm = (WindowManager)getSystemService(WINDOW_SERVICE);
            int height = wm.getDefaultDisplay().getHeight();
            int width = wm.getDefaultDisplay().getWidth();

    可以看到getHeight与getWidth方法均已过时,使用下面的方法替代:

            // 得到手机屏幕的宽高
            WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
            Point outSize = new Point();
            wm.getDefaultDisplay().getSize(outSize); // 3.0以后的版本才能使用

    完整代码如下:

    package com.wuyudong.loadimage;
    
    import android.os.Bundle;
    import android.annotation.SuppressLint;
    import android.app.Activity;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.BitmapFactory.Options;
    import android.graphics.Point;
    import android.view.Menu;
    import android.view.View;
    import android.view.WindowManager;
    import android.widget.ImageView;
    
    public class MainActivity extends Activity {
    
        private ImageView iv;
        private int windowHeight;
        private int windowWidth;
    
    
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            iv = (ImageView) findViewById(R.id.iv);
    
            // 得到手机屏幕的宽高
            WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
            windowHeight = wm.getDefaultDisplay().getHeight();
            windowWidth = wm.getDefaultDisplay().getWidth();
            
            //Point outSize = new Point();
            //wm.getDefaultDisplay().getSize(outSize); // 3.0以后的版本才能使用
            //windowHeight = outSize.y;
            //windowWidth = outSize.x;
        }
    
        public void load(View view) {
            // Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/a.jpg");
            // iv.setImageBitmap(bitmap);
            // 图片解析的配置
            BitmapFactory.Options opts = new Options();
            // 不去解析图片信息,只是得到图片的头部信息 宽高
            opts.inJustDecodeBounds = true;
    
            BitmapFactory.decodeFile("/sdcard/a.jpg", opts);
            int imageHeight = opts.outHeight;
            int imagewidth = opts.outWidth;
            System.out.println("图片宽:" + imagewidth);
            System.out.println("图片高" + imageHeight);
    
            // 计算缩放比例
            int scaleX = imagewidth / windowWidth;
            int scaleY = imageHeight / windowHeight;
            int scale = 1;
            if (scaleX > scaleY & scaleY >= 1) {
                scale = scaleX;
            }
            if (scaleY > scaleX & scaleX >= 1) {
                scale = scaleY;
            }
            //解析图片
            opts.inJustDecodeBounds = false;
            
            //采样率
            opts.inSampleSize = scale;
            Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/a.jpg", opts);
            iv.setImageBitmap(bitmap);
    
        }
    }
  • 相关阅读:
    杭电2031进制转换
    杭电2033人见人爱A+B
    【转】到底怎么样才叫看书?
    方便单个实体更新的DbContext扩展方法,比如Edit页面
    使用Newtonsoft.Json
    代码配置 vs. 配置文件
    进程到创建
    C#+VBA 操作EXCEL(转)
    基于定位的社交应用Foursquare开源网址(wp7)
    深入理解计算机系统实验
  • 原文地址:https://www.cnblogs.com/wuyudong/p/5839019.html
Copyright © 2011-2022 走看看