WPF中显示System.Drawing.Image对象,怎么办?急急急

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF中显示System.Drawing.Image对象,怎么办?急急急相关的知识,希望对你有一定的参考价值。

WPF中的
new BitmapImage().UriSource = new Uri(@"C:\Lilies.jpg");
Canvae.Children.add()
可以从外部导入图片。加入到Canvse控件中

我现在程序内部有一个System.Drawing.Image对象

我怎么才能把System.Drawing.Image对象加入到Canvse控件中呢?
请详细说明 谢谢啦(最好有代码~~)

<Canvas>
<Image Stretch="Fill" Width="100" Height="100" x:Name="myImage"/>
</Canvas>

一种方法:
System.Drawing.Image bmp=...; // 自己初始化的有效的 image
System.IO.MemoryStream ms = new System.IO.MemoryStream();
bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);// 格式自处理,这里用 bitmap
// 下行,初始一个 ImageSource 作为 myImage 的Source
System.Windows.Media.Imaging.BitmapImage bi=new System.Windows.Media.Imaging.BitmapImage();
bi.BeginInit();
bi.StreamSource = new MemoryStream(ms.ToArray()); // 不要直接使用 ms
bi.EndInit();
myImage.Source = bi; // done!
ms.Close();

另一个方法(更加常用的方法):
System.Drawing.Image bmp=...; // 自己初始化的有效的 image
System.Windows.Media.Imaging.BitmapSource bi =
System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
bmp.GetHbitmap(),
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
// 上面以 bmp 格式为例的,其他格式自处理
myImage.Source = bi; // Done!

参考一下System.Windows.Interop.Imaging 的以下方法:
CreateBitmapSourceFromHBitmap() // 从 HBITMAP 得到 ImageSource
CreateBitmapSourceFromHIcon() // 从 HICON 得到 ImageSource
CreateBitmapSourceFromMemorySection() // 从 HMEM 得到 ImageSource

Good luck
参考技术A 使用数据流

在 WPF 中使用 XamDataChart 显示信号

【中文标题】在 WPF 中使用 XamDataChart 显示信号【英文标题】:Using XamDataChart in WPF to display signal 【发布时间】:2013-05-01 13:33:24 【问题描述】:

我正在从事一个信号发生器项目,我发现很难理解 Infragistics XamDataChart 的工作原理。

该项目使用 WPF 和一个 MVVM 模型,其中 MainWindow 绑定到一个 ViewModel,它从模型类(在我的例子中为 SigGenChannel.cs)获取其所有数据,所有信号值和定时和刷新都在完成在模型类中,并一直绑定到 MainWindow,其中我有一个显示当前值(信号值)的文本字段,它在 100 毫秒时自动刷新。

所以我拥有的两个值是当前信号值 (CurrentValue) 和当前时间 (CurrentStepTime),我如何使用 XamDataChart 映射这两个数据点并让它以与文本字段相同的速率刷新和将图表上的数据显示为信号波?

感谢您的帮助,如果您需要任何特定代码sn-ps,请告诉我

【问题讨论】:

【参考方案1】:

如果您更改绑定集合的项目,XamDataChart 将自动刷新系列的视觉对象,前提是绑定集合实现 INotifyCollectionChanged。如果您不想显示“滚动窗口”效果,您可以在集合的末尾添加新点,并从集合的头部删除点,这样数据就会出现从右到左的滚动。

由于您的 X 轴是 TIME,因此您有两个选项来设置系列。您可以使用 CategoryXAxis,它将时间视为字符串值,并且每个数据点与前一个数据点等距(不过,如果您有一个恒定的采样率,这是合适的),或者您可以使用 CategoryDateTimeXAxis 如果您有一个非恒定的采样率,并且您希望这些值精确地出现在水平位置,这等于它们的时间值。在任何一种情况下,您都可以将数据绑定到轴的 ItemsSource,以便轴知道有多少项目并可以检索标签。对于 CategoryXAxis,您将指示标签应来自 CurrentStepTime,但对于 CategoryDateTimeXAxis,您将另外指定 CurrentStepTime 应用于 DateTimeMemberPath。

使用 CategoryDateTimeXAxis 的缺点是效率低于 CategoryXAxis,所以除非您需要非常量时间采样,否则我会坚持使用后者。

在任何一种情况下,您都将创建一个行(或其他类别)系列,将数据绑定到 ItemsSource,并将 ValueMemberPath 设置为 CurrentValue。

我认为这个样本可能会进一步说明问题:http://www.infragistics.com/products/silverlight/sample/data-chart/#/binding-real-time-data

【讨论】:

谢谢!我最终通过创建一个可观察的集合并在将 10 个数据点添加到集合后删除第一个点并将该集合绑定到数据图来让它工作

以上是关于WPF中显示System.Drawing.Image对象,怎么办?急急急的主要内容,如果未能解决你的问题,请参考以下文章

wpf 中怎么设置一个窗体总在最前显示,非模式对话框怎么只显示一个。

如何在 WPF 图像中显示位图 [重复]

wpf中从windows中打开windows1但为啥不显示windows1中的控件

WPF 在 XAML 中使用 Grid 显示表格

WPF:WPF显示PDF文档

WPF - 在 Wrappannel 中显示图像和文本框