C# 如何使用C中的WPF从多个导入的图像制作图像拼贴?
我需要导入多个图像,并在一个图像中处理它们,就像拼贴一样。我只需要简单的工具,如翻译图像、旋转图像等 Im在学习mvvm的过程中,大部分视图都是做出来的。我不知道如何将导入的图像添加到一个画布。是否有某种内置的图像类可以使用?或者我可以从哪个图书馆开始 现在我可以将图像导入列表。C# 如何使用C中的WPF从多个导入的图像制作图像拼贴?,c#,wpf,image,mvvm,graphics,C#,Wpf,Image,Mvvm,Graphics,我需要导入多个图像,并在一个图像中处理它们,就像拼贴一样。我只需要简单的工具,如翻译图像、旋转图像等 Im在学习mvvm的过程中,大部分视图都是做出来的。我不知道如何将导入的图像添加到一个画布。是否有某种内置的图像类可以使用?或者我可以从哪个图书馆开始 现在我可以将图像导入列表。 我的目标是能够将所选图像添加到画布上,并在画布上操作该图像,然后导出/保存该图像。然而,您看到的内容太广泛,无法回答,但这里有一个小示例 xaml 代码隐藏 private void canvas_MouseD
我的目标是能够将所选图像添加到画布上,并在画布上操作该图像,然后导出/保存该图像。然而,您看到的内容太广泛,无法回答,但这里有一个小示例 xaml 代码隐藏
private void canvas_MouseDown(object sender, MouseButtonEventArgs e)
{
Random rand = new Random(DateTime.Now.Millisecond);
var uriSource = new Uri(@"desert.jpg", UriKind.Relative);
for (int i = 0; i < 10; i++)
{
Image img = new Image();
img.Width = rand.NextDouble() * 200;
img.Height = rand.NextDouble() * 200;
img.Stretch= Stretch.UniformToFill;
img.Source = new BitmapImage(uriSource);
img.RenderTransform = new RotateTransform(rand.NextDouble() * 360);
Canvas.SetLeft(img, (rand.NextDouble() * canvas.ActualWidth));
Canvas.SetTop(img, (rand.NextDouble() * canvas.ActualHeight));
canvas.Children.Add(img);
}
}
结果
以上内容也可以通过MVVM的方式完成,如果您也希望看到,请告诉我
MVVM方法
下面是通过MVVM对上述代码的复制
xaml
通过向模板添加更多细节,我增强了视图
视图模型、模型和转换器类
namespace CSharpWPF
{
class ViewModel : DependencyObject
{
public ViewModel()
{
Images = new ObservableCollection<CollageImage>();
GenerateCollage();
}
public ObservableCollection<CollageImage> Images { get; private set; }
public void GenerateCollage()
{
Random rand = new Random(DateTime.Now.Millisecond);
var uriSource = new Uri(@"desert.jpg", UriKind.Relative);
for (int i = 0; i < 10; i++)
{
CollageImage img = new CollageImage();
img.Left = (0.2 + rand.NextDouble()) % 0.8;
img.Top = (0.2 + rand.NextDouble()) % 0.8;
img.Width = 100 + rand.NextDouble() * 100;
img.Height = 100 + rand.NextDouble() * 100;
img.Image = "desert.jpg";
img.Angle = rand.NextDouble() * 360;
Images.Add(img);
}
}
}
class CollageImage
{
public string Image { get; set; }
public double Left { get; set; }
public double Top { get; set; }
public double Width { get; set; }
public double Height { get; set; }
public double Angle { get; set; }
}
class ImageLocationConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
double value = (double)values[0];
double max = (double)values[1];
return value * max;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
结果
正是我要找的。了解您的mvvm方法将非常有帮助。
<Grid>
<Grid.Resources>
<l:ViewModel x:Key="viewModel" />
<l:ImageLocationConverter x:Key="ImageLocationConverter" />
<Style TargetType="ContentPresenter">
<Setter Property="Canvas.Left">
<Setter.Value>
<MultiBinding Converter="{StaticResource ImageLocationConverter}">
<Binding Path="Left" />
<Binding Path="ActualWidth"
RelativeSource="{RelativeSource FindAncestor,AncestorType=Canvas}" />
</MultiBinding>
</Setter.Value>
</Setter>
<Setter Property="Canvas.Top">
<Setter.Value>
<MultiBinding Converter="{StaticResource ImageLocationConverter}">
<Binding Path="Top" />
<Binding Path="ActualHeight"
RelativeSource="{RelativeSource FindAncestor,AncestorType=Canvas}" />
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
</Grid.Resources>
<ItemsControl ItemsSource="{Binding Images,Source={StaticResource viewModel}}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Border BorderBrush="White"
BorderThickness="5">
<Image Source="{Binding Image}"
Width="{Binding Width}"
Height="{Binding Height}"
Stretch="UniformToFill">
</Image>
<Border.RenderTransform>
<RotateTransform Angle="{Binding Angle}" />
</Border.RenderTransform>
</Border>
<Grid.Effect>
<DropShadowEffect Opacity=".5"
BlurRadius="10" />
</Grid.Effect>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
namespace CSharpWPF
{
class ViewModel : DependencyObject
{
public ViewModel()
{
Images = new ObservableCollection<CollageImage>();
GenerateCollage();
}
public ObservableCollection<CollageImage> Images { get; private set; }
public void GenerateCollage()
{
Random rand = new Random(DateTime.Now.Millisecond);
var uriSource = new Uri(@"desert.jpg", UriKind.Relative);
for (int i = 0; i < 10; i++)
{
CollageImage img = new CollageImage();
img.Left = (0.2 + rand.NextDouble()) % 0.8;
img.Top = (0.2 + rand.NextDouble()) % 0.8;
img.Width = 100 + rand.NextDouble() * 100;
img.Height = 100 + rand.NextDouble() * 100;
img.Image = "desert.jpg";
img.Angle = rand.NextDouble() * 360;
Images.Add(img);
}
}
}
class CollageImage
{
public string Image { get; set; }
public double Left { get; set; }
public double Top { get; set; }
public double Width { get; set; }
public double Height { get; set; }
public double Angle { get; set; }
}
class ImageLocationConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
double value = (double)values[0];
double max = (double)values[1];
return value * max;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
}