Image processing 如何实施;卓越如「&引用;添加单元格“;进入画布

Image processing 如何实施;卓越如「&引用;添加单元格“;进入画布,image-processing,draw,image-manipulation,Image Processing,Draw,Image Manipulation,我为这个标题感到抱歉,它可能无法恰当地描述我想要实现的目标。我开始开发一个新的软件,它应该向用户呈现一个“网格”,用户可以通过在这个“网格”的任何一点添加“行”或“列”来操纵它。问题是,我不确定真正的网格是否是合适的解决方案,因为存在一些“图形化”需求,如更改虚拟单元格大小、嵌套它们、缩放/拉伸等。因此,我开始分析WPF中使用DrawingVisual元素的解决方案(出于性能原因)。 我能够以所需的方式绘制“网格”。我还可以在图形的边缘添加行或列。但我想不出在“中间”修改它的任何解决方案(除了重

我为这个标题感到抱歉,它可能无法恰当地描述我想要实现的目标。我开始开发一个新的软件,它应该向用户呈现一个“网格”,用户可以通过在这个“网格”的任何一点添加“行”或“列”来操纵它。问题是,我不确定真正的网格是否是合适的解决方案,因为存在一些“图形化”需求,如更改虚拟单元格大小、嵌套它们、缩放/拉伸等。因此,我开始分析WPF中使用DrawingVisual元素的解决方案(出于性能原因)。 我能够以所需的方式绘制“网格”。我还可以在图形的边缘添加行或列。但我想不出在“中间”修改它的任何解决方案(除了重新绘制整个内容)。我会用图像更好地解释我。左边是第一次绘制后的“网格”。在右边有一个新的网格,应该在用户执行操作后绘制

下面是一个更复杂的示例,其中“行”添加到现有单元格中,导致所有单元格“增长”

正如我所说的,我知道我可以重新绘制整个过程,但我担心性能。请记住,在真实场景中,可能有数千个块和许多嵌套级别


如有任何建议,我们将不胜感激。WPF的使用不是强制性的,但它将是.NET 5.0中的桌面应用程序。DrawingVisual的使用不是强制性的。我可以评估任何解决方案。谢谢。

一种简单的方法是,在第一次绘制表格时,将列相对于画布左侧的位置保留在变量中。当您想要添加一个新列时,您可以从该点裁剪图像,并在一个更大的画布中,复制左、右部分,然后从一开始就绘制中间的列

当然,可以使用图像处理技术计算每列的坐标,但这会降低性能

我用Python编写了这段代码,但我认为将其转换为C并不困难


输出:


谢谢!这是一个很好的建议,我已经尝试过类似的方法。我的第二个例子有点复杂,因为我不能裁剪图像!无论如何,我会在接下来的几天里详细阐述你的想法@ufo求求你:)我对第二种情况有了一些不同的想法。如果更改画布的大小,问题将得到解决。但是如果需要缩小单元格,我认为只要重新绘制边界单元格,问题就会解决。我参与了一个项目,如果时机成熟,我会写第二个案例的例子:)
import cv2
import numpy as np

# copy image over another
def imdraw(im, over, x, y):
    y1, y2 = y, y + over.shape[0]
    x1, x2 = x, x + over.shape[1]
    for c in range(0, 3):
        im[y1:y2, x1:x2, c] = over[:, :, c]
    return im


pt = 220
col = 300
off = 15

im = cv2.imread("grid.png", 1)
h, w = im.shape[:2]

crop_left = im[0 : 0 + h, 0:pt]
crop_right = im[0 : 0 + h, pt:w]

cv2.imwrite("left.jpg", crop_left)
cv2.imwrite("right.jpg", crop_right)

# Create an Empty image with white background
out = 255 * np.ones(shape=[h, w + col, 3], dtype=np.uint8)

out = imdraw(out, crop_left, 0, 0)
out = imdraw(out, crop_right, pt + col, 0)

out = cv2.rectangle(
    out,
    pt1=(pt + off, off),
    pt2=(pt + col - off, h - off),
    color=(128, 0, 200),
    thickness=5,
    lineType=cv2.LINE_AA,
)

cv2.imwrite("out.jpg", out)