Android图片处理

摘要:
当我们添加太多或太大的照片时,Android会报告超级内存错误。遇到这个问题时,我们常常束手无策。图像缓存优化可以帮助我们解决这个问题,但很多时候我们不知道如何优化内存。显然,我是其中之一。这里,我使用压缩和剪切图像的方法来减少图像占用的内存,从而使图像显示平滑。

  相信做Android开发的小伙伴对于Android图片压缩、裁剪一定有很深的印象,今天我将带领大家一起学习一下这个看着高深莫测的知识,以便再以后的学习、工作中可以帮助到大家。

  首先我们看一下这个问题出现的原因,当我们需要在我们的应用中添加大量图片是,程序往往会报出OMM问题,这是什么问题呢?是当我们添加的照片过多或过大时,Android就会报出超内存错误,往往我们遇到这个问题都很无奈,进行图片缓存优化可以帮助我们解决这个问题,但是很多时候我们根本不知道,如何进行内存优化,很明显我就是这样的一位,这里我采用了压缩图片、裁剪图片的方式,减少图片占用的内存,从而使图片展示流畅。

  下面我们先看一下如何进行图片的裁剪:裁剪图片有两种方式,一种调用系统的裁剪方式,这种方式可以方便用户选择自己的裁剪区域,很多关于图片裁剪的视频,讲的就是这一种;第二种是通过后台函数直接进行裁剪,这种方式的好处在于,简化了用户的操作,方便快捷。对于第一种,大家可以百度一下,本篇我们一起来探讨一下如何通过后台函数实现对图片的自动裁剪。

File file = new File(fileString);//文件对象;fileString:文件的地址
InputStream is = null;
try {
    is = new FileInputStream(file);//获得一个文件输入流对象
} catch (FileNotFoundException e) {
    e.printStackTrace();
}
BitmapFactory.Options options = new  BitmapFactory.Options();
options.inJustDecodeBounds =  false;//这个参数一定要设置为false;如果将其设为true的话,在decode时将会返回null,通过此设置可以去查询一个bitmap的属性,比如bitmap的长与宽,而不占用内存大小
double n = file.length()/1024.0;//获得文件的大小
if(n<200){
    options.inSampleSize = 2;//width,hight设为原来的二分一
}else{
    options.inSampleSize = 3;//width,hight设为原来的三分一
}
        Bitmap bitmap =  BitmapFactory.decodeStream(is, null,  options);

  BitmapFactory.decodeStream(is, null, options);根据上面我们设置压缩比,对图片进行压缩处理。

  下面我们一起来谈谈如何进行图片的裁剪,这里我介绍的是自定义裁剪,通过我们设置裁剪起点和裁剪长宽值实现对图片的裁剪。这里我将以实现一个根据图片的长宽,取最短边为边居中裁剪。

int w = options.outWidth;//得到图片的宽
int h = options.outHeight;//得到图片的高

int wh = w > h ? h : w;// 裁切后所取的正方形区域边长

int retX = w > h ? (w - h) / 2 : 0;//基于原图,取正方形左上角x坐标
int retY = w > h ? 0 : (h - w) / 2;//基于原图,取正方形左上角y坐标
        
Bitmap.createBitmap(bitmap, retX, retY, wh, wh, null, false);

  好了关于图片的压缩与裁剪就为大家介绍完了,希望对大家有一些帮助吧。ImageView实现适屏和裁剪图片的功能视频下载:http://pan.baidu.com/s/1mhkM1s8

免责声明:文章转载自《Android图片处理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MongoDB GridFS 存储大文件Django2.0 URL配置详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android框架式编程之BufferKnife

BufferKnife作为框架式编程的重要组成部分,使用BufferKnife能够极大的精简View层面的代码量,并为MVP/MVC方式提供辅助。 一、配置 compile 'com.jakewharton:butterknife:(insert latest version)' annotationProcessor 'com.jakewharton:...

Android开发入门(2)Java 基础

JAva变量 类的外面不能有变量的声明 变量必须先声明,后赋值,然后才能使用 基本数据类型 逻辑型:boolean(true,false) 文本型:char 整数型:btye,short,int,long 浮点型:float,double 引用数据类型: 类,接口,数组 Java各整数类型有固定的表数据范围和字段长度,不受具体操作系统蚊帐呼 Java语言的...

C#开发Android应用实战 读后感

最近两年从事C#网站和项目开发比较多,JAVA项目比较少了,没有经历过手机开发项目的经验。手上也有两部Android、HTC智能手机,喜欢手机客户端上部分软件的功能,自己也想开发一个类似小说阅读器手机端的搜集IT技术文章的手机软件。特申请一本《C#开发Android应用实战》来学习和阅读。年前一月三十一号拿到此书,因为手头还有WCF等技术一直在学习和实践,...

Android深入浅出之 AudioTrack分析

Android深入浅出之Audio 第一部分 AudioTrack分析 一 目的 本文的目的是通过从Audio系统来分析Android的代码,包括Android自定义的那套机制和一些常见类的使用,比如Thread,MemoryBase等。 分析的流程是: l         先从API层对应的某个类开始,用户层先要有一个简单的使用流程。 l        ...

菜鸟水平如何在Android Studio中添加uiautomator测试框架

1、启动AS,弹出创建Android Studio项目 2、选择 "Start a new Android Studio project",输入 application name 、company domain、project location,之后点击 Next进行下一步 3、根据所开发的产品进行选择,比如我是进行Android自动化,所以就选择Ph...

Android ROM开发ubuntu下编译CyanogenMod生成SDK

由于CM2.3.7存在某些问题,所以如果需要使用稳定版本的CyanogenMod 2.3.4编译并且相应的vendor文件的话,可以到我的网盘中下载。 vendor下载地址:http://115.com/file/dpi59mxv 在开发定制ROM的时候经常会在源码中添加自定义的SDK,比如小米的MIUI里很多添加进来的功能在编码的时候都是使用自定义的方法...