【问题标题】:Stretch Bitmap at specific corner在特定角落拉伸位图
【发布时间】:2013-03-01 13:02:12
【问题描述】:

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

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

【问题讨论】:

    标签: android matrix bitmap camera transform


    【解决方案1】:

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

    float[] mVerts = {
           topLeftX, topLeftY, 
           topRightX, topRightY, 
           bottomLeftX, bottomLeftY, 
           bottomRightX, bottomRightY
           };
    
    canvas.drawBitmapMesh(myImage, 1, 1, mVerts, 0, null, 0, null);
    

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

    【讨论】:

    • 这正是我想要的。谢谢。
    【解决方案2】:

    我想在 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/

    【讨论】:

      猜你喜欢
      • 2015-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      相关资源
      最近更新 更多