android 获取的图片尺寸比图片属性显示的尺寸大很多

android 获取的图片尺寸比图片属性显示的尺寸大很多,第1张

起因是测试在测试过程中发现需要裁剪的看不到,但是还能继续裁剪。

所以就检查代码,发现了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怎样求等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10064748.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-04
下一篇 2023-05-04

发表评论

登录后才能评论

评论列表(0条)

保存