C# 快速生成带状图像?

C# 快速生成带状图像?,c#,.net,wpf,image,C#,.net,Wpf,Image,我需要生成墙的预览图像以便动态显示。它们都将由不同颜色和宽度的条纹组成,看起来应该是这样的: 现在我让它工作,但它有点慢(不可怕,但足以让它感觉有点滞后),我想知道是否有更好的方法 我目前正在做的是在代码中构造wpf对象。我构造了一个网格作为主容器,然后是一个堆栈面板作为预览,然后是一个底部有标签的文本块(很抱歉,从这个图像中裁剪出来),然后我为每个层(带)添加边框对象,边框厚度作为轮廓,适当的颜色作为背景,等等。然后我使用 RenderTargetBitmap bmp = n

我需要生成墙的预览图像以便动态显示。它们都将由不同颜色和宽度的条纹组成,看起来应该是这样的:

现在我让它工作,但它有点慢(不可怕,但足以让它感觉有点滞后),我想知道是否有更好的方法

我目前正在做的是在代码中构造wpf对象。我构造了一个网格作为主容器,然后是一个堆栈面板作为预览,然后是一个底部有标签的文本块(很抱歉,从这个图像中裁剪出来),然后我为每个层(带)添加边框对象,边框厚度作为轮廓,适当的颜色作为背景,等等。然后我使用

        RenderTargetBitmap bmp = new RenderTargetBitmap((int)gd.ActualWidth, (int)gd.ActualHeight, 96, 96, PixelFormats.Pbgra32);
        bmp.Render(gd);
其中gd是网格对象,它保存堆栈面板和文本块,然后将其用作图像源

我使用图像源而不是直接使用WPF对象的原因有两个。首先,我有其他对象,它们是需要加载和预览的实际图像文件,所以它们是作为图像源,而不是WPF视觉。其次,我有一个缩略图和一个完整的预览。我希望能够将缩略图显示为预览的缩小版本,如果是wpf对象,我认为您无法做到这一点(至少不容易做到)

无论如何,如果有人有更好的方法来做这件事,我会非常感激

如果有人有更好的方法,我会非常感激

您可以在
矩形中使用简单的
LinearGradientBrush
创建墙“图案”。这是所显示图案的近似值:

<Border BorderBrush="#FF393939" BorderThickness="10" Background="Black" Padding="2">
    <Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
        <Rectangle.Fill>
            <LinearGradientBrush StartPoint="0,0" EndPoint="1,0">
                <GradientStop Offset="0" Color="#FFAA6268" />
                <GradientStop Offset="0.195" Color="#FFAA6268" />
                <GradientStop Offset="0.196" Color="#FF8B8B8B" />
                <GradientStop Offset="0.204" Color="#FF8B8B8B" />
                <GradientStop Offset="0.205" Color="#FFE3E3E3" />
                <GradientStop Offset="0.395" Color="#FFE3E3E3" />
                <GradientStop Offset="0.396" Color="#FF6F6F6F" />
                <GradientStop Offset="0.404" Color="#FF6F6F6F" />
                <GradientStop Offset="0.405" Color="#FFFF" />
                <GradientStop Offset="0.595" Color="#FFFF" />
                <GradientStop Offset="0.596" Color="#FF555555" />
                <GradientStop Offset="0.604" Color="#FF555555" />
                <GradientStop Offset="0.605" Color="#FFD4B371" />
                <GradientStop Offset="0.665" Color="#FFD4B371" />
                <GradientStop Offset="0.666" Color="#FF555555" />
                <GradientStop Offset="0.674" Color="#FF555555" />
                <GradientStop Offset="0.675" Color="#FFC7C7C7" />
                <GradientStop Offset="0.97" Color="#FFC7C7C7" />
                <GradientStop Offset="0.98" Color="#FF5E5E5E" />
                <GradientStop Offset="1.0" Color="#FF5E5E5E" />
            </LinearGradientBrush>
        </Rectangle.Fill>
    </Rectangle>
</Border>

好的,所以我最后做的是从其中的一些信息中得知的,并且似乎工作得很好

在考虑了@HighCore建议的数据模板之后,我意识到我可以使用ContentTemplateSelector类来确定单独的模板,根据它是位图还是像这样的自动生成的项目。然后,我为每个需要的预览类型创建了标准的XAML模板,并将它们提供给模板选择器

因为我已经有了为分层预览生成WPF可视元素的代码,所以我做了一些分析,发现(毫不奇怪)生成位图是所需的绝大多数时间。然后,我在我的视图模型上创建了一个属性,该属性返回我生成的WPF元素,并使模板正确绑定到预览的内容源

另一件可能对某人有帮助的重要事情是我发现了我以前从未使用过的ViewBox类。这正是我所说的,通过缩放WPF元素来适应一个盒子。我的缩略图模板是一个具有特定大小的视图框,带有Stretch=“Uniform”。viewbox中的内容是wpf元素或图像。在全尺寸版本中,我也使用了一个视图框,但只设置了最大尺寸(这样,如果内容超过最大尺寸,它将自动缩小)


希望这能帮助某人…

如果我误解了,我很抱歉,但我认为这根本解决不了我的问题。如果这是一个静态的层数,那么我可以使用XAML,并且很乐意这样做,但它可以从一个层到理论上的无限层(实际上可能不超过10层)。如何设置XAML代码来处理这个问题?如果我这样做了,那么我在哪里有图像呢?我有多个对象(数十万个),一些预览是用这种方式生成的,一些有实际加载的图像文件。另外,如何动态缩放以适应thubmnail?我想明确一点,我希望使用纯XAML并按照您的建议使用WPF图形,我只是不知道该怎么做,你的评论也没有具体的细节来说明如何这样做……
你将如何设置XAML代码来处理这个问题?
-通过使用
ItemsControl
和适当的数据模板。删除所有代码并开始阅读和删除。基本上,WPF中所有基于项的UI都是使用ItemsControl完成的,而不管它们的视觉外观如何。关于比例,我已经告诉过你WPF会自动缩放,不用担心。我不知道为什么没有人提到你只需要一个
LinearGradientBrush
和一个
矩形
就可以创建那个“图像”。。。绝对不需要
位图图像
s或
图像
s。有趣的方法,我没有想到。然而,它似乎真的很难做到与一个动态层集。。。但要记住的是一种创造性的方式……实际上,我要说的是,以编程方式进行比在XAML中进行更容易。每行有两个偏移,总宽度=
1.0
。一点点数学知识就可以准确地计算出每一行应该放在哪里。我想是的。然而,我已经有了做堆叠边界的数学,所以对我来说,使用它更容易:)。这仍然不能解决使用加载的图像文件的问题,所以我不能将其标记为答案,但我投票了,因为这是一个非常有帮助和创造性的解决方案,请记住。。。
<Border BorderBrush="#FF393939" BorderThickness="10" Background="Black" Padding="2">
    <Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
        <Rectangle.Fill>
            <VisualBrush Stretch="Uniform">
                <VisualBrush.Visual>
                    <Image Source="pack://application:,,,/WpfApplication2;component/Images/Image.png" />
                </VisualBrush.Visual>
            </VisualBrush>
        </Rectangle.Fill>
    </Rectangle>
</Border>