Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF中的每像素蚂蚁选择边界_C#_Wpf - Fatal编程技术网

C# WPF中的每像素蚂蚁选择边界

C# WPF中的每像素蚂蚁选择边界,c#,wpf,C#,Wpf,我发现了一些矩形行进蚂蚁的选择方法,主要是使用矩形,比如上面的这个。使用一个形状和故事板可以工作。问题是我使用缩放布局变换控制缩放,这也会改变形状边界的大小 但是,我希望能够创建每像素选择边界: 我目前的计划是存储一个位图,其中包含一个表示当前选定像素的位掩码,但是我必须使用类似于构建表示边框的复合图的方法来遍历其周长 不过,也许还有更好的办法 下面是一些假设的XAML,展示了我的计划: <ScrollViewer Name="PART_Workspace" Grid.Column="1

我发现了一些矩形行进蚂蚁的选择方法,主要是使用矩形,比如上面的这个。使用一个形状和故事板可以工作。问题是我使用缩放布局变换控制缩放,这也会改变形状边界的大小

但是,我希望能够创建每像素选择边界:

我目前的计划是存储一个位图,其中包含一个表示当前选定像素的位掩码,但是我必须使用类似于构建表示边框的复合图的方法来遍历其周长

不过,也许还有更好的办法

下面是一些假设的XAML,展示了我的计划:

<ScrollViewer Name="PART_Workspace" Grid.Column="1" 
        VerticalScrollBarVisibility="Auto" 
        HorizontalScrollBarVisibility="Auto">

    <Grid x:Name="PART_Grid" RenderTransformOrigin="0.5,0.5">
        <Grid.LayoutTransform>
            <TransformGroup>
                <!-- This controls the zoom -->
                <ScaleTransform x:Name="PART_ScaleTransform"/>
            </TransformGroup>
        </Grid.LayoutTransform>

        <Canvas x:Name="PART_SelectionLayer">

            <!-- THIS REGION TO BE GENERATED AT RUNTIME -->
            <Path Style="{StaticResource SelectionBorder}"
                  StrokeThickness="! Possibly multiply this by inverse of zoom? !">
                <Path.Data>
                    <PathGeometry> <!-- one border around a region --> </PathGeometry>
                    <!-- additional borders -->
                </Path.Data>
            </Path>
            <!-- THIS REGION TO BE GENERATED RUNTIME -->

        </Canvas>

        <Viewbox Grid.Column="0" Grid.Row="0">
        <!-- This displays the bitmap, which is updated elsewhere by code -->
        <Image x:Name="PART_ImageCanvas" RenderOptions.BitmapScalingMode="NearestNeighbor"/>
        </Viewbox>
    </Grid>
</ScrollViewer>

如果您正在处理表示选择的位掩码,并且希望获得表示选择轮廓的一个像素边框,则可以使用方形形态学操作符来完成此操作。一旦你这样做了,你就掩盖了一个模式,并将其覆盖,以获得行进中蚂蚁的近似值

从二进制选择掩码开始,其中选择1,取消选择0:

使用3倍方形内核放大遮罩,并从放大图像中减去原始图像:

使用棋盘格图案遮罩轮廓,以获得行进中的蚂蚁:

将遮罩覆盖在原始图像上以获得整体效果。移动棋盘以获得“追逐”效果:

这可以在一个相当简单的紧循环中完成,唯一复杂的部分是膨胀,可以从org.net或OpenCV获得。每像素,循环最终执行以下操作:

if (dialated & !selected) 
{
    if (checkerboard)
    {
        pixel = red;
    }
}


如果您已经有了轮廓路径,并且希望它与已缩放的图像匹配,我将以屏幕单位缩放轮廓。这样,
BorderThickness
UseLayoutRounding
都将按预期工作。

您能否给出一个简明的(xaml)示例,说明您试图添加选择边框的内容?(或者,如果您正在使用位图,是否正在处理表示选定像素的位掩码?)位掩码表示选定像素。也就是说,选定像素不符合任何控件。它们表示图像中的像素,由一个完全独立的数据结构决定,该数据结构不是WPF的一部分。无论如何,这是目前的想法。