zoukankan      html  css  js  c++  java
  • Android开发之多媒体编程之加载大分辨率图片

    Android中图片占用内存的大小=图片的总像数*每个像数占用的大小。

    Android保存图片像素信息使用ARGB,意思是每个像素占用4个字节。

    以分辨率为2400*3200的图片来说,加载到Android需要2400*3200*4=30720000字节,需要30000Kb,需要29.30Mb

    直接把这个分辨率的图片加载到内存中,很容易OOM。

    解决方法:把图片的分辨率缩放到手机屏幕的分辨率大小,这样就不会出现OOM

    1.通过getWindowManager().getDefaultDisplay()方法获取到android.view.Display对象

    2.通过android.view.Display对象的getRealSize()方法获取到手机屏幕分辨率的宽高

    3.通过android.graphics.BitmapFactory的decodeFile(String pathName, Options opts)方法加载图片,第一个参数为图片的路径,第二个参数为android.graphics.BitmapFactory.Options对象,通过设置Options对象的参数inJustDecodeBounds = true,可以在不加载图片大小的情况下,获取到图片分辨率的宽高

    4.把图片分辨率的宽和高分辨除以屏幕分辨率的宽和高,得到两个缩放比例,取较大值的缩放比例对图片进行缩放(注意:该缩放比例最好大于1,小于1的话,就不需要缩放了直接加载就可以了)

    5.设置Options对象的参数inSampleSize为缩放比例,inJustDecodeBounds为false,然后使用android.graphics.BitmapFactory的decodeFile(String pathName, Options opts)方法加载图片,获取到以进行缩放的Bitmap的对象(inJustDecodeBounds为true时不会返回Bitmap对象)

    6.处理该Bitmap对象。

     1 import android.app.Activity;
     2 import android.graphics.Bitmap;
     3 import android.graphics.BitmapFactory;
     4 import android.graphics.BitmapFactory.Options;
     5 import android.graphics.Point;
     6 import android.os.Bundle;
     7 import android.view.Display;
     8 import android.view.View;
     9 import android.widget.ImageView;
    10 
    11 public class MainActivity extends Activity {
    12 
    13     @Override
    14     protected void onCreate(Bundle savedInstanceState) {
    15         super.onCreate(savedInstanceState);
    16         setContentView(R.layout.activity_main);
    17     }
    18 
    19     public void click(View v) {
    20         Options opt = new Options();
    21         opt.inJustDecodeBounds = true;
    22         BitmapFactory.decodeFile("sdcard/dog.jpg", opt);
    23         int imageHeight = opt.outHeight;
    24         int imageWidth = opt.outWidth;
    25 
    26         Display display = getWindowManager().getDefaultDisplay();
    27         Point point = new Point();
    28         // 该方法已过时,使用getRealSize()方法替代。也可以使用getSize(),但是不能准确的获取到分辨率
    29         // int screenHeight = display.getHeight();
    30         // int screenWidth = display.getWidth();
    31 
    32         display.getRealSize(point);
    33         int screenHeight = point.y;
    34         int screenWidth = point.x;
    35 
    36         int scale = 1;
    37         int scaleWidth = imageWidth / screenWidth;
    38         int scaleHeigh = imageHeight / screenHeight;
    39         if (scaleWidth >= scaleHeigh && scaleWidth > 1) {
    40             scale = scaleWidth;
    41         } else if (scaleWidth < scaleHeigh && scaleHeigh > 1) {
    42             scale = scaleHeigh;
    43         }
    44 
    45         opt.inSampleSize = scale;
    46         opt.inJustDecodeBounds = false;
    47 
    48         Bitmap bm = BitmapFactory.decodeFile("sdcard/dog.jpg", opt);
    49         ImageView iv = (ImageView) findViewById(R.id.iv);
    50         iv.setImageBitmap(bm);
    51     }
    52 
    53 }
  • 相关阅读:
    查看python中SQLite版本和sqlite3版本
    ubuntu系统安装与卸载
    CentOS下如何使用yum查看安装过的软件包
    【linux】CentOS7 升级sqlite3
    什么是Python的metaclass
    Python
    Python对字典分别按键(key)和值(value)进行排序
    python 用正则表达式去除特殊字符的两种方法
    从思维导图中学习javascript第五章字符串函数
    从思维导图中学习javascript第三章数组
  • 原文地址:https://www.cnblogs.com/liyiran/p/5081648.html
Copyright © 2011-2022 走看看