4

是否可以在特定角落拉伸位图?下图显示了我的意图:

在此处输入图像描述

我用相机拍摄照片,检测图像中的角落并想要转换内容。据我所知,仅靠Matrix类无法做到这一点。Camera类应该有帮助,但我需要计算相机的位置。有没有为此目的的算法?你会怎么做?

4

2 回答 2

5

您让我研究了这个非常有趣的问题,并且在 Android 中似乎很容易做到。对 Mesh 的四个点使用绝对坐标:

float[] mVerts = {
       topLeftX, topLeftY, 
       topRightX, topRightY, 
       bottomLeftX, bottomLeftY, 
       bottomRightX, bottomRightY
       };

canvas.drawBitmapMesh(myImage, 1, 1, mVerts, 0, null, 0, null);

您必须弄清楚如何获得这些点,但 drawBitmapMesh 会为您拉伸它。

于 2013-03-13T17:20:52.600 回答
0

我想在 Android 上进行这种转换的最简单方法是使用 OpenGL。您可以将位图视为纹理。然后您可以将检测到的角用作纹理坐标。将它们中的每一个作为纹理坐标分配给简单矩形的相应顶点。然后让 OpenGL 在你的画布上绘制它。伪代码:

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();

您不需要任何相机或复杂的变换。当然这不是很方便,因为使用 OpenGL 来完成如此简单的任务是相当过分的。但是,除了自己编写这样的纹理之外,真的没有更简单的方法。如果您愿意,您可以从 wiki 开始阅读并转到外部链接并查找纹理方法的示例软件实现:

http://en.wikipedia.org/wiki/Texture_mapping

您也可以尝试使用任何 OpenGL 效果视图,它会简化设置,但也会要求您提供一两个着色器:

http://code.google.com/p/effect-view/

于 2013-03-13T14:46:24.127 回答