WPF 画直方图的详细例子
时间: 2024-12-27 12:32:59 浏览: 3
在WPF中绘制一个基本的直方图实例,我们将创建一个简单的项目,使用`BitmapImage`加载图片,然后遍历其像素并生成颜色频率。这里我们假设你要绘制的是灰度直方图,如果是彩色图片则会更复杂一些。以下是一个简化的示例:
首先,在XAML文件(例如`App.xaml`)中设置窗口布局:
```xml
<Window x:Class="YourNamespace.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="直方图示例" Height="400" Width="800">
<Grid>
<Canvas Height="300" Width="700" Name="histogramCanvas"/>
</Grid>
</Window>
```
然后,在对应的ViewModel(例如`MainWindowViewModel.cs`)中:
```csharp
using System.Collections.ObjectModel;
using System.Drawing;
using System.Windows.Media.Imaging;
public class MainWindowViewModel : ViewModelBase
{
private BitmapImage _bitmapImage;
public ObservableCollection<(Color, int)> ColorFrequencies { get; set; }
public MainWindowViewModel()
{
// 加载图像
_bitmapImage = new BitmapImage(new Uri("path_to_your_image.jpg"));
LoadImageData();
}
private void LoadImageData()
{
ColorFrequencies = new ObservableCollection<(Color, int)>();
if (_bitmapImage != null)
{
for (int y = 0; y < _bitmapImage.Height; y++)
{
for (int x = 0; x < _bitmapImage.Width; x++)
{
var pixel = GetPixel(_bitmapImage, x, y);
UpdateHistogram(pixel);
}
}
}
}
private Color GetPixel(BitmapImage image, int x, int y)
{
var decoder = new JpegBitmapDecoder(image.StreamSource, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
return decoder.Frames[0].LockBits(new Int32Rect(x, y, 1, 1), ImageLockMode.ReadOnly, PixelFormats.Gray8).Scan0[^1];
}
private void UpdateHistogram(Color color)
{
// 这里可以添加对灰度值的映射,比如只关注亮度分量,忽略色相
var grayLevel = (byte)(color.R * 0.299 + color.G * 0.587 + color.B * 0.114); // RGB到灰度
foreach ((Color frequencyColor, int count) in ColorFrequencies)
{
if (grayLevel == frequencyColor.R)
{
count++;
break;
}
}
// 如果未找到匹配项,则添加新条目
else
{
ColorFrequencies.Add((grayLevel, 1));
}
}
}
```
最后,更新XAML中的视觉元素绑定到ViewModel的`ColorFrequencies`:
```xml
<Window.DataContext>
<local:MainWindowViewModel/>
</Window.DataContext>
<!-- 在Canvas上绘制直方图 -->
<Canvas Name="histogramCanvas">
<ItemsControl ItemsSource="{Binding ColorFrequencies}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="10" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Rectangle Width="10" Height="{Binding Value}" Fill="{Binding Key}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Canvas>
```
请注意,这个例子仅适用于灰度图像。如果要处理彩色图像,你需要修改`UpdateHistogram`函数,并使用四个值(红、绿、蓝、透明度)来构建直方图。
阅读全文