Distorsionar una imagen a un cuadrángulo falla en algunos casos en Android

Estoy utilizando la función matrix.setPolyToPoly para transformar una región seleccionada (4 esquinas) de un mapa de bits en un rectángulo y normalmente funciona increíble. Pero en el siguiente ejemplo:

4 esquinas selección imagen

La función polyToPoly falla la transformación de perspectiva:

Imagen de mala transformación

He dibujado dos líneas para la prueba, las líneas de la marca donde quiero los cuatro puntos seleccionados.

¿Qué estoy haciendo mal? ¡Gracias!

EDIT : He resuelto el problema usando canvas.drawBitmapMesh, Gracias pskink por su consejo !!

Este es el codigo final

private float[] generateVertices(int widthBitmap, int heightBitmap) { float[] vertices=new float[(WIDTH_BLOCK+1)*(HEIGHT_BLOCK+1)*2]; float widthBlock = (float)widthBitmap/WIDTH_BLOCK; float heightBlock = (float)heightBitmap/HEIGHT_BLOCK; for(int i=0;i<=HEIGHT_BLOCK;i++) for(int j=0;j<=WIDTH_BLOCK;j++) { vertices[i * ((HEIGHT_BLOCK+1)*2) + (j*2)] = j * widthBlock; vertices[i * ((HEIGHT_BLOCK+1)*2) + (j*2)+1] = i * heightBlock; } return vertices; } private Bitmap perspectiveTransformation(Bitmap bitmap, ArrayList<Point> bitmapPoints) { Bitmap correctedBitmap; int maxX = (int) Math.max(Math.abs(bitmapPoints.get(0).x - bitmapPoints.get(1).x), Math.abs(bitmapPoints.get(2).x - bitmapPoints.get(3).x)); int maxY = (int) Math.max(Math.abs(bitmapPoints.get(0).y - bitmapPoints.get(3).y), Math.abs(bitmapPoints.get(1).y - bitmapPoints.get(2).y)); Log.d("max", "x=" + maxX + " y=" + maxY); //This is the desired final size Bitmap.Config conf = Bitmap.Config.ARGB_8888; correctedBitmap = Bitmap.createBitmap(maxX,maxY,conf); //the final bitmap float mVertices[] =generateVertices(bitmap.getWidth(),bitmap.getHeight()); Point mLeftTop = bitmapPoints.get(0); Point mRightTop = bitmapPoints.get(1); Point mLeftBot = bitmapPoints.get(3); Point mRightBot = bitmapPoints.get(2); //the points on the image where the user has clicked Canvas canvas = new Canvas(correctedBitmap); Matrix matrix = new Matrix(); matrix.setPolyToPoly( new float[]{mLeftTop.x, mLeftTop.y, mRightTop.x, mRightTop.y, mRightBot.x, mRightBot.y, mLeftBot.x, mLeftBot.y //the user's points }, 0, new float[]{0, 0, maxX - 1, 0, maxX - 1, maxY - 1, 0, maxY - 1 //where I want the user points in the corrected image } , 0, 4); canvas.concat(matrix); Paint paint = new Paint(); paint.setAntiAlias(true); //testing parameters paint.setFilterBitmap(true); //testing parameters paint.setColor(Color.BLUE); paint.setStyle(Paint.Style.STROKE); canvas.drawBitmapMesh(bitmap, WIDTH_BLOCK , HEIGHT_BLOCK, mVertices,0,null,0, paint); //draw the original bitmap into the corrected bitmap with PolyToPoly transformation matrix canvas.drawLine(mLeftTop.x, mLeftTop.y, mRightBot.x, mRightBot.y, paint); //draw two lines for testing the transformation matrix canvas.drawLine(mLeftBot.x, mLeftBot.y, mRightTop.x, mRightTop.y, paint); //bitmap.recycle(); //just testing return correctedBitmap; } 

    One Solution collect form web for “Distorsionar una imagen a un cuadrángulo falla en algunos casos en Android”

     private float[] generateVertices(int widthBitmap, int heightBitmap) { float[] vertices=new float[(WIDTH_BLOCK+1)*(HEIGHT_BLOCK+1)*2]; float widthBlock = (float)widthBitmap/WIDTH_BLOCK; float heightBlock = (float)heightBitmap/HEIGHT_BLOCK; for(int i=0;i<=HEIGHT_BLOCK;i++) for(int j=0;j<=WIDTH_BLOCK;j++) { vertices[i * ((HEIGHT_BLOCK+1)*2) + (j*2)] = j * widthBlock; vertices[i * ((HEIGHT_BLOCK+1)*2) + (j*2)+1] = i * heightBlock; } return vertices; } private Bitmap perspectiveTransformation(Bitmap bitmap, ArrayList<Point> bitmapPoints) { Bitmap correctedBitmap; int maxX = (int) Math.max(Math.abs(bitmapPoints.get(0).x - bitmapPoints.get(1).x), Math.abs(bitmapPoints.get(2).x - bitmapPoints.get(3).x)); int maxY = (int) Math.max(Math.abs(bitmapPoints.get(0).y - bitmapPoints.get(3).y), Math.abs(bitmapPoints.get(1).y - bitmapPoints.get(2).y)); Log.d("max", "x=" + maxX + " y=" + maxY); //This is the desired final size Bitmap.Config conf = Bitmap.Config.ARGB_8888; correctedBitmap = Bitmap.createBitmap(maxX,maxY,conf); //the final bitmap float mVertices[] =generateVertices(bitmap.getWidth(),bitmap.getHeight()); Point mLeftTop = bitmapPoints.get(0); Point mRightTop = bitmapPoints.get(1); Point mLeftBot = bitmapPoints.get(3); Point mRightBot = bitmapPoints.get(2); //the points on the image where the user has clicked Canvas canvas = new Canvas(correctedBitmap); Matrix matrix = new Matrix(); matrix.setPolyToPoly( new float[]{mLeftTop.x, mLeftTop.y, mRightTop.x, mRightTop.y, mRightBot.x, mRightBot.y, mLeftBot.x, mLeftBot.y //the user's points }, 0, new float[]{0, 0, maxX - 1, 0, maxX - 1, maxY - 1, 0, maxY - 1 //where I want the user points in the corrected image } , 0, 4); canvas.concat(matrix); Paint paint = new Paint(); paint.setAntiAlias(true); //testing parameters paint.setFilterBitmap(true); //testing parameters paint.setColor(Color.BLUE); paint.setStyle(Paint.Style.STROKE); canvas.drawBitmapMesh(bitmap, WIDTH_BLOCK , HEIGHT_BLOCK, mVertices,0,null,0, paint); //draw the original bitmap into the corrected bitmap with PolyToPoly transformation matrix canvas.drawLine(mLeftTop.x, mLeftTop.y, mRightBot.x, mRightBot.y, paint); //draw two lines for testing the transformation matrix canvas.drawLine(mLeftBot.x, mLeftBot.y, mRightTop.x, mRightTop.y, paint); //bitmap.recycle(); //just testing return correctedBitmap; } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.