注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

尐鬼じ☆ve伱

和你在一起的日子

 
 
 

日志

 
 

Android中常用的位图操作6 (转)  

2013-01-15 11:17:23|  分类: Android |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
http://www.devdiv.com/Android-Android%E4%B8%AD%E5%B8%B8%E7%94%A8%E7%9A%84%E4%BD%8D%E5%9B%BE%E6%93%8D%E4%BD%9C-thread-127485-1-1.html
5)图像剪切

        如果只需要图像的一部分,就必须对图像进行剪切处理,在原图像上选择一个剪切区域,使用PorterDuffXfermode图像叠加规则,就可以把指定的图像区域剪切下来,下面通过三个步骤来说明如果对图像进行剪切操作。 

        第一步,创建一个新位图作为画板,然后把原图像画到新位图上面,Java代码如下:
                
01                BitmapDrawable bd = (BitmapDrawable) getResources().getDrawable(
02                                R.drawable.beauty);
03                Bitmap bitmap = bd.getBitmap();
04                int w = bitmap.getWidth();
05                int h = bitmap.getHeight();
06                Bitmap bm = Bitmap.createBitmap(w, h, Config.ARGB_8888);
07                Canvas canvas = new Canvas(bm);
08                Paint mPaint = new Paint();
09                mPaint.setAntiAlias(true);
10                mPaint.setStyle(Style.STROKE);
11                canvas.drawBitmap(bitmap, 00, mPaint);


        效果如下图所示:

QQ截图20120611160042.png


图7-12  第一步效果图



        第二步,绘制一个剪切区域,比如要剪切人物的脸部区域,需要在指定的位置绘制一个圆角矩形区域,代码中的坐标是在调试中获得,在其他分辨率下会有所不同,Java代码如下:

                
01                int deltX = 76;
02                int deltY = 98;
03                DashPathEffect dashStyle = new DashPathEffect(newfloat[] { 105,        55 }, 2);//创建虚线边框样式
04                RectF faceRect = new RectF(0088106);
05                float [] faceCornerii = new float[] {30,30,30,30,75,75,75,75};
06                Paint mPaint = new Paint();//创建画笔
07                mPaint.setColor(0xFF6F8DD5);
08                mPaint.setStrokeWidth(6);
09                mPaint.setPathEffect(dashStyle);
10                Path clip = new Path();//创建路径
11                clip.reset();
12                clip.addRoundRect(faceRect, faceCornerii, Direction.CW);//添加圆角矩形路径
13                canvas.save();//保存画布
14                canvas.translate(deltX, deltY);
15                canvas.clipPath(clip, Region.Op.DIFFERENCE);
16                canvas.drawColor(0xDF222222);
17                canvas.drawPath(clip, mPaint);//绘制路径
18                canvas.restore();


        效果如下图所示:

QQ截图20120611160114.png


图7-13  第二步效果



        第三步,从原图像上获取指定区域的图像,并绘制到屏幕上,java代码如下:

                
1                Rect srcRect = new Rect(0088106);
2                srcRect.offset(deltX, deltY);
3                PaintFlagsDrawFilter dfd = newPaintFlagsDrawFilter(Paint.ANTI_ALIAS_FLAG,
4                Paint.FILTER_BITMAP_FLAG);
5                canvas.setDrawFilter(dfd);
6                canvas.clipPath(clip);//使用路径剪切画布
7                canvas.drawBitmap(bitmap, srcRect, faceRect, mPaint);


        效果如下图所示:

QQ截图20120611154233.png


图7-13  第三部效果图



6)图像合成

        如果要为图片添加水印,或者把几张小图片拼接成大图片时,就需要利用图像合成的方法,在前面实例代码中已经使用了这种方法,就是创建新位图作为画板,然后在对应的位置上绘制其他图像。
        读者可以参考本章Demo中的getCompoundedBitmap方法,这里不做过多说明。
  评论这张
 
阅读(160)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017