PageRenderTime 35ms CodeModel.GetById 10ms RepoModel.GetById 0ms app.codeStats 0ms

/Main/src/Xbap/DynamicDataDisplay.Xbap.Samples/Demos/v02/ImageHistogram.xaml.cs

#
C# | 118 lines | 94 code | 16 blank | 8 comment | 4 complexity | 04f3b994fd6183e608b479030eaaa430 MD5 | raw file
Possible License(s): CC-BY-SA-3.0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Windows;
  6. using System.Windows.Controls;
  7. using System.Windows.Data;
  8. using System.Windows.Documents;
  9. using System.Windows.Input;
  10. using System.Windows.Media;
  11. using System.Windows.Media.Imaging;
  12. using System.Windows.Navigation;
  13. using System.Windows.Shapes;
  14. using Microsoft.Research.DynamicDataDisplay.DataSources;
  15. using Microsoft.Win32;
  16. namespace Microsoft.Research.DynamicDataDisplay.Samples.Demos.v02
  17. {
  18. /// <summary>
  19. /// Interaction logic for ImageHistogram.xaml
  20. /// </summary>
  21. public partial class ImageHistogram : Page
  22. {
  23. public ImageHistogram()
  24. {
  25. InitializeComponent();
  26. }
  27. private void OnOpenImageClick(object sender, RoutedEventArgs e)
  28. {
  29. OpenFileDialog dlg = new OpenFileDialog();
  30. dlg.Filter = "Image|*.bmp;*.jpg;*.png;*.gif";
  31. if (dlg.ShowDialog(Window.GetWindow(this)).GetValueOrDefault(false))
  32. {
  33. OpenImage(dlg.FileName);
  34. }
  35. }
  36. private void OpenImage(string fileName)
  37. {
  38. BitmapImage bmp = new BitmapImage(new Uri(fileName));
  39. bmp.CacheOption = BitmapCacheOption.OnLoad;
  40. image.Source = bmp;
  41. ProcessImage(bmp);
  42. }
  43. EnumerableDataSource<int> red;
  44. EnumerableDataSource<int> green;
  45. EnumerableDataSource<int> blue;
  46. int[] reds = new int[256];
  47. int[] greens = new int[256];
  48. int[] blues = new int[256];
  49. byte[] pixels;
  50. private void ProcessImage(BitmapImage bmp)
  51. {
  52. byte[] pixels = new byte[bmp.PixelWidth * bmp.PixelHeight * 4];
  53. bmp.CopyPixels(pixels, bmp.PixelWidth * 4, 0);
  54. for (int i = 0; i < pixels.Length; )
  55. {
  56. //BGRA
  57. blues[pixels[i++]]++;
  58. greens[pixels[i++]]++;
  59. reds[pixels[i++]]++;
  60. i++;
  61. }
  62. CreateHistograms();
  63. }
  64. private void CreateHistograms()
  65. {
  66. EnumerableDataSource<int> x = new EnumerableDataSource<int>(Enumerable.Range(0, 256).ToArray());
  67. x.SetXMapping(_x => _x);
  68. Func<int, double> mapping;
  69. if (check.IsChecked.GetValueOrDefault())
  70. mapping = logMapping;
  71. else
  72. mapping = linearMapping;
  73. red = new EnumerableDataSource<int>(reds);
  74. red.SetYMapping(mapping);
  75. green = new EnumerableDataSource<int>(greens);
  76. green.SetYMapping(mapping);
  77. blue = new EnumerableDataSource<int>(blues);
  78. blue.SetYMapping(mapping);
  79. CompositeDataSource rDS = new CompositeDataSource(x, red);
  80. CompositeDataSource gDS = new CompositeDataSource(x, green);
  81. CompositeDataSource bDS = new CompositeDataSource(x, blue);
  82. plotter.RemoveUserElements();
  83. // todo
  84. //plotter.AddLineGraph(rDS, Colors.Red, 1, "Red").FilteringEnabled = false;
  85. //plotter.AddLineGraph(gDS, Colors.Green, 1, "Green").FilteringEnabled = false;
  86. //plotter.AddLineGraph(bDS, Colors.Blue, 1, "Blue").FilteringEnabled = false;
  87. }
  88. private Func<int, double> logMapping = i => i > 0 ? Math.Log10(i) : 0;
  89. private Func<int, double> linearMapping = i => i;
  90. private void CheckBox_Checked(object sender, RoutedEventArgs e)
  91. {
  92. Func<int, double> mapping;
  93. if (check.IsChecked.GetValueOrDefault())
  94. mapping = logMapping;
  95. else
  96. mapping = linearMapping;
  97. red.SetYMapping(mapping);
  98. green.SetYMapping(mapping);
  99. blue.SetYMapping(mapping);
  100. }
  101. }
  102. }