java - 经过matrix平移缩放旋转的图片,如何动态求出图片中心点坐标
ringa_lee
ringa_lee 2017-04-18 09:47:25
0
3
531

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

 /**
     *
     * @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 ;

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

ringa_lee
ringa_lee

ringa_lee

membalas semua(3)
巴扎黑

Masalah telah selesai, caranya adalah seperti berikut:

    /**
     * @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};
    }
刘奇

Terdapat kaedah mudah, anda boleh mencubanya, gunakan kaedah transformasi kelas MotionEvent yang disediakan oleh Android
Langkah-langkah khusus adalah untuk menjana objek MotionEvent terlebih dahulu berdasarkan koordinat tengah imej sebelum putaran, dan kemudian panggil kaedah transformasi dan hantar Matrix Go ke sana, dan kemudian keluarkan x, y yang diubah suai, yang sepatutnya menjadi koordinat yang anda mahu

Ty80

Anda boleh mendapatkan koordinat titik tengah sebelum transformasi, dan kemudian gunakan kaedah Matrix.mappoints selepas menetapkan matriks untuk mendapatkan koordinat titik tengah selepas transformasi

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!