您的位置:首页 > 移动开发 > Android开发

Android图片处理

2016-02-17 12:57 459 查看

图片处理

加载大图片

用到的类:BitmapRegionDecoder
1.传入图片:BitmapRegionDecoder.newInstance(inputStream,false)
2.指定显示的区域:
bitmapRegionDecoder.decodeRegion(rect,options);
注意:
第一个参数指定显示的区域,第二个参数可以用BitmapFactory.Options 的inSampleSize,inPreferredConfig等。

加载大图的思路:
1.提供一个设置图片的入口。
2.重写onTouchEvent,在里面根据用户移动的手势,去跟更新显示区域的参数
3.每次更新区域参数后,调用invalidate,onDraw里面去regionDecoder.decodeRegion拿到bitmap,去draw;


图片虚化

图片渲染在Android API17 也就是android4.2以上要用RenderScript, 低于4.2的可以使用Java的原生代码但是效率会低不少


图片加载时候的扫描路径心得:

在扫描图片的时候,使用了一个临时的hashSet保存扫描过的文件夹,这样可以有效的避免重复扫描。比如,我们手机中有个文件夹下面有3000多张图片,如果不判断则会扫描这个文件夹3000多次,处理器时间及内存的消耗还是很客观的。
在适配器中,保存List<String>的时候,考虑只保存图片的名称,路劲单独作为变量传入。一般情况下,图片的路径比图片名长很多,假如有3000张图片,路径长度为30,图片平均长度为10,则list<String>保存完整路径需要长度为:(30+10)*3000=1200000;而单独储存只需要:30+10*3000=30030;图片越多,节省内存越可观。


图片lruCache使用:

算法原理:把最近使用的对象用强引用存储在LinkedHashMap中,并且把最近最少使用的对象在缓存值达到预设定值之前从内存中移除。

当向ImageView中加载一张图片时,首先会在LruCache的缓存中进行检查。如果找到了相应的键值,则会立刻更新ImageView,否则开启一个后台线程来加载这张图片。


diskLruCache用法:

1.DiskLruCache获取:   DiskLruCache.open(directory,appVersion,valueCount,maxSize);
2.存储的一般使用:
String key=generateKey(url);
DiskLruCache.Editor editor = mDiskLruCache.edit(key);
OutputStream os = editor.newOutputStream(0);
3.提交:editor.commit();
4.取出:
DiskLruCache.Snapshot snapShot=mDiskLruCache.get(key);
if(snapShot != null){
InputStream is = snapShot.getInputStream(0);
}
注意:因为每个实体都是文件,所以返回的in或is是个FileInutStream或FileOutputStream


手势旋转图片

关键方法:
matrix.postRotate(rotate,mid.x,mid.y)//旋转
double radians =Math.atan2(delta_y,delta_x);//计算弧度
Math.toDegress(radians);//计算旋转角度


图片裁剪

裁剪主要方法:BitMap.createBitmap(Bitmap source,int x,int y,int width,int height)
@param source 原图
@param x 起始点坐标
@param y 起始坐标点
@param width 每一行的像素点数
@param height 行数


给图片添加云标签

在onTouch(motionEvent event)方法里面获得当前移手移动的距离,然后设置TagView的margin值


图片滤镜处理:

参考博客

android-gpuimage,采用将YUV数据在NDK层转化为RGB数据,由
OpenGL渲染到屏幕中,滤镜算法由Shader实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: