返回顶部
首页 > 资讯 > 移动开发 >Android如何高效显示较大的Bitmaps
  • 141
分享到

Android如何高效显示较大的Bitmaps

Android 2022-06-06 08:06:03 141人浏览 安东尼
摘要

一、高效加载较大的Bitmaps      图片有各种形状和各种大小,在很多情况下,图片的实际大小都比图片在应用中所显示的大小要大的多,

一、高效加载较大的Bitmaps

     图片有各种形状和各种大小,在很多情况下,图片的实际大小都比图片在应用中所显示的大小要大的多,比如Android系统自带的 Gallery  应用显示的照片实际的分辨率通常比手机设备的密度要高很多

     考虑到我们是在开发一款内存使用受限的应用,理想的情况下,我们只是想把一个低分辨率版本的位图载入内存,一般来说这个低分辨率版本的位图要跟UI元件实际需要显示的大小相符。一张高分辨率的图片并不会给我们带来任何明显的好处,但却会占用宝贵的内存资源和产生额外的性能开销

二、获取Bitmap的尺寸大小和类型

     BitmapFactory 类为我们提供了几种decoding方法(decodeByteArray(), decodeFile(),decodeResource(), etc)来从不同的来源创建出 Bitmap ,如何选择最恰当的decode方法取决于你的图片数据来源,这些方法都会去尝试申请内存来构建Bitmap对象,所有很容易就会导致一个OutOfMemory  异常,每种类型的decode方法都有额外的签名来让你通过 BitmapFactory.Options 类来指定decoding选项,当我们decoding的时候把inJustDecodeBounds 属性设置为true 可以避免申请内存,虽然会返回一个null Bitmap对象 ,但是会为我们传入的BitmapFactory.Options  对象设置 outWidth, outHeight and outMimeType 等属性的值,这个技术可以让你在构建Bitmap对象之前事先知道它的大小和类型


BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inJustDecodeBounds = true; 
BitmapFactory.decodeResource(getResources(), R.id.myimage, options); 
int imageHeight = options.outHeight; 
int imageWidth = options.outWidth; 
String imageType = options.outMimeType; 

为了避免java.lang.OutOfMemory  异常,在decoding Bitmap之前你有必要去检测Bitmap的大小和类型,除非你真的是非常清楚你要decoding的Bitmap的大小,还有这个大小要适合当前应用内存环境

三、载入‘缩小版'的Bitmap到内存

     现在我们已经知道了Bitmap的大小,这将有助于我们来决策是载入整张Bitmap还是载入'缩小版'的Bitmap,这里有一些因素需要进行考虑:

1、载入整张图片预计要使用多少内存

2、在考虑到其它方面内存需要的情况下,你想把多少数量的内存给Bitmap使用:

3、用于显示Bitmap的 ImageView 控件或其它UI元件的大小

4、当前设备屏幕的大小和密度    

例如,一点都不值得载入1024x768  像素的图片到内存中,而最终只在128x96 像素大小的 ImageView 控件上显示       

我们应该告诉decoder,图像需要进行抽样,载入一个更小号的Bitmap到内存中,设置 BitmapFactory.Options 对象的 inSampleSize 属性为true 。例如,一张分辨率为2048x1536 像素的图片,如果decode的时候把inSampleSize   设置为4,那么得到的最终图片的大小大约为512x384 ,载入内存耗费0.75M而不是载入整张时的12M (假设位图的配置为 ARGB_8888) ,下面有一个在目标高和宽基础上计算inSampleSize 的方法


public static int calculateInSampleSize( 
   BitmapFactory.Options options, int reqWidth, int reqHeight) { 
 // Raw height and width of image 
 final int height = options.outHeight; 
 final int width = options.outWidth; 
 int inSampleSize = 1; 
 if (height > reqHeight || width > reqWidth) { 
  if (width > height) { 
   inSampleSize = Math.round((float)height / (float)reqHeight); 
  } else { 
   inSampleSize = Math.round((float)width / (float)reqWidth); 
  } 
 } 
 return inSampleSize; 
} 

NOTE :  inSampleSize  值是2的幂的话,对于decoder来说会更快和更高效。然而,如果你想把调整过大小的位图缓存到内存或硬盘上时,依然非常有意义decoding最合适的位图大小,这样有助于节省内存或节省硬盘空间

下面是一个获取位图的方法


public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, 
  int reqWidth, int reqHeight) { 
 // First decode with inJustDecodeBounds=true to check dimensions 
 final BitmapFactory.Options options = new BitmapFactory.Options(); 
 options.inJustDecodeBounds = true; 
 BitmapFactory.decodeResource(res, resId, options); 
 // Calculate inSampleSize 
 options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); 
 // Decode bitmap with inSampleSize set 
 options.inJustDecodeBounds = false; 
 return BitmapFactory.decodeResource(res, resId, options); 
} 

这个方法可以很容易的做到在任意显示尺寸大小的UI元件中去载入一张位图


mImageView.setImageBitmap( 
 decodeSampledBitmapFromResource(getResources(), R.id.myimage, 100, 100)); 

在其他的BitmapFactory.decode*  系列的decode方法中以上获取位图的技术也是需要的。

您可能感兴趣的文章:Android Bitmap详细介绍Android界面 NotificationManager使用Bitmap做图标解析Android开发优化之:对Bitmap的内存优化详解Android Bitmap和Drawable相互转换的简单代码android bitmap compress(图片压缩)代码android保存Bitmap图片到指定文件夹示例android中Bitmap的放大和缩小实例代码Android Activity之间传递图片(Bitmap)的方法android将Bitmap对象保存到SD卡中的方法Android中使用BitmapShader类来制作各种图片的圆角


--结束END--

本文标题: Android如何高效显示较大的Bitmaps

