黑马程序员技术交流社区

标题: 【阳哥专栏】黑马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颜色过滤器ColorMatrixColorFilter
Android提供了颜色过滤器来进行颜色处理。
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设置触摸的事件,当手指触摸到图片上时,将手指触摸的点周边的上层图片的像素点设置为透明的,就会出现一个撕衣服的效果。
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
王鹏飞 发表于 2015-3-23 22:11
非专业,看不懂,咋办?

世上无难事,
作者: aiyakuaile    时间: 2015-3-23 22:35
感觉老牛了,我要学安卓
作者: 王震阳老师    时间: 2015-3-23 22:37
aiyakuaile 发表于 2015-3-23 22:35
感觉老牛了,我要学安卓

汇总贴: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 22:59
想到自己将来也有可能达到这样的水平就充满了力量!

相信你自己,完全可以的。世上无难事只怕有心人。
作者: 刘大志    时间: 2015-3-23 23:22
我来了看看看

作者: a1301155262    时间: 2015-3-23 23:49
先收藏一下
作者: shi469391    时间: 2015-3-23 23:50
学了java基础,看这玩意似懂非懂啊,就业班的搞起,希望也能早日向大神级别靠近
作者: 王震阳老师    时间: 2015-3-23 23:53
shi469391 发表于 2015-3-23 23:50
学了java基础,看这玩意似懂非懂啊,就业班的搞起,希望也能早日向大神级别靠近 ...

加油。
作者: 萍水相逢    时间: 2015-3-24 07:54
谢谢阳哥:lol
作者: yh903450130    时间: 2015-3-24 08:08
:D学习学习
作者: 何明睿    时间: 2015-3-24 09:28
王震阳老师 发表于 2015-3-23 23:00
相信你自己,完全可以的。世上无难事只怕有心人。

嗯,谢谢王老师!
作者: 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 18:51
我就来赞一个,阳哥支持你

感谢支持。
作者: 王震阳老师    时间: 2015-3-24 23:42
itheima_llt 发表于 2015-3-24 18:50
顶阳哥!先收藏了!

感谢支持。
作者: 邓士林    时间: 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
Riendfly 发表于 2015-3-25 21:45
努力挣分,希望能早日加入黑马

加油。
作者: 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-3 00:03
等我上海黑马毕业后,我定多开发几个玩玩

加油。
作者: 剑雨飘扬    时间: 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