Android 使用Matrix.SetPolyTopoloy选择位图上具有4个点的区域

Android 使用Matrix.SetPolyTopoloy选择位图上具有4个点的区域,android,matrix,bitmap,transformation,Android,Matrix,Bitmap,Transformation,我在Android上玩位图,在使用4点在位图上选择区域时遇到问题。不是所有的4点都适合我。在某些情况下,结果只是一个空白位图,而不是裁剪的位图(如图中所示),并且logcat中没有任何错误(甚至内存错误)。 下面是我用来进行转换的基本代码 import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas

我在Android上玩位图,在使用4点在位图上选择区域时遇到问题。不是所有的4点都适合我。在某些情况下,结果只是一个空白位图,而不是裁剪的位图(如图中所示),并且logcat中没有任何错误(甚至内存错误)。 下面是我用来进行转换的基本代码

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.widget.ImageView;

public class CropImageActivity extends Activity {
private ImageView mCroppedImageView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.crop);
    setupViews();
    doCropping();
}

private void doCropping() {
    Bitmap srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.sample);

    //target size
    int bitmapWidth = 400;
    int bitmapHeight = 400;

    Bitmap bitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);

    //This is one of bad quadangle.
    points[0] = 0;    //top-left.x
    points[1] = 0;    //top-left.y
    points[2] = 230;  //top-right.x
    points[3] = 100;  //top-right.y
    points[4] = 350;  //bottom-right.x
    points[5] = 350;  //bottom-right.y
    points[6] = 0;    //bottom-left.x
    points[7] = 350;  //bottom-left.y

    float[] src = new float[]{
            points[0], points[1],
            points[2], points[3],
            points[4], points[5],
            points[6], points[7]
    };
    float[] dsc = new float[]{
            0, 0,
            bitmapWidth, 0,
            bitmapWidth, bitmapHeight,
            0, bitmapHeight
    };

    Matrix matrix = new Matrix();
    boolean transformResult = matrix.setPolyToPoly(src, 0, dsc, 0, 4);

    canvas.drawBitmap(srcBitmap, matrix, null);
    mCroppedImageView.setImageBitmap(bitmap);
}

private void setupViews() {
    mCroppedImageView = (ImageView) findViewById(R.id.croppedImageView);
}
}
那么,4点坐标是否会影响画布绘制或矩阵变换?感谢您的帮助

多谢各位


最后,我使用OpenCV解决了我的问题。谢谢你的回答!似乎
矩阵.setpolytoply
并不适用于所有情况。

一切都简单得多

     @Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    Matrix matrix = new Matrix();

    matrix.setPolyToPoly(src, 0, dst, 0, 4);
    canvas.setMatrix(matrix);
    canvas.drawBitmap(bit,0,0,null );
}

您看到的错误不在Matrix.setPolyToPloy中,而是在CPU光栅化中。要解决此问题,只需创建一个新的转换后的
位图
,而无需使用
画布
,然后裁剪
位图
,以获得所需的结果。

什么是
布尔结果
?“result boolean”变量仅用于日志记录。我想确保命令“matrix.setPolyTopoloy”正常工作。
''在某些情况下,结果只是一个空白位图“”
在这些情况下,什么是
布尔结果
?对于我测试的所有情况,它的值都是“true”。我不知道矩阵计算是否失败,但它不会引发任何错误:(首先确保矩阵是正确的,尝试调用
Canvas#concat
,然后调用
Canvas#drawRect
请添加一些关于代码的细节和/或信息。这样OP,也许新用户可以很容易地理解您的答案。以上补充了答案。我得到了描述失真点的位图和数组。Sor为机器翻译提供了一种新的方法。