起因是测试在测试过程中发现需要裁剪的看不到,但是还能继续裁剪。
所以就检查代码,发现了bitmap的width和Height有3000多。
然后试了下把改成300300的就显示正常,
所以我们需要让根据大小不同,机器不同而改变的宽高
//设置分辨率
//1获取系统分辨率
Resources resources = thisgetResources();
DisplayMetrics dm = resourcesgetDisplayMetrics();
//2获取分辨率
BitmapFactoryOptions options = new BitmapFactoryOptions();
optionsinJustDecodeBounds = true;// 这个方式不会在内存创建一张,
Bitmap bitmap = BitmapFactorydecodeFile(filePath, options); //此时返回的bitmap为null,但是option会保留一部分参数
//3确定分辨率
int height = optionsoutHeight;
int width = optionsoutWidth;
if(optionsoutHeight>dmheightPixels15f){//当大小比屏幕大15倍的时候,直接以系统高度为高度
height = dmheightPixels;
}
if (optionsoutWidth>dmwidthPixels15f){
width = dmwidthPixels;
}
optionsinJustDecodeBounds = false;
用到的不仅仅包括png、gif、9png、jpg和各种Drawable系对象,还包括位图Bitmap
的处理也经常是影响着一个程序的高效性和健壮性。
为什么不直接用Bitmap传输?
位图文件虽好,但是非压缩格式,占用较大存储空间。
Bitmap主要方法有:获取图像宽高、释放,判断是否已释放和是否可修改,压缩、创建制定位图等功能
用于从不同的数据源(如文件、输入流、资源文件、字节数组、文件描述符等)解析、创建Bitmap对象
允许我们定义以何种方式如何读到内存。
推荐阅读: Android - Bitmap-内存分析
注意事项:
decodeFileDescriptor比decodeFile高效
查看源码可以知道
替换成
建议采用decodeStream代替decodeResource。
因为BitmapFactorydecodeResource 加载的可能会经过缩放,该缩放目前是放在 java 层做的,效率比较低,而且需要消耗 java 层的内存。因此,如果大量使用该接口加载,容易导致OOM错误,BitmapFactorydecodeStream 不会对所加载的进行缩放,相比之下占用内存少,效率更高。
这两个接口各有用处,如果对性能要求较高,则应该使用 decodeStream;如果对性能要求不高,且需要 Android 自带的自适应缩放功能,则可以使用 decodeResource。
推荐阅读:[ BitmapFactorydecodeResource加载缩小的原因及解决方法
canvas和Matrix可对Bitmap进行旋转、放缩、平移、切错等 *** 作
可以用BitmaponCreateBitmap、Canvas的clipRect和clipPath等等方式
推荐阅读: android自定义View学习4--图像剪切与变换
对初始化Bitmap对象过程中可能发生的OutOfMemory异常进行了捕获。如果发生了OutOfMemory异常,应用不会崩溃,而是得到了一个默认的Bitmap图。
如果不进行缓存,尽管看到的是同一张文件,但是使用BitmapFactory类的方法来实例化出来的Bitmap,是不同的Bitmap对象。缓存可以避免新建多个Bitmap对象,避免内存的浪费。
如果像素过大,使用BitmapFactory类的方法实例化Bitmap的过程中,需要大于8M的内存空间,就必定会发生OutOfMemory异常。
可以将缩小,以减少载入过程中的内存的使用,避免异常发生。
推荐阅读:
Bitmap详解与Bitmap的内存优化
public static Bitmap getBitmapByBytes(byte[] bytes){
//对于的二次采样,主要得到的宽与高
int width = 0;
int height = 0;
int sampleSize = 1; //默认缩放为1
BitmapFactoryOptions options = new BitmapFactoryOptions();
optionsinJustDecodeBounds = true; //仅仅解码边缘区域
//如果指定了inJustDecodeBounds,decodeByteArray将返回为空
BitmapFactorydecodeByteArray(bytes, 0, byteslength, options);
//得到宽与高
height = optionsoutHeight;
width = optionsoutWidth;
//实际的宽与高,根据默认最大大小值,得到实际的缩放比例
while ((height / sampleSize > CacheIMAGE_MAX_HEIGHT)
|| (width / sampleSize > CacheIMAGE_MAX_WIDTH)) {
sampleSize = 2;
}
//不再只加载实际边缘
optionsinJustDecodeBounds = false;
//并且制定缩放比例
optionsinSampleSize = sampleSize;
return BitmapFactorydecodeByteArray(bytes, 0, byteslength, options);
}
RuntimegetRuntime()maxMemory() ; 进程可用总的内存大小
RuntimegetRuntime()totalMemory() ; 进程已用的内存大小
totalMemory超过maxMemory时就会包报out of memory错误。
可以手动new byte[102410241];申请1M内存,再打印看看这两个值。
本周给大家分享如何获取视频的每一帧的信息,说到这个那就得看我们的谷歌官方给我们的提供的api接口类:MediaMetadataRetriever,这个类是提供给我们用来获取视频信息的,
官方文档:
>
在ImageView中的image,可以使用getWidth()和getHeight()来获取宽度和高度,但是获得的image宽度和高度不是很精确的;对于背景,你首先要获取背景的Drawable对象,然后将Drawable对象转换为BitmapDrawable,这样你就可以将背景作为Bitmap对象并获取其宽度和高度了。代码如下:Bitmap b = ((BitmapDrawble)imageViewgetBackground())getBitmap(); int w = bgetWidth(); int h = bgetHeight(); or do like this wayimageViewsetDrawingCacheEnabled(true); Bitmap b = imageViewgetDrawingCache(); int w = bgetWidth(); int h = bgetHeight(); 或者也可以像下面这样:imageViewsetDrawingCacheEnabled(true); Bitmap b = imageViewgetDrawingCache(); int w = bgetWidth(); int h = bgetHeight(); 上面的代码仅仅可以为你获取当前ImageView的大小:imageViewgetWidth(); imageViewgetHeight(); 如果你要获取Drawable image对象的大小,可用如下代码:Drawable d = getResources()getDrawable(Rdrawableyourimage); int h = dgetIntrinsicHeight(); int w = dgetIntrinsicWidth();
1、inJustDecodeBounds:
如果将这个值置为true,那么在解码的时候将不会返回bitmap,只会返回这个bitmap的尺寸。这个属性的目的是,如果你只想知道一个bitmap的尺寸,但又不想将其加载到内存时。这是一个非常有用的属性。
2、inSampleSize:
这个值是一个int,当它小于1的时候,将会被当做1处理,如果大于1,那么就会按照比例(1 / inSampleSize)缩小bitmap的宽和高、降低分辨率,大于1时这个值将会被处置为2的倍数。例如,width=100,height=100,inSampleSize=2,那么就会将bitmap处理为,width=50,height=50,宽高降为1 / 2,像素数降为1 / 4。
3、inPreferredConfig:
这个值是设置色彩模式,默认值是ARGB_8888,在这个模式下,一个像素点占用4bytes空间,一般对透明度不做要求的话,一般采用RGB_565模式,这个模式下一个像素点占用2bytes。
4、inPremultiplied:
这个值和透明度通道有关,默认值是true,如果设置为true,则返回的bitmap的颜色通道上会预先附加上透明度通道。
5、inDither:
这个值和抖动解码有关,默认值为false,表示不采用抖动解码。
6、nDensity:
表示这个bitmap的像素密度(对应的是DisplayMetrics中的densityDpi,不是density)。
7、inTargetDensity:
表示要被画出来时的目标像素密度(对应的是DisplayMetrics中的densityDpi,不是density)。
8、inScreenDensity:
表示实际设备的像素密度(对应的是DisplayMetrics中的densityDpi,不是density)。
9、inScaled:
设置这个Bitmap是否可以被缩放,默认值是true,表示可以被缩放。
10、inPurgeable和inInputShareable:
这两个值一般是一起使用,设置为true时,前者表示空间不够是否可以被释放,后者表示是否可以共享引用。这两个值在Android50后被弃用。
11、inPreferQualityOverSpeed:
这个值表示是否在解码时有更高的品质,仅用于JPEG格式。如果设置为true,则会有更高的品质,但是会解码速度会很慢。
12、outWidth和outHeight:
表示这个Bitmap的宽和高,一般和inJustDecodeBounds一起使用来获得Bitmap的宽高,但是不加载到内存。
13、inbitMap
如果这个值被设置了true,则可以被复用
Bitmap的加载方式:
1BitmapFactorydecodeBetyArray();//字节数组
2BitmapFactorydecodeFile();//文件路径
3BitmapFactorydecodeResource();//资源ID
4BitmapFactorydecodeStream();//流
BitmapFactoryOptions的作用:
1防止内存溢出;
2节省内存开销;
3系统更流畅;
以上就是关于android 获取的图片尺寸比图片属性显示的尺寸大很多全部的内容,包括:android 获取的图片尺寸比图片属性显示的尺寸大很多、Bitmap使用详解、android bitmap的samplesize怎样求等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)