使用Matrix.setPolyToPoly在位图上选择4个点的区域

5

我正在Android上使用位图,当使用4个点选择位图上的区域时遇到了问题。并非所有4个点的组合都适用于我。在某些情况下,结果只是一个空白位图而不是裁剪后的位图(如图所示),并且日志中没有任何错误(甚至没有内存错误)。

以下是我用于进行转换的基本代码:

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个点的坐标是影响画布绘制还是矩阵变换?任何帮助都将不胜感激。
谢谢。 enter image description here This works

boolean result 是什么? - pskink
"result boolean"变量仅用于日志记录目的,我想确保命令“matrix.setPolyToPoly”正常工作。 - h2nghia
我测试的所有情况下,它的值都是“true”。我不知道矩阵在计算时是否失败,但它没有抛出任何错误 :( - h2nghia
首先确保矩阵正确,尝试调用 Canvas#concat 然后再调用 Canvas#drawRect - pskink
嗨,pskink,代码基本上就是我发布的内容。 - h2nghia
显示剩余7条评论
3个回答

2

最终,我使用OpenCV解决了我的问题。感谢这个问题中的答案!看起来Matrix.setPolyToPoly并不适用于所有情况。


0
你看到的bug不是在`Matrix.setPolyToPoly`中,而是在CPU光栅化中。为了解决这个问题,你可以简单地创建一个新的经过变换的`Bitmap`,而不使用`Canvas`,然后裁剪`Bitmap`以得到所需的结果。

0

一切都变得更简单了。

     @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 );
}

请添加一些关于您的代码的详细信息和/或信息,以便原帖作者和新用户可以轻松理解您的答案。 - Dwhitz
以上补充了答案。我得到了位图和描述扭曲点的数组。对于机器翻译表示抱歉。 - Игорь

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接