Android 绘图基础:Bitmap(位图)与Matrix(矩阵)实现图片5种操作(平移、旋转、错切、缩放、对称)

来源:互联网 发布:网络大电影众筹平台 编辑:程序博客网 时间:2024/05/21 05:23

Android的Matrix利用数学原理实现图片平移、旋转等操作详解
  很庆幸自己的线性代数学的还可以,理解Matrix的矩阵变换完全没有问题。Matrix矩阵实现图片的平移旋转等操作涉及到线性代数问题,感兴趣它的具体实现的话可以参考一下上面的博客,非常详细,非常好。如果不想深究也可以简单的理解为BitMap的像素点通过某种方式(Matrix)移动了相应的位置,这样就实现了图片的变换。不管怎样,先学会如何使用它就可以了。
  注:我们所使用的Matrix变换必须有一个Bitmap基础,因此,代码中需要先获得Bitmap。

一、总体使用的简单展示

 平移变换

//参数:移动到的位置的放大倍数matrix.postTranslate(mBitmapwidth*2,mBitmapheight*2);canvas.drawBitmap(mbitmap,matrix, mpaintline);

旋转变换

        matrix.postRotate(180);         canvas.drawBitmap(mbitmap,matrix, mpaintline);

缩放变换

//参数:缩放倍数matrix.postScale(2, 2);canvas.drawBitmap(mbitmap,matrix, mpaintline);

错切变换

//x轴不变,y轴进行拉伸matrix.postSkew(0, 1);  canvas.drawBitmap(mbitmap,matrix, mpaintline);

对称(关于x轴对称 倒影)

float[] matrix_value=new float[]{1f,0f,0f,0f,-1f,0f,0f,0f,1f};              matrix.setValues(matrix_value);         canvas.drawBitmap(mbitmap,matrix, mpaintline);

对称(关于Y轴对称 镜像)

float[] matrix_value1=new float[]{-1f,0f,0f,0f,1f,0f,0f,0f,1f};             matrix.setValues(matrix_value1);        matrix.postTranslate(mBitmapwidth*2, mBitmapheight*2);        canvas.drawBitmap(mbitmap,matrix, mpaintline);

关于它的使用我们也是需要自定义一个class继承View,在布局中类名加包名进行添加布局。

二、平移变换

这里写图片描述

//原图加平移    matrix.reset();        canvas.drawBitmap(mbitmap, matrix, mpaintline);        //平移        matrix.reset();        matrix.postTranslate(mBitmapwidth*2,mBitmapheight*2);        canvas.drawBitmap(mbitmap,matrix, mpaintline);

三、旋转变换

这里写图片描述

//原图加旋转加平移matrix.reset();        matrix.postRotate(180);        matrix.postTranslate(mBitmapwidth*3,mBitmapheight* 2);        canvas.drawBitmap(mbitmap,matrix, mpaintline);

四、缩放变换

这里写图片描述

    matrix.reset();        matrix.postScale(2, 2);        canvas.drawBitmap(mbitmap,matrix, mpaintline);        matrix.reset();        //将原图绘制出来        canvas.drawBitmap(mbitmap, matrix, mpaintline);

五、错切变换

这里写图片描述

        matrix.reset();        matrix.postSkew(0, 1);        matrix.postTranslate(mBitmapwidth*3,mBitmapheight*3);        canvas.drawBitmap(mbitmap,matrix, mpaintline);

六、对称变换

这里写图片描述
1、关于x轴对称

    //对称  关于x轴对称    倒影        matrix.reset();        float[] matrix_value=new float[]{1f,0f,0f,0f,-1f,0f,0f,0f,1f};              matrix.setValues(matrix_value);        matrix.postTranslate(0, mBitmapheight*3);        canvas.drawBitmap(mbitmap,matrix, mpaintline);

2、关于Y轴对称
这里写图片描述

    //对称  关于y轴   镜像        matrix.reset();        float[] matrix_value1=new float[]{-1f,0f,0f,0f,1f,0f,0f,0f,1f};             matrix.setValues(matrix_value1);        matrix.postTranslate(mBitmapwidth*2, mBitmapheight*2);        canvas.drawBitmap(mbitmap,matrix, mpaintline);

七、附完整代码

这里写图片描述

public class MyBitmapView extends View{    private int width;    private int height;    private Paint mpaintline;    private Bitmap mbitmap;    private int mBitmapwidth;    private int mBitmapheight;    private Matrix matrix;    public MyBitmapView(Context context) {        super(context);    }    public MyBitmapView(Context context, AttributeSet attrs) {        super(context, attrs);        mpaintline = new Paint();        mpaintline.setColor(Color.RED);        mpaintline.setStrokeWidth(10);        mpaintline.setAntiAlias(true);        mbitmap=BitmapFactory.decodeResource(getResources(), R.drawable.yourimg);        mBitmapwidth=mbitmap.getWidth();        mBitmapheight=mbitmap.getHeight();        Log.d("图片信息","高:"+ mbitmap.getHeight()+"宽:"+mbitmap.getWidth());        matrix=new Matrix();    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);//  canvas.drawBitmap(mbitmap, 20, 20, mpaintline);        //放缩        matrix.reset();        matrix.postScale(2, 2);        canvas.drawBitmap(mbitmap,matrix, mpaintline);        matrix.reset();        canvas.drawBitmap(mbitmap, matrix, mpaintline);        //平移        matrix.reset();        matrix.postTranslate(mBitmapwidth*2,mBitmapheight*2);        canvas.drawBitmap(mbitmap,matrix, mpaintline);        //旋转        matrix.reset();        matrix.postRotate(180);        matrix.postTranslate(mBitmapwidth*3,mBitmapheight* 2);        canvas.drawBitmap(mbitmap,matrix, mpaintline);        //错切        matrix.reset();        matrix.postSkew(0, 1);        matrix.postTranslate(mBitmapwidth*3,mBitmapheight*3);        canvas.drawBitmap(mbitmap,matrix, mpaintline);        //对称  关于x轴对称    倒影        matrix.reset();        float[] matrix_value=new float[]{1f,0f,0f,0f,-1f,0f,0f,0f,1f};              matrix.setValues(matrix_value);        matrix.postTranslate(0, mBitmapheight*3);        canvas.drawBitmap(mbitmap,matrix, mpaintline);        //对称  关于y轴   镜像        matrix.reset();        float[] matrix_value1=new float[]{-1f,0f,0f,0f,1f,0f,0f,0f,1f};             matrix.setValues(matrix_value1);        matrix.postTranslate(mBitmapwidth*2, mBitmapheight*2);        canvas.drawBitmap(mbitmap,matrix, mpaintline);    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);        width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);        height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);    }}
0 0
原创粉丝点击