是否可以在特定角落拉伸位图?下图显示了我的意图:
我用相机拍摄照片,检测图像中的角落并想要转换内容。据我所知,仅靠Matrix类无法做到这一点。Camera类应该有帮助,但我需要计算相机的位置。有没有为此目的的算法?你会怎么做?
您让我研究了这个非常有趣的问题,并且在 Android 中似乎很容易做到。对 Mesh 的四个点使用绝对坐标:
float[] mVerts = {
topLeftX, topLeftY,
topRightX, topRightY,
bottomLeftX, bottomLeftY,
bottomRightX, bottomRightY
};
canvas.drawBitmapMesh(myImage, 1, 1, mVerts, 0, null, 0, null);
您必须弄清楚如何获得这些点,但 drawBitmapMesh 会为您拉伸它。
我想在 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 效果视图,它会简化设置,但也会要求您提供一两个着色器: