Select 位图上有 4 个点的区域使用 Matrix.setPolyToPoly
Select an area on bitmap with 4 points using Matrix.setPolyToPoly
我正在 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点坐标对canvas绘图或矩阵变换有影响吗?感谢任何帮助。
谢谢
最后,我使用 OpenCV 解决了我的问题。感谢 this question 中的回答! Matrix.setPolyToPoly
似乎并不适用于所有情况。
一切都简单多了..
@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 光栅化中。要解决此问题,您可以在不使用 Canvas
的情况下简单地创建一个新的转换 Bitmap
,然后裁剪 Bitmap
以获得所需的结果。
我正在 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点坐标对canvas绘图或矩阵变换有影响吗?感谢任何帮助。
谢谢
最后,我使用 OpenCV 解决了我的问题。感谢 this question 中的回答! Matrix.setPolyToPoly
似乎并不适用于所有情况。
一切都简单多了..
@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 光栅化中。要解决此问题,您可以在不使用 Canvas
的情况下简单地创建一个新的转换 Bitmap
,然后裁剪 Bitmap
以获得所需的结果。