当前位置: 首页 > 知识库问答 >
问题:

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

白才捷
2023-03-14

我在FrameLayout中的SurfaceView画布上画线。我从相机预览中接收图像,对其进行处理,获取矩形的坐标并在画布上绘制线条。绘制时,我得到这些线在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)。实际坐标与预览位图上的坐标相同,但不在画布上。

我怎样才能克服这个问题,并把线放在正确的位置上?

提前谢谢你。

共有1个答案

包阳成
2023-03-14

所以我发现,相机预览尺寸确实与画布尺寸不同。我的预览尺寸是1920X1080,画布1845X1080左右,所以这就是Y坐标被移动的原因。我刚刚找出差异比率并分别用该比率画线。画布分辨率可以用Canvas.getWidth()、Canvas.getHeight()找到。

 类似资料:
  • 除了把画布绘图保存到本地存储或离线数据库,我们也可以使用data URL把画布绘图保存为图像,以便用户再把它保存到本地计算机。本节,我们将获取画布绘图的data URL,再把它设置为image对象的源,以便用户可以右击,作为PNG图像进行下载。 绘制步骤 按照以下步骤,把画布绘图另存为图像: 1. 定义画布上下文,并绘制一幅云状图形: window.onload = function(){

  • 我正在使用而不是将背景、边框和/或背景色应用到页面的某个区域(主要是因为需要页面来构建,而不需要。因为我的内容可能会持续几页)。问题是,如果坐标(x=0,y=0)意味着左下角,则图像的位置不会像预期的那样。我还想将画布定位到一个固定的位置,但是似乎不起作用。请参阅附上的原始图像和要定位在{x,y,width,height}={100f,100f,200f,200f}的图像,该图像应该在页面的底部(

  • 我正在写一个小烧瓶应用程序来识别手写数字(0-9)。我写了几乎所有的元素(机器学习模型、web应用等),但我在捕捉图像(使用画布绘制)时遇到了问题,比如: 我想获取图像并将其保存到临时文件中。我懂Python,但从未使用过JavaScript,这是使用Canvas所必需的。 HTML: JS: 函数使用浏览器保存管理器保存图像,但我想将其保存到临时文件,稍后再使用图像。

  • 我试图使用矩阵旋转位图。然后我试着把它画在画布上。但它就这么消失了! 下面是我的代码: } 我已经删除了缩放画布和事件监听器等的函数。使代码小而易读。 我周期性地调用setDirection方法,但是在它被调用之后,“userImage”drawable就消失了。有人能告诉我这里出了什么问题吗。。 谢谢

  • 我正在运行Ubuntu 16.04。在Android Studio上,当我试图在模拟器中运行我的应用程序时,我得到以下错误: 致命的例外:主要过程:项目名称在这里,PID: 2528java.lang.运行时间例外:画布:试图绘制太大(216090000bytes)位图。在android.view.DisplayListCanvas.throw如果不能绘制(DisplayListCanvas.ja

  • 我正在努力寻找一种方法/策略来处理存储坐标的绘图,以及我的web应用程序在不同设备和屏幕大小上画布尺寸的变化。 基本上我想在画布上显示一个图像。用户将在图像区域上标记两个点,应用程序记录这些标记的放置位置。其想法是,用户将每隔一天使用该应用程序,能够看到之前绘制的X个点的位置,并能够在之前没有标记的地方添加两个新点。画布当前设置为高度=窗口。内部高度和宽度=窗口。内部宽度/2。 我最初的想法是记录