本文链接: https://lsjlt.com/news/25028.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android如何高效显示较大的Bitmaps
    一、高效加载较大的Bitmaps      图片有各种形状和各种大小,在很多情况下,图片的实际大小都比图片在应用中所显示的大小要大的多,...
    99+
    2022-06-06
    Android
  • js如何显示git的差异化比较
    在软件开发中,Git是一个被广泛使用的版本控制系统,它可以使开发者更好地管理代码库,跟踪不同代码版本间的差异,协助团队协作等等。与此同时,JavaScript也是越来越重要的语言,它可以在网页端,移动端和后端开发中都有广泛应用。在实际开发中...
    99+
    2023-10-22
  • 比较完整的android MP3 LRC歌词滚动高亮显示(附源码)
    1.以前的滚动只是安行来刷新,现在不是按行来滚动了,其实就是在一定时间内整体往上移动,比如说在1S内刷新10次,由于认得肉眼看起来像是滚动。 关键代码如下: 代码如下:&nbs...
    99+
    2022-06-06
    mp lrc mp3 高亮 源码 Android
  • Android基于ViewFilpper如何实现文字LED显示效果
    小编给大家分享一下Android基于ViewFilpper如何实现文字LED显示效果,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!具体如下:这里给出来自Android官方API DEMO中动画效果实例。public&nbs...
    99+
    2023-05-30
    android
  • 玩游戏用多大的电脑显示屏比较好
    这篇“玩游戏用多大的电脑显示屏比较好”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“玩游戏用多大的电脑显示屏比较好”文章吧。Q...
    99+
    2023-06-28
  • linux如何显示文件大小
    linux中显示文件大小的方法:1、打开linux终端;2、输入“cd 文件名”命令切换到需要显示文件大小的文件目录;3、最后输入“ls -ll”命令显示文件大小即可。具体操作步骤:在linux系统桌面中使用快捷键【Ctrl+Alt+T】打...
    99+
    2024-04-02
  • 如何解决android Toast重复显示
    Toast是一种简易的消息提示框,它无法获取焦点,按设置的时间来显示完以后会自动消失,一般用于帮助或提示。 先给大家分享下我的解决思路: 不用计算Toast的时间之类的,就是定...
    99+
    2022-06-06
    toast Android
  • android如何获取textview最多显示
    方法一 工作中用的一个方法,虽然不算特别准确,但效果还是不错的,这里分享下。 private float getLineMaxNumber(String t...
    99+
    2024-04-02
  • android图片不显示如何解决
    要解决Android图片不显示的问题,可以尝试以下几种方法:1. 检查图片路径是否正确:确保图片的路径是正确的,包括文件名和文件夹位...
    99+
    2023-09-29
    android
  • Android如何在桌面上不显示
    要在Android桌面上隐藏应用图标,可以按照以下步骤操作:1. 打开应用抽屉:在桌面上找到并点击应用抽屉图标(通常是一个小圆点或方...
    99+
    2023-10-20
    Android
  • Android下拉框如何显示出来
    要在Android应用程序中显示下拉框(Spinner),可以使用Spinner控件。以下是实现的步骤: 在布局文件中添加Spin...
    99+
    2024-03-04
    Android
  • golang如何高效处理大文件
    这篇文章主要介绍了golang如何高效处理大文件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。使用Pandas分块处理大文件问题:今天在处理快手的用户数据时,遇到了一个差不多...
    99+
    2023-06-15
  • win10如何让文件夹显示大小
    要让Windows 10文件夹显示大小,可以按照以下步骤操作:1. 打开文件资源管理器(可以通过在任务栏上的搜索栏中输入“文件资源管...
    99+
    2023-09-01
    win10
  • 如何使用Python VTK高亮显示actor
    前言: VTK,(visualizationtoolkit)是一个开放资源的免费软件系统,主要用于三维计算机图形学、图像处理和可视化。Vtk是在面向对象原理的基础上设计和实现的,它的...
    99+
    2024-04-02
  • win7菜单显示速度如何提高
    这篇文章主要介绍了win7菜单显示速度如何提高的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇win7菜单显示速度如何提高文章都会有所收获,下面我们一起来看看吧。点击开始菜单 → 运行,在打开的运行窗口中输入“ ...
    99+
    2023-06-28
  • Android编程实现大图滚动显示的方法
    本文实例讲述了Android编程实现大图滚动显示的方法。分享给大家供大家参考,具体如下: 问题: 我有一张比较大的图片,比如长宽都是屏幕的两倍大小,我想实现的功能是首先将图片居...
    99+
    2022-06-06
    方法 Android
  • 如何提高大数据量分页的效率
    这篇文章主要讲解了“如何提高大数据量分页的效率”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何提高大数据量分页的效率”吧! ...
    99+
    2024-04-02
  • PHP如何实现高效的大数据计算?
    PHP是一种广泛使用的编程语言,许多大型企业和组织都使用PHP来处理他们的数据。在大数据时代,处理庞大的数据集已成为一种越来越重要的能力。因此,PHP如何实现高效的大数据计算已经成为了一个热门话题。在本文中,我们将讨论如何使用PHP来进行高...
    99+
    2023-09-16
    大数据 numy 并发
  • Linux如何提高大文件的拷贝效率
    这篇文章主要介绍“Linux如何提高大文件的拷贝效率”,在日常操作中,相信很多人在Linux如何提高大文件的拷贝效率问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux如何提高大文件的拷贝效率”的疑惑有所...
    99+
    2023-06-13
  • java编译显示无效的标记如何解决
    当Java编译器显示"无效的标记"错误时,意味着在代码中使用了不被允许的标记,可能是由于以下几个原因导致的:1. 语法错误:可能是在...
    99+
    2023-10-10
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作