首页
技术博客
PHP教程
数据库技术
前端开发
HTML5
Nginx
php论坛
新用户注册
|
会员登录
PHP教程
技术博客
编程问答
PNG素材
编程语言
前端技术
Android
PHP教程
HTML5教程
数据库
Linux技术
Nginx技术
PHP安全
WebSerer
职场攻略
JavaScript
开放平台
业界资讯
大话程序猿
登录
极速注册
取消
热门标签 | HotTags
future
uml
header
javascript
regex
cpython
audio
range
post
export
typescript
chat
function
vba
c语言
cookie
jar
dockerfile
select
python2
expression
hashtable
timestamp
bit
email
shell
io
loops
python3
format
default
integer
php7
main
rsa
text
subset
string
const
bash
jsp
bytecode
metadata
php
controller
split
timezone
cmd
keyword
config
js
foreach
client
utf-8
httprequest
instance
hash
md5
dll
blob
window
list
hashset
buffer
ip
frameworks
tags
vbscript
erlang
web
case
import
heatmap
nodejs
eval
httpclient
express
actionscrip
golang
当前位置:
开发笔记
>
编程语言
> 正文
Bitmap优化,尽量避免内存溢出
作者:手机用户2702932800 | 来源:互联网 | 2022-12-25 13:47
Bitmap优化一个进程的内存可以由2个部分组成:native和dalvik,dalvik就是我们平常说的java堆,我们创建的对象是在这里面分配的,而bitmap是直接在native上分配的。一旦
Bitmap优化
一个进程的内存可以由2个部分组成:native和dalvik,dalvik就是我们平常说的java堆,我们创建的对象是在这里面分配的,而bitmap是直接在native上分配的。 一旦内存分配给Java后,以后这块内存即使释放后,也只能给Java的使用,所以如果Java突然占用了一个大块内存,即使很快释放了,C能用的内存也是16M减去Java最大占用的内存数。而Bitmap的生成是通过malloc进行内存分配的,占用的是C的内存,这个也就说明了,上述的4MBitmap无法生成的原因,因为在13M被Java用过后,剩下C能用的只有3M了。
在Android应用里,最耗费内存的就是图片资源。而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常。
及时回收Bitmap的内存
[java]
view plaincopy
// 先判断是否已经回收
if
(bitmap !=
null
&& !bitmap.isRecycled()){
// 回收并且置为null
bitmap.recycle();
bitmap =
null
;
}
System.gc();
捕获异常 在实例化Bitmap的代码中,一定要对OutOfMemory异常进行捕获。下面对初始化Bitmap对象过程中可能发生的OutOfMemory异常进行了捕获。如果发生了异常,应用不会崩溃,而是得到了一个默认的图片
[java]
view plaincopy
Bitmap bitmap =
null
;
try
{
// 实例化Bitmap
bitmap = BitmapFactory.decodeFile(path);
}
catch
(OutOfMemoryError e) {
//
}
if
(bitmap ==
null
) {
// 如果实例化失败 返回默认的Bitmap对象
returndefaultBitmapMap;
}
缓存通用的Bitmap对象
压缩图片 如果图片像素过大可以将图片缩小,以减少载入图片过程中的内存的使用,避免异常发生。 使用BitmapFactory.Options.inSampleSize就可以缩小图片。属性值inSampleSize表示缩略图大小为原始图片大小的几分之一。即如果这个值为2,则取出的缩略图的宽和高都是原始图片的1/2,图片的大小就为原始大小的1/4。 如果知道图片的像素过大,就可以对其进行缩小。那么如何才知道图片过大呢? 使用BitmapFactory.Options设置inJustDecodeBounds为true后,并不会真正的分配空间,即解码出来的Bitmap为null,但是可计算出原始图片的宽度和高度,即options.outWidth和options.outHeight。通过这两个值,就可以知道图片是否过大了 。
[java]
view plaincopy
BitmapFactory.Options opts = newBitmapFactory.Options();
// 设置inJustDecodeBounds为true
opts.inJustDecodeBounds =
true
;
// 使用decodeFile方法得到图片的宽和高
BitmapFactory.decodeFile(path, opts);
// 打印出图片的宽和高
Log.d(
"example"
, opts.outWidth +
","
+ opts.outHeight);
在实际项目中,可以利用上面的代码,先获取图片真实的宽度和高度,然后判断是否需要跑缩小。如果不需要缩小,设置inSampleSize的值为1。如果需要缩小,则动态计算并设置inSampleSize的值,对图片进行缩小。需要注意的是,在下次使用BitmapFactory的decodeFile()等方法实例化Bitmap对象前,别忘记将opts.inJustDecodeBound设置回false。否则获取的bitmap对象还是null。
以从Gallery获取一个图片为例讲解缩放:
[java]
view plaincopy
publicclass MainActivity extendsActivity {
privateImageView iv;
privateWindowManager wm;
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
wm = getWindowManager();
iv = (ImageView) findViewById(R.id.iv);
}
// 从系统的图库里面 获取一张照片
publicvoid click(View view) {
Intent intent = newIntent();
intent.setAction(
"android.intent.action.PICK"
);
intent.addCategory(
"android.intent.category.DEFAULT"
);
intent.setType(
"image/*"
);
startActivityForResult(intent,
0
);
}
@Override
protectedvoid onActivityResult(intrequestCode, intresultCode, Intent data) {
if
(data !=
null
) {
// 获取到系统图库返回回来图片的uri
Uri uri = data.getData();
System.out.println(uri.toString());
try
{
InputStream is = getContentResolver().openInputStream(uri);
// 1.计算出来屏幕的宽高.
intwindowWidth = wm.getDefaultDisplay().getWidth();
intwindowHeight = wm.getDefaultDisplay().getHeight();
//2. 计算图片的宽高.
// 2.计算出来图片的宽高.
BitmapFactory.Options opts = newOptions();
// 设置 不去真正的解析位图 不把他加载到内存 只是获取这个图片的宽高信息
opts.inJustDecodeBounds =
true
;
BitmapFactory.decodeStream(is,
null
, opts);
intbitmapHeight = opts.outHeight;
intbitmapWidth = opts.outWidth;
if
(bitmapHeight > windowHeight || bitmapWidth > windowWidth) {
intscaleX = bitmapWidth/windowWidth;
intscaleY = bitmapHeight/windowHeight;
if
(scaleX>scaleY){
//按照水平方向的比例缩放
opts.inSampleSize = scaleX;
}
else
{
//按照竖直方向的比例缩放
opts.inSampleSize = scaleY;
}
}
else
{
//如果图片比手机屏幕小 不去缩放了.
opts.inSampleSize =
1
;
}
//让位图工厂真正的去解析图片
opts.inJustDecodeBounds =
false
;
//注意: 流的操作
is = getContentResolver().openInputStream(uri);
Bitmap bitmap = BitmapFactory.decodeStream(is,
null
, opts);
iv.setImageBitmap(bitmap);
}
catch
(Exception e) {
e.printStackTrace();
}
}
super
.onActivityResult(requestCode, resultCode, data);
}
}
更多内容:https://github.com/CharonChui/AndroidNote
bitmap
bit
native
java
android
图片
view
copy
default
写下你的评论吧 !
吐个槽吧,看都看了
会员登录
|
用户注册
推荐阅读
io
Android开发笔记:使用Picasso加载网络图片等比例缩放
在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ...
[详细]
蜡笔小新 2023-12-14 17:34:00
io
android listview OnItemClickListener失效原因
最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ...
[详细]
蜡笔小新 2023-12-14 14:25:50
io
OC学习笔记之@property和@synthesize
本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ...
[详细]
蜡笔小新 2023-12-14 12:05:06
io
自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ...
[详细]
蜡笔小新 2023-12-13 14:41:31
io
Android自定义控件绘图篇之Paint函数大汇总
本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ...
[详细]
蜡笔小新 2023-12-10 23:11:57
io
Java太阳系小游戏分析和源码详解
本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ...
[详细]
蜡笔小新 2023-12-14 19:53:34
io
kotlin动画实现上下移动、放大缩小、旋转功能
本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ...
[详细]
蜡笔小新 2023-12-14 17:29:08
io
Java高并发程序设计学习-线程安全的概念与synchronized
本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ...
[详细]
蜡笔小新 2023-12-13 15:43:03
io
Linux环境变量函数getenv、putenv、setenv和unsetenv详解
本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ...
[详细]
蜡笔小新 2023-12-13 12:01:03
io
org.apache.catalina.LifecycleEvent类的使用及代码示例
标题: ...
[详细]
蜡笔小新 2023-12-13 11:03:10
io
Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ...
[详细]
蜡笔小新 2023-12-12 17:57:15
io
Python爬虫技术基础篇面向对象高级编程(中)的多重继承
本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ...
[详细]
蜡笔小新 2023-12-12 16:19:02
format
MFC动态创建窗口的实现方法及注意事项
本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ...
[详细]
蜡笔小新 2023-12-11 15:09:27
io
利用RxJava实现的事件总线(Event Bus)及其使用方法介绍
本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ...
[详细]
蜡笔小新 2023-12-11 12:16:40
io
Java中的Currency getInstance()方法详解及示例
本文介绍了Java中Currency类的getInstance()方法,该方法用于检索给定货币代码的该货币的实例。文章详细解释了方法的语法、参数、返回值和异常,并提供了一个示例程序来说明该方法的工作原理。 ...
[详细]
蜡笔小新 2023-12-11 09:30:59
手机用户2702932800
这个家伙很懒,什么也没留下!
Tags | 热门标签
future
uml
header
javascript
regex
cpython
audio
range
post
export
typescript
chat
function
vba
c语言
cookie
jar
dockerfile
select
python2
expression
hashtable
timestamp
bit
email
shell
io
loops
python3
format
RankList | 热门文章
1
Linux中xmind8 pro 破解(内附序列号,亲测有效)
2
Spring使用三级缓存解决循环依赖的问题_java
3
半结构化数据
4
Chrome F12/ Ctrl +Shift+P/>Capture full size screenshot
5
SqlCommandBuilder 可批量新增与修改数据
6
*AMP里的PHP和Mac OS自带的PHP有什么关系吗?
7
世界顶尖的 Python 数据科学课程,足不出户在家学!
8
java线性数组集合_Java集合类快速了解
9
牛客寒假算法集训营(4)
10
资深程序员总结出完美Python爬虫基础,爬虫入门必备
11
微信计步器怎么不计步_微信春节新功能:如何定制企业专属的微信红包封面?...
12
SpringBoot定时任务(SpringSchedule)实现方法
13
检索COML类工厂中 CLSID为 {0002450000000000C000000000000046}的组件时失败,原因是出现以下错误: 80070005 《终结篇》...
14
如何重新排序表格中的嵌套字段?
15
神经网络编程是什么,神经网络程序代码
PHP1.CN | 中国最专业的PHP中文社区 |
DevBox开发工具箱
|
json解析格式化
|
PHP资讯
|
PHP教程
|
数据库技术
|
服务器技术
|
前端开发技术
|
PHP框架
|
开发工具
|
在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved |
京公网安备 11010802041100号
|
京ICP备19059560号-4
| PHP1.CN 第一PHP社区 版权所有