Android -- 加载大图片的方法

简介:

在android中要加载一张大图片到内存中如果通过如下方式进行:

Bitmap bitmap= BitmapFactory.decodeFile("/sdcard/a.jpg");
iv.setImageBitmap(bitmap);

则会抛出内存溢出异常Caused by: java.lang.OutOfMemoryError

正确的做法应该是这样的:

复制代码
public class MainActivity extends Activity {
    private ImageView iv;
    private int windowHeight;
    private int windowWidth;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv = (ImageView) findViewById(R.id.iv);
        WindowManager win = (WindowManager) getSystemService(WINDOW_SERVICE);
        windowHeight = win.getDefaultDisplay().getHeight();
        windowWidth = win.getDefaultDisplay().getWidth();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    public void load(View view) {
        
    /*     Bitmap bitmap= BitmapFactory.decodeFile("/sdcard/a.jpg");
         iv.setImageBitmap(bitmap);*/
         
        // 图片解析的配置
        BitmapFactory.Options options = new Options();
        // 不去真的解析图片,只是获取图片的头部信息宽,高
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile("/sdcard/a.jpg", options);
        int imageHeight = options.outHeight;
        int imageWidth = options.outWidth;
        // 计算缩放比例
        int scaleX = imageWidth / windowWidth;
        int scaleY = imageHeight / windowHeight;
        int scale = 1;
        if (scaleX > scaleY & scaleY >= 1) {
            scale = scaleX;

        }else if (scaleY > scaleX & scaleX >= 1) {
            scale = scaleY;

        }
        //真的解析图片
        options.inJustDecodeBounds=false;
        //设置采样率
        options.inSampleSize=scale;
        Bitmap bitmap=BitmapFactory.decodeFile("/sdcard/a.jpg", options);
        iv.setImageBitmap(bitmap);
    }

}
复制代码

在这种情况下,是将大分辨率的图片按照一定的比例缩小然后加载进内存,就不会出现内存溢出的现象了。

 




本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/3744876.html,如需转载请自行联系原作者

目录
打赏
0
0
0
0
46
分享
相关文章
基于Android P,自定义Android开机动画的方法
本文详细介绍了基于Android P系统自定义开机动画的步骤,包括动画文件结构、脚本编写、ZIP打包方法以及如何将自定义动画集成到AOSP源码中。
194 2
基于Android P,自定义Android开机动画的方法
基于android-11.0.0_r39,系统应用的手动签名方法和过程
本文介绍了基于Android 11.0.0_r39版本进行系统应用手动签名的方法和解决签名过程中遇到的错误,包括处理`no conscrypt_openjdk_jni-linux-x86_64`和`RegisterNatives failed`的问题。
364 2
|
6月前
|
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
184 15
Android 系统缓存扫描与清理方法分析
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
113 20
Android经典面试题之图片Bitmap怎么做优化
Android 中加载 Gif 动画
【10月更文挑战第20天】加载 Gif 动画是 Android 开发中的一项重要技能。通过使用第三方库或自定义实现,可以方便地在应用中展示生动的 Gif 动画。在实际应用中,需要根据具体情况进行合理选择和优化,以确保用户体验和性能的平衡。可以通过不断的实践和探索,进一步掌握在 Android 中加载 Gif 动画的技巧和方法,为开发高质量的 Android 应用提供支持。
Android经典面试题之组件化原理、优缺点、实现方法?
本文介绍了组件化在Android开发中的应用,详细阐述了其原理、优缺点及实现方式,包括模块化、接口编程、依赖注入、路由机制等内容,并提供了具体代码示例。
114 2
Android在rootdir根目录创建自定义目录和挂载点的方法
本文介绍了在Android高通平台的根目录下创建自定义目录和挂载点的方法,通过修改Android.mk文件并使用`LOCAL_POST_INSTALL_CMD`变量在编译过程中添加目录,最终在ramdisk.img的系统根路径下成功创建了`/factory/bin`目录。
394 1
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
本文分享了下载AOSP源码的方法,包括如何使用repo工具和处理常见的repo sync错误,以及配置Python环境以确保顺利同步特定版本的AOSP代码。
1161 0
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
Android项目架构设计问题之onFirstItemVisibleChanged方法的调用如何解决
Android项目架构设计问题之onFirstItemVisibleChanged方法的调用如何解决
62 0
Android项目架构设计问题之使用反射调用类的私有方法如何解决
Android项目架构设计问题之使用反射调用类的私有方法如何解决
118 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等