有趣的遮罩图片处理
在学习当中,发现图片处理有个遮罩的效果,可以通过遮罩,给予一张图片裁剪成想要的效果。
这是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;
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.
*/
* 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();
}
}
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"
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>
<!-- 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>
效果图