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