Android图形图像部分的总结(Advance)

位图资源的获取,及和其他各种方式的相互转换在之前的Android图形图像部分的总结里总结过了,下面来进一步总结下对位图的操作。

一、位图的缩放
  1.将位图按需要重新画一遍:drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint);
  2.在原有位图的基础上,缩放原位图,创建一个新的位图:CreateBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter);
  3.借助于canvas的scale(float x, float y)来缩放,注意这里缩放的是整个canvas画布,你可以看一下后面的save和restore,结合使用;
  4.借助Matrix来绘制的时候缩放,这样直接缩放src了,不会影响别的图案,后面有详细的Matrix介绍:    

1 Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pic180);
2 Matrix matrix=new Matrix();
3 matrix.postScale(0.2f, 0.2f);
4 Bitmap dstbmp=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(),bmp.getHeight(),matrix,true);
5 canvas.drawColor(Color.BLACK);
6 canvas.drawBitmap(dstbmp, 10, 10, null);

二、位图的旋转:原理和上面的缩放是一样的,只是换了个方法而已,亦或者是Matrix里改了两个数,完全一样的过程。

1 Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pic180);
2 Matrix matrix=new Matrix();
3 matrix.postRotate(45);
4 Bitmap dstbmp=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(),bmp.getHeight(),matrix,true);
5 canvas.drawColor(Color.BLACK);
6 canvas.drawBitmap(dstbmp, 10, 10, null);

三、图片水印的生成

  生成水印分为三个步骤:首先导入原始图片画在创建的同大小的Bitmap上,接着导入水印图片继续画在上面的图片上,最后保存生成的Bitmap,水印图片就生成了,我想,网上论坛里的上传头像后就加上了论坛的Logo,应该也就是这个原理吧。

 1 public Bitmap createBitmap( Bitmap src, Bitmap watermark ) { 
 2     String tag = "createBitmap"; 
 3     Log.d( tag, "create a new bitmap" ); 
 4     if( src == null ) { 
 5         return null; 
 6     } 
 7     int w = src.getWidth(); 
 8     int h = src.getHeight(); 
 9     int ww = watermark.getWidth(); 
10     int wh = watermark.getHeight(); 
11     //创建一个新的和SRC长度宽度一样的位图 
12     Bitmap newb = Bitmap.createBitmap( w, h, Config.ARGB_8888 );
13     Canvas cv = new Canvas( newb ); 
14     //draw src into 
15     cv.drawBitmap( src, 0, 0, null );//在 0,0坐标开始画入src 
16     //在src的右下角画入水印 
17     cv.drawBitmap( watermark, w - ww + 5, h - wh + 5, null );
18     //save all clip 
19     cv.save( Canvas.ALL_SAVE_FLAG );//保存 
20     //store 
21     cv.restore();//存储 
22     return newb; 
23 }
24 // 这里用到了save和restore,后面会具体说

四、save和restore
  终于讲到重点一点的东西了(后面还有Matrix),onDraw方法会传入一个Canvas对象,它是你用来绘制控件视觉界面的画布。在onDraw方法里,我们经常会看到调用save和restore方法,它们到底是干什么用的呢?save和resotre是相对应的,save用来保存当前canvas的状态,对应的,restore是用来恢复这一状态,相当于一个隔离,夹在save和restore之间的任何对canvas的操作都不会影响save前绘制的任何图形,只会对二者之间的绘制产生效果;值得注意的是save和restore是成对使用的(restore可以比save少,但不能多),restore调用过多,没的恢复了,当然会报错了!下面举个例子:
  我们先想在画布上绘制一个右向的三角箭头,当然,我们可以直接绘制,另外,我们也可以先把画布旋转90°,画一个向上的箭头,然后再旋转回来(这种旋转操作对于画圆周上的标记非常有用)。然后,我们想在右下角有个20像素的圆,那么,onDraw中的核心代码是:

 1 int px = getMeasuredWidth();
 2 int py = getMeasuredWidth();
 3 // Draw background
 4 canvas.drawRect(0, 0, px, py, backgroundPaint);
 5 canvas.save();
 6 canvas.rotate(90, px/2, py/2);
 7 // Draw up arrow
 8 canvas.drawLine(px / 2, 0, 0, py / 2, linePaint);
 9 canvas.drawLine(px / 2, 0, px, py / 2, linePaint);
10 canvas.drawLine(px / 2, 0, px / 2, py, linePaint);
11 canvas.restore();
12 // Draw circle
13 canvas.drawCircle(px - 10, py - 10, 10, linePaint);

左图是使用了save和restore,右图是没有用的效果!

五、Matrix
  终于到最重要的内容了---Matrix,矩阵!
  这是一个3X3的矩阵,当你new之后,是一个3维单位矩阵,这个3X3矩阵被划分成4个部分,每个部分可以完成对应的功能:
  

  首先举个例子,现在你要移动一个点(x0,y0)到P(x,y),你会怎么做?Δx为x的增量,Δy为y的增量。则有,x=x0+Δx,y=y0+Δy,那采用矩阵表示为:  

类似的,缩放就是左乘,图像的旋转稍微有点复杂,设点p0(x0,y0),旋转θ角后对应的点为p(x,y),

则有:,当然,这是相对于圆心是(0,0)的点旋转的,如果是围绕某点(a,b)旋转,则需要先将画布平移,然后再旋转,最后再反向平移。
  Preconcats和Postconcats,pre开头的都是右乘矩阵,post开头的都是左乘矩阵,同时注意,set开头的方法被调用时,都会默认调用reset()方法一次。
  错切变换:所谓错切变换,就是生成的图像的x相对于y0以一定的比例线性变化,或者y相对于x0以一定的比例线性变化,亦或者二者同时变化,这都取决于斜对角的两个参数,错切的效果类似拉扯,扭曲。

 

(下次转一下网上很多的那个3D Gallery的实现)

转载于:https://www.cnblogs.com/vtianyun/archive/2012/06/19/2554819.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值