Android照片处理——涂鸦和拼图实现
2015-01-07 15:01
162 查看
先看效果图:
技术回顾:这个里面的涂鸦是网上的一个相关帖子,我只修改了里面的涂鸦界面背景,增加了拍照获取和裁剪照片等,主要实现的是拼图,拼图首先要获取系统的相册并展示出来,用BaseAdapter从SD卡中读取相册列表显示出来,当然在这之前得调用MediaStore系统类,使用MediaStore.Images.Media.EXTERNAL_CONTENT_URI取得所有照片的信息,返回照片的路径、大小和最后修改时间以及直接包含图片的文件夹也就是相册名字,把每个相册中的第一张照片设置为展示列表中要显示的。调用BitmapFactory.Options根据指定的图像路径和大小来获取缩略图,这样有两点好处: 1.使用较小的内存空间,第一次获取的bitmap实际上为null,只是为了读取宽度和高度,第二次读取的bitmap是根据比例压缩过的图像,第三次读取的bitmap是所要的缩略图。2、缩略图对于原图像来讲没有拉伸,不会出现失真现象。之后在gridview中显示相册里的缩略图,并创建一个数组imageChose来存放选择好的照片,当选择gridview中的照片时把选中的照片放入,调用notifyDataSetChanged()更新下面已选中照片,当点击下面已选中时就是把imageChose中的相关照片从里面remove掉。也就是说这个数组里面一直保存着当前选中的照片,便于下面拼图操作的传值。
在拼图界面,创建一个400*660大小的画布,在布局文件中设置一个relativelayout布局,目的是把这个画布的view给add进去,便于截图保存。在对应的三四五张照片的时候先计算好每一块所占画布的大小。起初我是把照片按预定的大小来进行createSclaBitmap压缩,但是这个针对正方形不会失真,要是长方形就会失真,解决的办法是把照片先统一压缩为固定尺寸400*400大小的,在裁剪相应大小填进拼图区域里,可是裁剪的部分并不一定是我们想要的,我们要是想移动照片在框里面的位置,不可能!最后把画布按模版样式裁剪为几个部分,这样照片还采用正方形只不过一直按照裁剪区域的最大边来压缩,这样照片不会失真,而且可以移动,当然移动的时候得设置好坐标,在对应的区域相应的图片移动,对其他图片互不影响,在这次裁剪后填充图片时必须调用Canvas类的save()和restore()方法来保存Canvas的状态和恢复他的状态,不然就永远只能绘制一张图。
心得:通过这个拼图的设计,我更进一步体会到Android中的Canvas类和Paint类以及Bitmap类的用法,并且学会了canvas类中的save和restore、clipRect、drawBitmap等相关函数的用法,同时学会了Bitmap中的三种缩放照片的方法,在统统试了一遍之后也知道了他们的区别。同时学会了分享功能和保存照片的写法。而且在界面设计排版中也有了提高,并且对Android中的View和它上面的监听事件有了进一步的掌握,在重绘界面时用了postInvalidate();通过它我还学习了invalidate,明白了后者在UI线程中使用,前者在非UI线程中使用,总之这个项目我收获颇多。
技术回顾:这个里面的涂鸦是网上的一个相关帖子,我只修改了里面的涂鸦界面背景,增加了拍照获取和裁剪照片等,主要实现的是拼图,拼图首先要获取系统的相册并展示出来,用BaseAdapter从SD卡中读取相册列表显示出来,当然在这之前得调用MediaStore系统类,使用MediaStore.Images.Media.EXTERNAL_CONTENT_URI取得所有照片的信息,返回照片的路径、大小和最后修改时间以及直接包含图片的文件夹也就是相册名字,把每个相册中的第一张照片设置为展示列表中要显示的。调用BitmapFactory.Options根据指定的图像路径和大小来获取缩略图,这样有两点好处: 1.使用较小的内存空间,第一次获取的bitmap实际上为null,只是为了读取宽度和高度,第二次读取的bitmap是根据比例压缩过的图像,第三次读取的bitmap是所要的缩略图。2、缩略图对于原图像来讲没有拉伸,不会出现失真现象。之后在gridview中显示相册里的缩略图,并创建一个数组imageChose来存放选择好的照片,当选择gridview中的照片时把选中的照片放入,调用notifyDataSetChanged()更新下面已选中照片,当点击下面已选中时就是把imageChose中的相关照片从里面remove掉。也就是说这个数组里面一直保存着当前选中的照片,便于下面拼图操作的传值。
在拼图界面,创建一个400*660大小的画布,在布局文件中设置一个relativelayout布局,目的是把这个画布的view给add进去,便于截图保存。在对应的三四五张照片的时候先计算好每一块所占画布的大小。起初我是把照片按预定的大小来进行createSclaBitmap压缩,但是这个针对正方形不会失真,要是长方形就会失真,解决的办法是把照片先统一压缩为固定尺寸400*400大小的,在裁剪相应大小填进拼图区域里,可是裁剪的部分并不一定是我们想要的,我们要是想移动照片在框里面的位置,不可能!最后把画布按模版样式裁剪为几个部分,这样照片还采用正方形只不过一直按照裁剪区域的最大边来压缩,这样照片不会失真,而且可以移动,当然移动的时候得设置好坐标,在对应的区域相应的图片移动,对其他图片互不影响,在这次裁剪后填充图片时必须调用Canvas类的save()和restore()方法来保存Canvas的状态和恢复他的状态,不然就永远只能绘制一张图。
心得:通过这个拼图的设计,我更进一步体会到Android中的Canvas类和Paint类以及Bitmap类的用法,并且学会了canvas类中的save和restore、clipRect、drawBitmap等相关函数的用法,同时学会了Bitmap中的三种缩放照片的方法,在统统试了一遍之后也知道了他们的区别。同时学会了分享功能和保存照片的写法。而且在界面设计排版中也有了提高,并且对Android中的View和它上面的监听事件有了进一步的掌握,在重绘界面时用了postInvalidate();通过它我还学习了invalidate,明白了后者在UI线程中使用,前者在非UI线程中使用,总之这个项目我收获颇多。
相关文章推荐
- android 实现在照片上涂鸦
- 图片处理系列二Android瀑布流照片墙实现(含源码)
- Android照片墙实现 -- 图片加载,防止OOM的处理办法
- Android开源代码解读の地图照片应用Panoramio的实现详解(三)
- Android异步处理四:AsyncTask的实现原理
- Android UI事件处理——实现事件监听接口的4种方法
- android HTTP 通信, XML 解析, 通过 Hander 实现异步消息处理 (1)
- 系出名门Android(10) - HTTP 通信, XML 解析, 通过 Hander 实现异步消息处理
- Android开源代码解读の地图照片应用Panoramio的实现详解(二)
- Android游戏开发之触摸轨迹曲线的实现处理(二十四)
- Android开发学习笔记(8):浅谈Handler实现多线程和异步处理
- Android: 如何利用Handler处理和发送消息来实现页面刷新的功能
- 系出名门Android(10) - HTTP 通信, XML 解析, 通过 Hander 实现异步消息处理
- Android通过手势实现的缩放处理
- Android开源代码解读の地图照片应用Panoramio的实现详解(一)
- Android异步处理四:AsyncTask的实现原理
- 主题:Android通过手势实现的缩放处理(转http://www.javaeye.com/topic/516876)
- 主题:Android通过手势实现的缩放处理(转http://www.javaeye.com/topic/516876)
- Android中对大图的处理的实现和分析
- android HTTP 通信, XML 解析, 通过 Hander 实现异步消息处理