有趣的遮罩图片处理

在学习当中,发现图片处理有个遮罩的效果,可以通过遮罩,给予一张图片裁剪成想要的效果。


这是MaskImage .class


package com.iqinbao.android.imageprocessing;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.util.AttributeSet;
import android.widget.ImageView;
/**
 * Created by admin on 2017/6/7.
 */
public class MaskImage extends ImageView {
    int mImageSource=0;
            int mMaskSource=0;
            RuntimeException mException;
            public MaskImage(Context context, AttributeSet attrs){
        super(context, attrs);
        TypedArray a =getContext().obtainStyledAttributes(attrs, R.styleable.MaskImage,0,0);
        mImageSource=a.getResourceId(R.styleable.MaskImage_image,0);
        mMaskSource=a.getResourceId(R.styleable.MaskImage_mask,0);
        if(mImageSource==0||mMaskSource==0){
            mException=new IllegalArgumentException(a.getPositionDescription()+
            ": The content attribute is required and must refer to a valid image.");
            }
        if(mException!=null)
        throw mException;
        /** 
                 * 主要代码实现 
                 */
        //获取图片的资源文件  
                Bitmap original = BitmapFactory.decodeResource(getResources(),mImageSource);
        //获取遮罩层图片  
        Bitmap mask= BitmapFactory.decodeResource(getResources(),mMaskSource);
        Bitmap result = Bitmap.createBitmap(mask.getWidth(),mask.getHeight(), Bitmap.Config.ARGB_8888);
        //将遮罩层的图片放到画布中  
        Canvas mCanvas = new Canvas(result);
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));//叠加重复的部分,显示下面的  
        mCanvas.drawBitmap(original,0,0,null);
        mCanvas.drawBitmap(mask, 0, 0, paint);
        paint.setXfermode(null);
        setImageBitmap(result);
        setScaleType(ScaleType.CENTER);
        a.recycle();
        }
}



这是ac_main.xml
 <com.iqinbao.android.imageprocessing.MaskImage
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        maskimage:image="@mipmap/qw010010246"
        maskimage:mask="@mipmap/duojinull"
        />

这是attrs.xml

<declare-styleable name="MaskImage">  
                <!-- Identifier for the image that represents the Imageview's content. -->  
                <attr name="image" format="reference"/>  
                <!-- crop Imageview's content same as mask -->  
                
        <attr name="mask" format="reference"/>
    </declare-styleable>

效果图

有趣的遮罩图片处理