我正在使用FrameLayout中的SurfaceView Canvas绘制线条。我从相机预览中接收图像,处理它,获取矩形的坐标并在画布上生成它的线条。我在绘制时得到y轴上这些线的位移,线越低,发生的位移越大(见下图):
用红线标记(使用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。
如何克服此问题并在确切位置放置线条?
提前谢谢。
答案 0 :(得分:0)
所以我发现,相机预览尺寸确实与画布尺寸不同。我的预览尺寸是1920X1080,画布1845X1080左右,这就是为什么Y坐标被取代了。我刚刚发现了差异比率并分别用这个比例绘制了线条。可以使用Canvas.getWidth(),Canvas.getHeight()找到画布分辨率。