Android图像处理技术(实现Android中的PS)(5)

Android图像处理技术(实现Android中的PS)(五)

好快,今天已经是关于Android图片处理技术的第五个博客了,有点多了,主要是为了照顾一下基础比较薄弱的同学。不过我们都是用一个连贯的例子来讲解的,并且提供了带有详细注释的Demo,通过前四个博文的学习,想必大家对图片处理技术有所了解了,从本博文开始,只贴出关键代码段,其他无关紧要的代码(比如xml布局文件)就不贴了,我会附上一个Demo,大家可以下载参考。(PS:收取一个积分值是希望大家能珍惜下载的代码,毕竟是我一行一行写的,也算是对我自己工作的尊重吧,还请大家见谅。。。) 

好了,废话不多说,开始我们今天的讲解:使用画笔风格Xfermode和Shader实现对图片的处理。

首先,效果展示:
Android图像处理技术(实现Android中的PS)(5)

首先我们先介绍一下Xfermode:
Android图像处理技术(实现Android中的PS)(5)

然后再介绍一下Shader:
Android图像处理技术(实现Android中的PS)(5)

下面我们来贴出使用Xfermode改变图片的主要代码:

自定义XfermodeView:

public class XfermodesView extends View{

    private Bitmap mBitmap,mOutBitmap;
    private Paint mPaint;
    public XfermodesView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView();
    }
    private void initView(){
        //关掉硬件加速,否则达不到预期的效果;
        setLayerType(LAYER_TYPE_SOFTWARE, null);
        //从资源中加载图片
        mBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.a);
        mOutBitmap=Bitmap.createBitmap(mBitmap.getWidth(),mBitmap.getHeight(),Config.ARGB_8888);//Config.ARGB_8888   防锯齿
        Canvas canvas=new Canvas(mOutBitmap);
        mPaint=new Paint(Paint.ANTI_ALIAS_FLAG);
        //Dst
        //这些都很简单的了。。
        canvas.drawRoundRect(new RectF(50, 50, mBitmap.getWidth(), mBitmap.getHeight()), 50, 50, mPaint);
        //Src
        //设置模式:
        mPaint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
        canvas.drawBitmap(mBitmap, 0,0, mPaint);
        //还原mPaint
        mPaint.setXfermode(null);
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawBitmap(mOutBitmap,0,0,null);
    }
}

我想,如果看过前几个博文,这个代码没什么难度。

然后再看看怎样自定义ShaderView:

public class BitmapShaderView extends View {
    private Bitmap mBitmap;
    private Paint mPaint;
    private BitmapShader mShader;

    public BitmapShaderView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mPaint=new Paint();
        mBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.a);
        //设置Shader模式:
        mShader=new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
        //将设置好的shader绑定到画笔mPaint上面
        mPaint.setShader(mShader);
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        canvas.drawCircle(200, 200, 50, mPaint);
    }
}

ok,结束。

最后,Demo地址:http://download.csdn.net/detail/nsgsbs/8538579