将图像划分为棋盘类型(mxn),对于图像的每个备选子块,应使用C#WPF进行灰度处理

将图像划分为棋盘类型(mxn),对于图像的每个备选子块,应使用C#WPF进行灰度处理,c#,wpf,wpf-controls,wpfdatagrid,C#,Wpf,Wpf Controls,Wpfdatagrid,我是C#WPF的初学者,我想把一幅彩色图像分成m x n个子块,假设我把一幅图像分成4 x 4个块,那么如果子块(1,1)是彩色的,那么(1,2)应该是灰度的,接下来(1,3)是彩色的。因此,整个图像块应该在颜色和灰度之间交替。我不太擅长WPF,所以任何人都可以指导我如何将图像划分为子块,以及如何在每个子块之间交替颜色。 到目前为止,我所做的是在MainWindow.xaml文件中编写了以下代码。 我的想法是在主窗口中插入一个图像,使用RowDefinition/ColumnDefinition

我是C#WPF的初学者,我想把一幅彩色图像分成m x n个子块,假设我把一幅图像分成4 x 4个块,那么如果子块(1,1)是彩色的,那么(1,2)应该是灰度的,接下来(1,3)是彩色的。因此,整个图像块应该在颜色和灰度之间交替。我不太擅长WPF,所以任何人都可以指导我如何将图像划分为子块,以及如何在每个子块之间交替颜色。 到目前为止,我所做的是在MainWindow.xaml文件中编写了以下代码。 我的想法是在主窗口中插入一个图像,使用RowDefinition/ColumnDefinition或gridSplitter将其拆分为网格。但我无法实现我想要的。有人能帮我吗?提前谢谢

 <Window x:Class="Enter_your_name.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Image Source="D:/training/black.png" >

        </Image> 
        <Grid.ColumnDefinitions>

            <ColumnDefinition />
            <ColumnDefinition />
            <ColumnDefinition />
            <ColumnDefinition />
       </Grid.ColumnDefinitions>

        <Grid.RowDefinitions>

            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>  
    </Grid>
</Window>

您可以覆盖图像的原始版本和灰度版本(即使用两个图像),并确保灰度版本是最上面的版本。然后将棋盘画笔作为不透明度遮罩应用于灰度版本。这会产生一种“棋盘洞”的图案,让原始图像闪闪发光

以下是一个例子:

<Window x:Class="WpfApplication21.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <BitmapImage x:Key="originalImage"  DecodePixelWidth="200" UriSource="c:\temp\test_picture.jpg"/>
        <FormatConvertedBitmap x:Key="grayScaleImage"
                Source="{StaticResource originalImage}" 
                DestinationFormat="Gray32Float"></FormatConvertedBitmap>
        <DrawingBrush x:Key="checkerboardBrush" Stretch="UniformToFill" TileMode="Tile" Viewport="0,0,0.5,0.5" ViewportUnits="RelativeToBoundingBox">
            <DrawingBrush.Drawing>
                <DrawingGroup>
                    <GeometryDrawing Brush="#00FFFFFF">
                        <GeometryDrawing.Geometry>
                            <RectangleGeometry Rect="0,0,2,2" />
                        </GeometryDrawing.Geometry>
                    </GeometryDrawing>
                    <GeometryDrawing Brush="#FF000000">
                        <GeometryDrawing.Geometry>
                            <GeometryGroup>
                                <RectangleGeometry Rect="0,0,1,1" />
                                <RectangleGeometry Rect="1,1,1,1" />
                            </GeometryGroup>
                        </GeometryDrawing.Geometry>
                    </GeometryDrawing>
                </DrawingGroup>
            </DrawingBrush.Drawing>
        </DrawingBrush>
    </Window.Resources>
    <Grid>
        <Image Source="{StaticResource originalImage}" Panel.ZIndex="1"/>
        <Image Source="{StaticResource grayScaleImage}" Panel.ZIndex="2" OpacityMask="{StaticResource checkerboardBrush}"/>
    </Grid>
</Window>


为了更改NxM模式,您需要调整
DrawingBrush
Viewport
属性,这是一个很好的挑战,我将尝试一下。如果我没有错,你想为给定的图像创建交替颜色和黑白的马赛克瓷砖。如果我错过了,请纠正我something@pushpraj-是的,你说得很对。@fmunkert-非常感谢。我可以用你的代码片段轻松做到这一点。但是我该如何对只有垂直线或水平线的图像使用相同的效果呢?好把戏!顺便说一句,是否也可以在不计算的情况下使瓷砖合适?@pushpraj:我已经调整了我的样本,这样它需要更少的计算,瓷砖正好适合
Viewport=“0,0,0.5,0.5”表示4x4瓷砖,
Viewport=“0,0,25,25”表示8x8瓷砖,依此类推。或者一般来说,
0,0,x,y
表示2/x乘2/y平铺。@Jonas:你的意思是只需要垂直线或水平线而不是棋盘格图案吗?如果是,则使用绘制垂直或水平线的
DrawingGroup