绘图时图像和画布坐标位移

时间:2016-03-12 16:09:42

标签: java android image-processing canvas bitmap

我正在使用FrameLayout中的SurfaceView Canvas绘制线条。我从相机预览中接收图像,处理它,获取矩形的坐标并在画布上生成它的线条。我在绘制时得到y轴上这些线的位移,线越低,发生的位移越大(见下图):

enter image description here enter image description here

用红线标记(使用Paint程序,而不是实际应用程序)下方线坐标坐标位于位图的大致位置,以及矩形的下方绿线(由实际应用程序放置,在画布上绘制) )以及红线表示,有多少坐标被移位。顶部的坐标不能穿过屏幕,但是在底部它们可以 - 如果矩形足够低,线条在屏幕下方,但在顶部它们不会(它们不应该在所有4个边中的任何一个上做,因为给定的坐标永远不会超出位图。

绘图功能如下所示:

public void DrawAllContours(List<Point[]> rectPoints, int ratio)
{
    paint.setColor(Color.GREEN);
    paint.setStrokeWidth(2.5f);

    canvas = sh.lockCanvas();
    canvas.drawColor(0, PorterDuff.Mode.CLEAR);

    for (int i = 0; i < rectPoints.size(); i++)
    {
        for (int j = 0; j < 4; j++)
            canvas.drawLine((float)rectPoints.get(i)[j].x*ratio, (float)rectPoints.get(i)[j].y*ratio,
                    (float)rectPoints.get(i)[(j+1)%4].x*ratio, (float)rectPoints.get(i)[(j+1)%4].y*ratio, paint);
    }

    sh.unlockCanvasAndPost(canvas);
}

比率变量是实际预览图像大小与调整大小的位图之间的差异,用于处理大小(通常值为3)。 实际坐标应与预览位图相同,但不适用于Canvas。

如何克服此问题并在确切位置放置线条?

提前谢谢。

1 个答案:

答案 0 :(得分:0)

所以我发现,相机预览尺寸确实与画布尺寸不同。我的预览尺寸是1920X1080,画布1845X1080左右,这就是为什么Y坐标被取代了。我刚刚发现了差异比率并分别用这个比例绘制了线条。可以使用Canvas.getWidth(),Canvas.getHeight()找到画布分辨率。