经过matrix平移缩放旋转的图片,如何动态求出图片中心点坐标

发布于 2022-09-03 12:14:58 字数 1720 浏览 11 评论 0

项目中遇到这样的需求,需要动态求出正在编辑的图片的中心点坐标,编辑操作共有三种,平移,缩放和旋转.
其中平移缩放可以按照如下代码正确求出图片左上角和右下角坐标,但是旋转不可以.

 /**
     *
     * @param matrix imageView的矩阵对象
     * @param imageView 图片对象
     * @return
     */
 public float[] getLeftTop(Matrix matrix, GestureCropImageView imageView) {
        Rect rectTemp = imageView.getDrawable().getBounds();
        float[] values = new float[9];
        matrix.getValues(values);
        //左上角X坐标
        mLeftX = values[2];
        //左上角Y坐标
        mLeftY = values[5];

        //如果旋转的话
        if (mState == ROTATE_STATE) {

            //x0= (x - rx0)*cos(a) - (y - ry0)*sin(a) + rx0 ;
            //
            //y0= (x - rx0)*sin(a) + (y - ry0)*cos(a) + ry0 ;
            //右下角X坐标
            mRightX = (float) ((mRightX - mMidPntX) * Math.cos(mAngle / 180 * Math.PI) - (mRightY - mMidPntY) * Math.sin(mAngle / 180 * Math.PI) + mRightX);
            //右下角Y坐标
            mRightY = (float) ((mRightX - mMidPntX) * Math.sin(mAngle / 180 * Math.PI) + (mRightY - mMidPntY) * Math.cos(mAngle / 180 * Math.PI) + mRightY);


            Log.i(TAG, "宽度 :" + rectTemp.width() * values[0]);
            Log.i(TAG, "长度 :" + rectTemp.height() * values[4]);

        } else {
            //右下角X坐标
            mRightX = values[2] + rectTemp.width() * values[0];
            //右下角Y坐标
            mRightY = values[5] + rectTemp.height() * values[4];
        }

        float[] arr = {mLeftX, mLeftY, mRightX, mRightY};

        return arr;
    }

2.现在已知的条件有,图片旋转的角度,图片按某点旋转的点坐标,左上角的坐标,如何才能求出右下角的坐标?

  • //x0= (x - rx0)cos(a) - (y - ry0)sin(a) + rx0 ;
    //y0= (x - rx0)sin(a) + (y - ry0)cos(a) + ry0 ;

这是我的一种思路,但是出来的结果不对.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

公布 2022-09-10 12:14:58

问题已解决,方法如下:

    /**
     * @param matrix 变化后的矩阵
     * @param rectF 矩形对象
     */
    public Float[] getCenter(Matrix matrix,RectF rectF){
        matrix.mapRect(rectF);
        //其实在此处就可以获得中心! wtf
        float centerX = rectF.centerX();
        float centerY = rectF.centerY();
        return new Float[]{centerX,centerY};
    }
つ可否回来 2022-09-10 12:14:58

有个简单的方法, 可以去试试, 利用Android提供的MotionEvent类的transform方法
具体步骤先根据图片未旋转前的中心坐标生成一个MotionEvent对象, 然后调用transform方法, 将Matrix传递过去, 然后取出对应变换后的x, y, 应该就是你想要的坐标

爱冒险 2022-09-10 12:14:58

可以先得到变换前中心点坐标,设置matrix后利用Matrix.mappoints方法来得到变换后中心点坐标

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文