Android kotlin 图片裁剪和翻转

图片采集利用canvas的clipRect方法,图片翻转利用camera,可以根据x,y,z三轴旋转

实践代码:

package com.example.opencvapplication

import android.content.Context
import android.graphics.*
import android.util.AttributeSet
import android.view.View

class SpinImageView(context: Context?, attrs: AttributeSet?) : View(context, attrs) {
    val paint=Paint(Paint.ANTI_ALIAS_FLAG)
    val bitmap=getBitmap(200.dp)

    val camera=Camera().apply {
       rotateX(20f)
    }

    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)


        canvas?.let {
            /**
             * camera 旋转的坐标轴原点为手机左上角
             * 图片变幻使用反向思维,先将图片的中心点平移到手的左上角然后调用camera翻转图片然后再平移回原来位置
             * 然后反向实现代码
             */

            //C裁剪上半部分
            it.save()
            it.translate(50f.dp+bitmap.width/2,50f.dp+bitmap.height/2)//移回原来位置
            it.rotate(-30f)//转回原来角度
            it.clipRect(-bitmap.width.toFloat(),-bitmap.height.toFloat(),bitmap.width.toFloat(),0f)//裁剪图片
            it.rotate(30f)//旋转30度
            it.translate((-50f).dp-+bitmap.width/2, (-50f).dp-bitmap.height/2)//将图片平移到手机左上角
            it.drawBitmap(bitmap,50f.dp,50f.dp,paint)
            it.restore()


            it.save()
            it.translate(50f.dp+bitmap.width/2,50f.dp+bitmap.height/2)//移回原来位置
            it.rotate(-30f)//转回原来角度
            camera.applyToCanvas(it)//翻转图片
            it.clipRect(-bitmap.width.toFloat(),0f,bitmap.width.toFloat(),bitmap.height.toFloat())//裁剪图片
            it.rotate(30f)//旋转30度
            it.translate((-50f).dp-+bitmap.width/2, (-50f).dp-bitmap.height/2)//将图片平移到手机左上角
            it.drawBitmap(bitmap,50f.dp,50f.dp,paint)
            it.restore()


        }
    }

    private fun getBitmap(width:Int): Bitmap {
        val options= BitmapFactory.Options()
        options.inJustDecodeBounds=true
        BitmapFactory.decodeResource(resources,R.drawable.icon_tx,options)
        options.inJustDecodeBounds=false
        options.inDensity=options.outWidth
        options.inTargetDensity=width
        return BitmapFactory.decodeResource(resources,R.drawable.icon_tx,options)
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值