黑马程序员技术交流社区
标题: 【阳哥专栏】黑马Android教程-Android基础10图片处理 [打印本页]
作者: 王震阳老师 时间: 2015-3-23 21:54
标题: 【阳哥专栏】黑马Android教程-Android基础10图片处理
本帖最后由 王震阳老师 于 2015-3-23 22:27 编辑
汇总贴:http://bbs.itheima.com/thread-180149-1-1.html
pdf附件回复可下载:
1. 加载大图片(★★★)Android虚拟机默认为每个应用分配的堆内存空间是16M,当加载大图片时,加载图片需要的内存空间不是按图片的大小来算的,而是按像素点的多少来算的。图片加载到内存中需要把每一个像素都加载到内存中. 所以对内存的要求非常高, 一不小心就会造成OOM(OutOfMemoryError) 内存溢出致命错误。
假设:
当前有一张图片,大小仅为1M,但是其规格为3648*2736,现在需要加载此图片总像素数=3648*2736=9980928
三种像素单位如下:
ARGB_4444 : 2bytes
ARGB_8888 : 4bytes
RGB_565 : 4bytes
假设现在像素采用ARGB_4444标准,则其占用的总空间为:
图片占用空间=总像素数 *像素的单位
=9980928 * 2bytes
=19961856bytes
=19M>16M OOM内存溢出
解决方案:
Java代码可以对图片进行比例缩放
假设:
图片的宽和高: 3648 * 2736
屏幕的宽和高: 320 * 480
计算缩放比:
宽度缩放比例: 3648 / 320 = 11
高度缩放比例: 2736 / 480 = 5
比较宽和高的缩放比例, 哪一个大用哪一个进行缩放
缩放后的图片:
3648 / 11 = 331
2736 / 11 = 248
缩放后图片的宽和高: 331* 248
331* 248=882088 * 2bytes=160K
1.1实现图片的缩放加载:这里只给出核心代码,用于演示加载大图片的原理。
普通方法加载图片代码清单:
采用缩放方式加载图片:
2. 图片加水印(★★)Android提供了两个类Canvas和Paint:
Canvas 画画板,用于绘制各种图形(点, 线, 圆, 矩形等等)
Paint 画笔,和Canvas搭配使用,用于指定绘制的颜色, 线条的粗细, 过
渡, 渐变等效果。
使用方法:
2.1图片加水印代码实现 需求:图片加水印,即准备一张原图和一张水印图片,然后对两个图片进行合成。
前提知识:两张图片的合成有如下几种方式,在该案例中我们为了让两张图片都显示,因此我们选择Darken方法。图片合成的几种方式见下图。
现在有两张图片,1、原图:
- 水印:
:这里我会新创建一个Android工程,并把这两个资源加入到drawable目录中。关于创建工程的步骤等简单操作在以后的文档中就一笔带过,我们直接将重点放在核心代码上。
图片合成代码清单:
运行上面的代码,效果图如下: 我们发现在Android图片的右下角成功添加了黑马的LOGO作为水印。
3. 图片特效(★★)图片的特效包括,图形的缩放、镜面、倒影、旋转、位移等。图片的特效是将原图的图形矩阵乘以一个特效矩阵,形成一个新的图形矩阵来实现的。
Matrix维护了一个3*3的矩阵去更改像素点的坐标。
图形的默认矩阵用数组表示为:
{ 1, 0, 0, 表示向量x = 1x + 0y + 0z
0, 1, 0, 表示向量y = 0x + 1y + 0z
0, 0, 1 } 表示向量z = 0x + 0y + 1z
通过更改图形矩阵的值,可以做出缩放/镜面/倒影等图片特效。
下面分别给出各种特效实现的代码,在代码中会有详细的注释。
3.1缩放 矩阵示例:
{ 2, 0, 0,
0, 1, 0,
0, 0, 1 }
意义:x轴所有的像素点放大2倍, 展现的效是: 图片宽度x2
代码清单:
3.2[color=rgb(87, 137, 220) !important][url=]镜面[/url] 矩阵示例:
{ -1, 0, 0, x坐标变为复数,代表以y轴为镜面成像
0, 1, 0,
0, 0, 1 }
意义:x轴所有的像素点沿负数方向反过来, 展现的效果是: 镜面。
通过上面的代码其实我们发现镜面的代码跟缩放其实基本相同的,唯一不同的就是矩阵的参数不同而已。
3.3倒影 矩阵示例:
{ 1, 0, 0, x轴不变
0, -1, 0, y轴变为负数
0, 0, 1 }
y轴所有的像素点沿负数方向反过来, 展现的效果是: 倒影
:倒影的代码跟3.2章节中的代码一样,唯一不同的就是矩阵参数不同。同时为了看到倒影后的效果需要在矩阵中添加如下代码:
3.4旋转Matrix中提供了设置图片旋转角度的方法:
setRotate(float degrees, float px, float py)
degrees:要旋转的角度
px : 旋转原点的X轴坐标
py : 旋转原点的Y轴坐标
3.5位移Matrix中提供了设置图片位移的方法:
setTranslate(float dx, float dy)
dx : 位移的X轴距离
dy : 位移的Y轴距离
4. 图片颜色处理(★★)4.1颜色过滤器ColorMatrixColorFilterAndroid提供了颜色过滤器来进行颜色处理。
ColorMatrixColorFilter:通过使用一个4*5的颜色矩阵来创建一个颜色过滤器,改变图片的颜色信息。
图形颜色默认矩阵是一个4x5的矩阵, 数组表现为:
{1, 0, 0, 0, 0, // red 1*R + 0*G + 0*B + 0*A + 0
0, 1, 0, 0, 0, // green 0*R + 1*G + 0*B + 0*A + 0
0, 0, 1, 0, 0, // blue 0*R + 0*G + 1*B + 0*A + 0
0, 0, 0, 1, 0} // alpha 0*R + 0*G + 0*B + 1*A + 0
颜色矩阵的每一行的最后一个值更改时,其对应的颜色值就会发生改变,所以更改颜色只需修改其对应颜色矩阵行的最后一项的值即可,最大值范围为255。
4.2实现图片美化功能 需求:加载一张图片,通过4个SeekBar分别调整R(Red)、G(Green)、B(Blue)、A(Alpha)值,第四个同时改变RGB值,实现图片颜色的变亮。
设置页面布局
在drawable目录下放置一张需要处理的图片
实现业务逻辑代码
运行效果如下图:
5. 案例-随手涂鸦(★★)5.1实现原理Android中只有View才可以捕获到用户触摸的事件。
ImageView控件可以设置一个触摸事件的监听器来监听触摸事件,重写OnTouchListener的onTouch方法,结合Canvas类,即可实现随手涂鸦的画板功能
:onTouch方法的返回值默认是false的,必须设置为true,否则触摸事件将
不会被处理。
触摸事件的类型分为:
MotionEvent.ACTION_DOWN 按下
MotionEvent.ACTION_MOVE 移动
MotionEvent.ACTION_UP 抬起
5.2代码实现 需求:手指在界面滑动的时候绘制线条。点击保存按钮可以将绘制的图形保证到存储卡上,点击取消按钮可以将当前界面清空。
布局文件比较简单,这里不再给出。
代码清单:
运行改项目,效果如下图:
6. 案例-撕衣服游戏(★★)6.1实现原理使用帧布局,准备2张图片,一张图片有衣服,一张图片没有衣服。没有衣服的图片放置在下面,有衣服的图片放置在上面,为在上面的ImageView设置触摸的事件,当手指触摸到图片上时,将手指触摸的点周边的上层图片的像素点设置为透明的,就会出现一个撕衣服的效果。
:
- 触摸事件onTouch的返回值必须设置为true,否则触摸的事件将不被处理
- 使用BitmapFactory的decodeResouces方法得到的图片是没有透明度的,即图片格式为RGB_565,所以若想能够修改透明度,需要使用Canvas对象对图片进行重绘,重新绘制的图片格式采用ARGB。
- 加载图片时需要对其进行一下压缩,防止图片与控件大小不匹配,导致触摸时点对不上,达不到触摸那里就设置哪里的像素点透明的效果。
6.2 代码实现运行效果如下图所示:
至此,本文档完!
2014-12-21 14.12.21
北京市海淀区东馨园小区
作者: junge520 时间: 2015-3-23 21:56
沙发沙发,虽然不怎么看懂··先收藏了!
作者: 青岛_黑马 时间: 2015-3-23 22:09
顶 ,学习学习
作者: 王鹏飞 时间: 2015-3-23 22:11
非专业,看不懂,咋办?
作者: 王震阳老师 时间: 2015-3-23 22:27
世上无难事,
作者: aiyakuaile 时间: 2015-3-23 22:35
感觉老牛了,我要学安卓
作者: 王震阳老师 时间: 2015-3-23 22:37
汇总贴:http://bbs.itheima.com/thread-180149-1-1.html
作者: 中华小便当 时间: 2015-3-23 22:44
回复看帖
作者: houtrry 时间: 2015-3-23 22:45
我就看看 不说话
作者: challenge 时间: 2015-3-23 22:53
赞一个。
作者: macover 时间: 2015-3-23 22:56
收藏先,非常感谢
作者: 何明睿 时间: 2015-3-23 22:59
想到自己将来也有可能达到这样的水平就充满了力量!
作者: 王震阳老师 时间: 2015-3-23 23:00
相信你自己,完全可以的。世上无难事只怕有心人。
作者: 刘大志 时间: 2015-3-23 23:22
我来了看看看
作者: a1301155262 时间: 2015-3-23 23:49
先收藏一下
作者: shi469391 时间: 2015-3-23 23:50
学了java基础,看这玩意似懂非懂啊,就业班的搞起,希望也能早日向大神级别靠近
作者: 王震阳老师 时间: 2015-3-23 23:53
加油。
作者: 萍水相逢 时间: 2015-3-24 07:54
谢谢阳哥:lol
作者: yh903450130 时间: 2015-3-24 08:08
:D学习学习
作者: 何明睿 时间: 2015-3-24 09:28
嗯,谢谢王老师!
作者: mayor125 时间: 2015-3-24 10:01
好好学习,天天向上
作者: jokerzzz 时间: 2015-3-24 10:20
学习学习
作者: 冲动的一匹马 时间: 2015-3-24 13:31
不错学习了
作者: a4230517 时间: 2015-3-24 17:28
学习了。。。
作者: itheima_llt 时间: 2015-3-24 18:50
{:3_67:}顶阳哥!先收藏了!
作者: 唐枫 时间: 2015-3-24 18:51
我就来赞一个,阳哥支持你
作者: 冻了冬天 时间: 2015-3-24 20:18
咋收藏、、。。。。。。。。
作者: yywishp 时间: 2015-3-24 20:24
果断收藏
作者: ITheima-Ssmnr 时间: 2015-3-24 21:15
小伙伴,弄得不错哦。
作者: NewOnce` 时间: 2015-3-24 22:26
来收藏下
作者: Dawn3 时间: 2015-3-24 22:33
学习中。。。
作者: ym199210 时间: 2015-3-24 22:36
java基础的String都看到头疼 怎么办 太多了
作者: a1301155262 时间: 2015-3-24 23:34
实用技术值得收藏
作者: 王震阳老师 时间: 2015-3-24 23:42
感谢支持。
作者: 王震阳老师 时间: 2015-3-24 23:42
感谢支持。
作者: 邓士林 时间: 2015-3-24 23:55
下载资源,
作者: wwwlcy 时间: 2015-3-24 23:58
顶,顶!!
作者: ym199210 时间: 2015-3-25 00:26
奋不顾身中,
作者: 千玉屑 时间: 2015-3-25 08:31
进来瞅瞅
作者: RaymingChan 时间: 2015-3-25 09:20
虽然没怎么看懂,先收藏。谢谢阳哥分享。
作者: 落雪 时间: 2015-3-25 09:32
虽然看不懂,先顶上去再说,留着以后看
作者: 妖妖 时间: 2015-3-25 10:08
收了先 ,技多不压身~~·
作者: qsmaxmin 时间: 2015-3-25 10:40
每天一回复。。。
作者: 黑马杜浔 时间: 2015-3-25 11:42
好高深!
作者: 执笔画梦 时间: 2015-3-25 13:41
谢谢阳哥分享,56期正好上到这里
作者: ellisontu 时间: 2015-3-25 15:36
加精华.....................
作者: 李印东老师 时间: 2015-3-25 16:49
震阳整理的不错,给力!
代码截图换成插入代码模块就更好了,大家都可以复制啦。
作者: 邓士林 时间: 2015-3-25 17:37
顶一个,
作者: 高双 时间: 2015-3-25 20:51
谢谢 学习下
作者: Riendfly 时间: 2015-3-25 21:45
努力挣分,希望能早日加入黑马
作者: 朱令娟 时间: 2015-3-26 00:21
求笔记。。。。。。。。。。。
作者: 王震阳老师 时间: 2015-3-26 00:48
加油。
作者: 739262720 时间: 2015-3-26 19:23
谢谢分享,下载看看
作者: 没劲睡觉 时间: 2015-3-26 19:55
来顶顶
作者: 张安哲 时间: 2015-3-26 20:11
啥都不哈USif噢金佛i啊沙发我师父waSWAE
作者: 孙振祥 时间: 2015-3-26 20:36
看着很牛逼啊,不过目前还是看不懂啊
作者: 守护莹到老 时间: 2015-3-26 20:41
非专业,看不懂,咋办?
作者: 728121881 时间: 2015-3-26 22:44
加油↖(^ω^)↗↖(^ω^)↗↖(^ω^)↗↖(^ω^)↗
作者: Rain2692 时间: 2015-3-27 00:08
牛牛牛。。。。。。。。。。。。。。。。。。。。。。。
作者: Eternal007 时间: 2015-3-27 00:14
好火.....
作者: jiandonn 时间: 2015-3-27 07:42
收藏先,非常感谢
作者: jackwang 时间: 2015-3-27 09:57
老师很勤奋啊!向老师学习!努力!加油!
作者: bansy_chen 时间: 2015-3-27 11:26
知识点好深
作者: ellisontu 时间: 2015-3-27 21:07
Come on
作者: psttt 时间: 2015-3-28 01:09
mark下。。。。
作者: smartisan 时间: 2015-3-28 09:53
谢谢谢谢!!
作者: hcy973747509 时间: 2015-3-28 12:03
压力山大啊 没看懂的路过
作者: 前_行 时间: 2015-3-28 21:51
先顶起,非常感谢!
作者: 奔跑的孙莹 时间: 2015-3-29 00:50
阳哥 我要把你的资料都下载啦 你写的太好了!
作者: 小小的黑马 时间: 2015-3-29 09:23
来看看 支持一下!!!!!!!!!
作者: 小亮smile 时间: 2015-3-29 10:45
必须大赞!!!!顶顶
作者: 黑马尤扬 时间: 2015-3-29 23:47
收藏一下,以后肯定有用
作者: 小小的黑马 时间: 2015-3-30 21:28
赞一个!!!!!!!!!!!!
作者: 冰心冷恋 时间: 2015-3-31 13:58
学习学习
作者: Heart灬空城 时间: 2015-3-31 21:40
多等学习
作者: Never、saydie 时间: 2015-3-31 22:46
撕衣服这个效果图呢。。。。好想看看是不是真的可以撕 >.<
作者: li子文 时间: 2015-4-1 18:17
,在放假的时候可以充实自己了
作者: wwwlcy 时间: 2015-4-1 19:50
顶一下!!!
作者: 缤纷落叶 时间: 2015-4-1 21:37
超赞!!!!!!!!!!!
作者: 小小的黑马 时间: 2015-4-1 22:07
赞一个!!!!!!!!!!!!!!!!!!
作者: 朱闹闹 时间: 2015-4-1 22:48
赞一个,绝美,通过这里来实现
作者: 缤纷落叶 时间: 2015-4-2 12:34
技术高..........................................
作者: 沙迦 时间: 2015-4-2 18:17
学习了,谢谢分享
作者: 李明全 时间: 2015-4-3 00:03
等我上海黑马毕业后,我定多开发几个玩玩
作者: 王震阳老师 时间: 2015-4-3 08:42
加油。
作者: 剑雨飘扬 时间: 2015-4-9 18:28
来拿笔记
作者: z47057554 时间: 2015-4-13 00:19
谢谢分享:):D:lol
作者: Doug 时间: 2015-4-13 19:07
回帖领pdf
作者: lbl624 时间: 2015-4-13 22:14
谢谢分享啊,非常有用
作者: 鲁柯 时间: 2015-4-15 20:42
还有没保存的 继续
作者: sinbad88 时间: 2015-4-15 21:10
多谢阳哥分享
作者: 毛守锐 时间: 2015-4-15 21:22
学习学习 早日向大神靠近
作者: Hosing 时间: 2015-4-15 23:25
Thanks for Yang Brother's Note!
作者: 福禄娃 时间: 2015-4-18 10:25
多谢阳哥的分享~~~~
作者: 彭春晓 时间: 2015-4-19 15:16
黑马Android教程-12通知&Fragment&反编译&NinePatch [修改]
作者: 时间都去哪了 时间: 2015-4-23 07:51
啦啦啦德玛西亚
作者: 枪杆不如笔杆 时间: 2015-4-24 10:32
喜闻乐见!!
作者: Catface 时间: 2015-4-28 10:26
前来学习一下
作者: 崔小可 时间: 2015-4-28 21:50
顶一下 嘿嘿
作者: zhubingg 时间: 2015-4-30 23:57
先 看看 都是什么
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |