Estiramiento Mapa de bits en una esquina específica
¿Es posible estirar un mapa de bits en una esquina específica? La siguiente imagen muestra mi intención:
- Selección de Android OpenGL 3D
- Android visualiza la transformación de rotación 3D en pantallas de gran resolución
- Voltear una imagen de mapa de bits horizontal o verticalmente
- ¿Cuál es la diferencia entre `Matrix.setRotate` y` Matrix.postRotate`
- Android: ¿Hay algún evento desencadenado cuando activity.setContentView ha terminado de procesar?
Tiro una foto con la cámara, detecto las esquinas en la imagen y quiero transformar el contenido. Por lo que sé esto no se puede lograr con la clase Matrix solo. La clase Cámara debería ayudar, pero tendría que calcular la posición de la cámara. ¿Existe un algoritmo para este propósito? ¿Cómo harías esto?
- Android ImageView - Obtener coordenadas de tap (clic) independientemente de la ubicación de desplazamiento o la escala de zoom
- Vista de la imagen de Android escala de la matriz + traducir
- Android: gira la imagen en ImageView por 90degrees pero sin demora
- Recortar una transformación de perspectiva de la imagen en Android
- ¿Por qué a veces Bitmaps son los mismos objetos?
- La rareza de Android OpenGL con el método setLookAtM
- Cambiar mapa de bits Color con función
- Copiar una matriz de bits de la imagen de mapa de bits en la programación ANDROID
Usted me hizo mirar en este problema muy interesante y parece fácil hacerlo en Android. Utilice coordenadas absolutas para los cuatro puntos de la malla:
float[] mVerts = { topLeftX, topLeftY, topRightX, topRightY, bottomLeftX, bottomLeftY, bottomRightX, bottomRightY }; canvas.drawBitmapMesh(myImage, 1, 1, mVerts, 0, null, 0, null);
Usted tendría que averiguar cómo obtener estos puntos, pero drawBitmapMesh se extenderá por usted.
Supongo que la forma más fácil de hacer esa transformación en Android es usar OpenGL. Puede tratar su mapa de bits como una textura. A continuación, puede utilizar las esquinas detectadas como coordenadas de textura. Asigne cada uno de ellos como coordenadas de textura al vértice correspondiente de una forma rectangular simple. Luego pida a OpenGL que lo dibuje en su lienzo. Pseudocódigo:
glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, pictureId); glBegin(GL_QUAD); glVertex(0,0); // left upper corner glTexCoord(corners[0].x/picture.getWidth(), corners[0].y/picture.getHeight()); glVertex(1,0); // right upper corner glTexCoord(corners[1].x/picture.getWidth(), corners[1].y/picture.getHeight()); glVertex(1,1); // right lower corner glTexCoord(corners[2].x/picture.getWidth(), corners[2].y/picture.getHeight()); glVertex(0,1); // left lower corner glTexCoord(corners[3].x/picture.getWidth(), corners[3].y/picture.getHeight()); glEnd();
No necesitas ninguna cámara ni transformaciones complicadas. Por supuesto, no es muy conveniente como el uso de OpenGL para tal tarea fácil es una exageración. Pero, no hay realmente una manera más fácil excepto escribir tal texturing por se. Si lo desea, puede comenzar a leer desde wiki e ir a enlaces externos y buscar por ejemplo la implementación de software de métodos de texturización:
http://en.wikipedia.org/wiki/Texture_mapping
También puede intentar usar cualquiera de las vistas de efectos de OpenGL, simplificará la configuración, pero también le pedirá un sombreado o dos:
- Android sqlite3_limit?
- ¿No se muestran los indicadores de error (para validaciones de formularios) para android 4.2?