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

    package com.shz.loadimg;
    
    import android.app.Activity;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.BitmapFactory.Options;
    import android.os.Bundle;
    import android.view.View;
    import android.view.WindowManager;
    import android.widget.ImageView;
    
    public class MainActivity extends Activity {
    
        private ImageView img;
        private int winHeight;
        private int winWidth;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            img = (ImageView) findViewById(R.id.img);
            WindowManager manager = (WindowManager) getSystemService(WINDOW_SERVICE);
            //manager.getDefaultDisplay().getSize(outSize);
            winHeight = manager.getDefaultDisplay().getHeight();
            winWidth = manager.getDefaultDisplay().getWidth();
        }
    
        public void load(View view) {
            // 如果图片的高为3000像素,宽为2600像素,每个像素点占4个byte(argb:透明度和颜色值)
            // 则加载到内存的大小是(3000*2600*4)/(1024*1024) ≈ 30M。 
            // 由于Android系统分配给每个应用的堆大小为16M(小于30M),故会出现内存溢出。
            // 所以以下方法肯定不行!
            /*Bitmap bitmap = BitmapFactory.decodeFile("/storage/sdcard/1.jpg");
            img.setImageBitmap(bitmap);*/
            
            String imgPath = "/storage/sdcard/1.jpg";
            Options opts = new Options();
            // 此属性值表示不去解析加载图片到内存,只是获取图片的头部信息(宽高,备注等)
            opts.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(imgPath, opts);
            int imgHeight = opts.outHeight;
            int imgWidth = opts.outWidth;
            
            // 计算缩放比例(取x,y中的最大值)
            int scaleX = imgWidth / winWidth;
            int scaleY = imgHeight / winHeight;
            int scale = 1;
            
            if(scaleX > scaleY & scaleY >= 1)
            {
                scale = scaleX;
            }
            
            if(scaleY > scaleX & scaleX >= 1)
            {
                scale = scaleY;
            }
            
            // 现在去解析图片
            opts.inJustDecodeBounds = false;
            opts.inSampleSize = scale;
            Bitmap bm = BitmapFactory.decodeFile(imgPath, opts);
            img.setImageBitmap(bm);
        }
    }
    View Code
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="com.shz.loadimg.MainActivity"
        tools:ignore="MergeRootFrame" >
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="load"
            android:text="加载图片" />
    
        <ImageView
            android:id="@+id/img"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    
    </LinearLayout>
    View Code
  • 相关阅读:
    JDBC的PreparedStatement是什么?
    Jquery的基本使用方式
    ArrayList,LinkedList,Vector的区别
    数据库连接池的原理。为什么要使用连接池
    .java.util.Date和java.sql.Date有什么区别?
    JDBC的PreparedStatement是什么?
    .Spring Boot 有哪些优点?
    Redis中的常用命令哪些?
    【mybatis-plus】分页、逻辑删除
    MySQL全面瓦解15:视图
  • 原文地址:https://www.cnblogs.com/shaomenghao/p/3950531.html
Copyright © 2011-2022 走看看