www.pudn.com > PS.rar > ImageStatisticsWindow.cs
//#####################################################################################
//★★★★★★★ http://www.cnpopsoft.com [华普软件] ★★★★★★★
//★★ 华普软件-VB、C#专业论文与源码荟萃,敏捷开发,平台战略,让商业软件靓起来! ★★
//#####################################################################################
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using WeifenLuo.WinFormsUI;
using AForge.Math;
using AForge.Imaging;
namespace IPLab
{
///
/// Summary description for ImageStatisticsWindow.
///
public class ImageStatisticsWindow : Content
{
private System.Windows.Forms.PropertyGrid propertyGrid;
///
/// Required designer variable.
///
private System.ComponentModel.Container components = null;
private int currentImageHash = 0;
// Constructor
public ImageStatisticsWindow( )
{
//
// Required for Windows Form Designer support
//
InitializeComponent( );
//
// TODO: Add any constructor code after InitializeComponent call
//
}
///
/// Clean up any resources being used.
///
protected override void Dispose( bool disposing )
{
if ( disposing )
{
if ( components != null )
{
components.Dispose( );
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent( )
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ImageStatisticsWindow));
this.propertyGrid = new System.Windows.Forms.PropertyGrid();
this.SuspendLayout();
//
// propertyGrid
//
this.propertyGrid.Dock = System.Windows.Forms.DockStyle.Fill;
this.propertyGrid.HelpVisible = false;
this.propertyGrid.LineColor = System.Drawing.SystemColors.ScrollBar;
this.propertyGrid.Location = new System.Drawing.Point(0, 0);
this.propertyGrid.Name = "propertyGrid";
this.propertyGrid.Size = new System.Drawing.Size(325, 273);
this.propertyGrid.TabIndex = 0;
this.propertyGrid.ToolbarVisible = false;
//
// ImageStatisticsWindow
//
this.AllowedStates = ((WeifenLuo.WinFormsUI.ContentStates)(((WeifenLuo.WinFormsUI.ContentStates.Float | WeifenLuo.WinFormsUI.ContentStates.DockLeft)
| WeifenLuo.WinFormsUI.ContentStates.DockRight)));
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(325, 273);
this.Controls.Add(this.propertyGrid);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.HideOnClose = true;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.MinimizeBox = false;
this.MinimumSize = new System.Drawing.Size(331, 302);
this.Name = "ImageStatisticsWindow";
this.ShowHint = WeifenLuo.WinFormsUI.DockState.DockRight;
this.ShowInTaskbar = false;
this.Text = "图像统计";
this.ResumeLayout(false);
}
#endregion
// Gather image statistics
public void GatherStatistics( Bitmap image )
{
// avoid calculation in the case of the same image
if ( image != null )
{
if ( currentImageHash == image.GetHashCode( ) )
return;
currentImageHash = image.GetHashCode( );
}
else
{
propertyGrid.SelectedObject = null;
return;
}
System.Diagnostics.Debug.WriteLine( "--- Gathering stastics" );
// check pixel format
if ( image.PixelFormat == PixelFormat.Format24bppRgb )
{
// busy
Capture = true;
Cursor = Cursors.WaitCursor;
ColorImageStatisticsDescription statDesc = new ColorImageStatisticsDescription( image );
// show statistics
propertyGrid.SelectedObject = statDesc;
propertyGrid.ExpandAllGridItems( );
// free
Cursor = Cursors.Arrow;
Capture = false;
}
else
{
propertyGrid.SelectedObject = null;
}
}
}
// Helper class to display image statistics
internal class ColorImageStatisticsDescription
{
private ImageStatistics statRGB;
private ImageStatisticsHSL statHSL;
private ImageStatisticsYCbCr statYCbCr;
// General with black ------------------------------------
// Total pixels count
[Category( "0: General" )]
public int PixelsCount
{
get { return statRGB.PixelsCount; }
}
// Pixels without black
[Category( "0: General" )]
public int PixelsWithoutBlack
{
get { return statRGB.PixelsCountWithoutBlack; }
}
// Red with black ------------------------------------
// RedMin
[Category( "1: Red with black" )]
public int RedMin
{
get { return statRGB.Red.Min; }
}
// RedMax
[Category( "1: Red with black" )]
public int RedMax
{
get { return statRGB.Red.Max; }
}
// RedMean
[Category( "1: Red with black" )]
public double RedMean
{
get { return statRGB.Red.Mean; }
}
// RedStdDev
[Category( "1: Red with black" )]
public double RedStdDev
{
get { return statRGB.Red.StdDev; }
}
// RedMean
[Category( "1: Red with black" )]
public int RedMedian
{
get { return statRGB.Red.Median; }
}
// Green with black ------------------------------------
// GreenMin
[Category( "2: Green with black" )]
public int GreenMin
{
get { return statRGB.Green.Min; }
}
// GreenMax
[Category( "2: Green with black" )]
public int GreenMax
{
get { return statRGB.Green.Max; }
}
// GreenMean
[Category( "2: Green with black" )]
public double GreenMean
{
get { return statRGB.Green.Mean; }
}
// GreenStdDev
[Category( "2: Green with black" )]
public double GreenStdDev
{
get { return statRGB.Green.StdDev; }
}
// GreenMean
[Category( "2: Green with black" )]
public int GreenMedian
{
get { return statRGB.Green.Median; }
}
// Blue with black ------------------------------------
// BlueMin
[Category( "3: Blue with black" )]
public int BlueMin
{
get { return statRGB.Blue.Min; }
}
// BlueMax
[Category( "3: Blue with black" )]
public int BlueMax
{
get { return statRGB.Blue.Max; }
}
// BlueMean
[Category( "3: Blue with black" )]
public double BlueMean
{
get { return statRGB.Blue.Mean; }
}
// BlueStdDev
[Category( "3: Blue with black" )]
public double BlueStdDev
{
get { return statRGB.Blue.StdDev; }
}
// BlueMean
[Category( "3: Blue with black" )]
public int BlueMedian
{
get { return statRGB.Blue.Median; }
}
// Red without black ------------------------------------
// RedMinWB
[Category( "4: Red without black" )]
public int RedMinWB
{
get { return statRGB.RedWithoutBlack.Min; }
}
// RedMaxWB
[Category( "4: Red without black" )]
public int RedMaxWB
{
get { return statRGB.RedWithoutBlack.Max; }
}
// RedMeanWB
[Category( "4: Red without black" )]
public double RedMeanWB
{
get { return statRGB.RedWithoutBlack.Mean; }
}
// RedStdDevWB
[Category( "4: Red without black" )]
public double RedStdDevWB
{
get { return statRGB.RedWithoutBlack.StdDev; }
}
// RedMeanWB
[Category( "4: Red without black" )]
public int RedMedianWB
{
get { return statRGB.RedWithoutBlack.Median; }
}
// Green without black ------------------------------------
// GreenMinWB
[Category( "5: Green without black" )]
public int GreenMinWB
{
get { return statRGB.GreenWithoutBlack.Min; }
}
// GreenMaxWB
[Category( "5: Green without black" )]
public int GreenMaxWB
{
get { return statRGB.GreenWithoutBlack.Max; }
}
// GreenMeanWB
[Category( "5: Green without black" )]
public double GreenMeanWB
{
get { return statRGB.GreenWithoutBlack.Mean; }
}
// GreenStdDevWB
[Category( "5: Green without black" )]
public double GreenStdDevWB
{
get { return statRGB.GreenWithoutBlack.StdDev; }
}
// GreenMeanWB
[Category( "5: Green without black" )]
public int GreenMedianWB
{
get { return statRGB.GreenWithoutBlack.Median; }
}
// Blue without black ------------------------------------
// BlueMinWB
[Category( "6: Blue without black" )]
public int BlueMinWB
{
get { return statRGB.BlueWithoutBlack.Min; }
}
// BlueMaxWB
[Category( "6: Blue without black" )]
public int BlueMaxWB
{
get { return statRGB.BlueWithoutBlack.Max; }
}
// BlueMeanWB
[Category( "6: Blue without black" )]
public double BlueMeanWB
{
get { return statRGB.BlueWithoutBlack.Mean; }
}
// BlueStdDevWB
[Category( "6: Blue without black" )]
public double BlueStdDevWB
{
get { return statRGB.BlueWithoutBlack.StdDev; }
}
// BlueMeanWB
[Category( "6: Blue without black" )]
public int BlueMedianWB
{
get { return statRGB.BlueWithoutBlack.Median; }
}
// Saturation with black ------------------------------------
// SaturationMin
[Category( "7: Saturation with black" )]
public double SaturationMin
{
get { return statHSL.Saturation.Min; }
}
// SaturationMax
[Category( "7: Saturation with black" )]
public double SaturationMax
{
get { return statHSL.Saturation.Max; }
}
// SaturationMean
[Category( "7: Saturation with black" )]
public double SaturationMean
{
get { return statHSL.Saturation.Mean; }
}
// SaturationStdDev
[Category( "7: Saturation with black" )]
public double SaturationStdDev
{
get { return statHSL.Saturation.StdDev; }
}
// SaturationMean
[Category( "7: Saturation with black" )]
public double SaturationMedian
{
get { return statHSL.Saturation.Median; }
}
// Luminance with black ------------------------------------
// LuminanceMin
[Category( "8: Luminance with black" )]
public double LuminanceMin
{
get { return statHSL.Luminance.Min; }
}
// LuminanceMax
[Category( "8: Luminance with black" )]
public double LuminanceMax
{
get { return statHSL.Luminance.Max; }
}
// LuminanceMean
[Category( "8: Luminance with black" )]
public double LuminanceMean
{
get { return statHSL.Luminance.Mean; }
}
// LuminanceStdDev
[Category( "8: Luminance with black" )]
public double LuminanceStdDev
{
get { return statHSL.Luminance.StdDev; }
}
// LuminanceMean
[Category( "8: Luminance with black" )]
public double LuminanceMedian
{
get { return statHSL.Luminance.Median; }
}
// Saturation without black ------------------------------------
// SaturationMinWB
[Category( "9: Saturation without black" )]
public double SaturationMinWB
{
get { return statHSL.SaturationWithoutBlack.Min; }
}
// SaturationMaxWB
[Category( "9: Saturation without black" )]
public double SaturationMaxWB
{
get { return statHSL.SaturationWithoutBlack.Max; }
}
// SaturationMeanWB
[Category( "9: Saturation without black" )]
public double SaturationMeanWB
{
get { return statHSL.SaturationWithoutBlack.Mean; }
}
// SaturationStdDevWB
[Category( "9: Saturation without black" )]
public double SaturationStdDevWB
{
get { return statHSL.SaturationWithoutBlack.StdDev; }
}
// SaturationMeanWB
[Category( "9: Saturation without black" )]
public double SaturationMedianWB
{
get { return statHSL.SaturationWithoutBlack.Median; }
}
// Luminance without black ------------------------------------
// LuminanceMinWB
[Category( "A: Luminance without black" )]
public double LuminanceMinWB
{
get { return statHSL.LuminanceWithoutBlack.Min; }
}
// LuminanceMaxWB
[Category( "A: Luminance without black" )]
public double LuminanceMaxWB
{
get { return statHSL.LuminanceWithoutBlack.Max; }
}
// LuminanceMeanWB
[Category( "A: Luminance without black" )]
public double LuminanceMeanWB
{
get { return statHSL.LuminanceWithoutBlack.Mean; }
}
// LuminanceStdDevWB
[Category( "A: Luminance without black" )]
public double LuminanceStdDevWB
{
get { return statHSL.LuminanceWithoutBlack.StdDev; }
}
// LuminanceMeanWB
[Category( "A: Luminance without black" )]
public double LuminanceMedianWB
{
get { return statHSL.LuminanceWithoutBlack.Median; }
}
// Y with black ------------------------------------
// YMin
[Category( "B: Y with black" )]
public double YMin
{
get { return statYCbCr.Y.Min; }
}
// YMax
[Category( "B: Y with black" )]
public double YMax
{
get { return statYCbCr.Y.Max; }
}
// YMean
[Category( "B: Y with black" )]
public double YMean
{
get { return statYCbCr.Y.Mean; }
}
// YStdDev
[Category( "B: Y with black" )]
public double YStdDev
{
get { return statYCbCr.Y.StdDev; }
}
// YMean
[Category( "B: Y with black" )]
public double YMedian
{
get { return statYCbCr.Y.Median; }
}
// Cb with black ------------------------------------
// CbMin
[Category( "C: Cb with black" )]
public double CbMin
{
get { return statYCbCr.Cb.Min; }
}
// CbMax
[Category( "C: Cb with black" )]
public double CbMax
{
get { return statYCbCr.Cb.Max; }
}
// CbMean
[Category( "C: Cb with black" )]
public double CbMean
{
get { return statYCbCr.Cb.Mean; }
}
// CbStdDev
[Category( "C: Cb with black" )]
public double CbStdDev
{
get { return statYCbCr.Cb.StdDev; }
}
// CbMean
[Category( "C: Cb with black" )]
public double CbMedian
{
get { return statYCbCr.Cb.Median; }
}
// Cr with black ------------------------------------
// CrMin
[Category( "D: Cr with black" )]
public double CrMin
{
get { return statYCbCr.Cr.Min; }
}
// CrMax
[Category( "D: Cr with black" )]
public double CrMax
{
get { return statYCbCr.Cr.Max; }
}
// CrMean
[Category( "D: Cr with black" )]
public double CrMean
{
get { return statYCbCr.Cr.Mean; }
}
// CrStdDev
[Category( "D: Cr with black" )]
public double CrStdDev
{
get { return statYCbCr.Cr.StdDev; }
}
// CrMean
[Category( "D: Cr with black" )]
public double CrMedian
{
get { return statYCbCr.Cr.Median; }
}
// Y without black ------------------------------------
// YMinWB
[Category( "E: Y without black" )]
public double YMinWB
{
get { return statYCbCr.YWithoutBlack.Min; }
}
// YMaxWB
[Category( "E: Y without black" )]
public double YMaxWB
{
get { return statYCbCr.YWithoutBlack.Max; }
}
// YMeanWB
[Category( "E: Y without black" )]
public double YMeanWB
{
get { return statYCbCr.YWithoutBlack.Mean; }
}
// YStdDevWB
[Category( "E: Y without black" )]
public double YStdDevWB
{
get { return statYCbCr.YWithoutBlack.StdDev; }
}
// YMeanWB
[Category( "E: Y without black" )]
public double YMedianWB
{
get { return statYCbCr.YWithoutBlack.Median; }
}
// Cb without black ------------------------------------
// CbMinWB
[Category( "F: Cb without black" )]
public double CbMinWB
{
get { return statYCbCr.CbWithoutBlack.Min; }
}
// CbMaxWB
[Category( "F: Cb without black" )]
public double CbMaxWB
{
get { return statYCbCr.CbWithoutBlack.Max; }
}
// CbMeanWB
[Category( "F: Cb without black" )]
public double CbMeanWB
{
get { return statYCbCr.CbWithoutBlack.Mean; }
}
// CbStdDevWB
[Category( "F: Cb without black" )]
public double CbStdDevWB
{
get { return statYCbCr.CbWithoutBlack.StdDev; }
}
// CbMeanWB
[Category( "F: Cb without black" )]
public double CbMedianWB
{
get { return statYCbCr.CbWithoutBlack.Median; }
}
// Cr without black ------------------------------------
// CrMinWB
[Category( "G: Cr without black" )]
public double CrMinWB
{
get { return statYCbCr.CrWithoutBlack.Min; }
}
// CrMaxWB
[Category( "G: Cr without black" )]
public double CrMaxWB
{
get { return statYCbCr.CrWithoutBlack.Max; }
}
// CrMeanWB
[Category( "G: Cr without black" )]
public double CrMeanWB
{
get { return statYCbCr.CrWithoutBlack.Mean; }
}
// CrStdDevWB
[Category( "G: Cr without black" )]
public double CrStdDevWB
{
get { return statYCbCr.CrWithoutBlack.StdDev; }
}
// CrMeanWB
[Category( "G: Cr without black" )]
public double CrMedianWB
{
get { return statYCbCr.CrWithoutBlack.Median; }
}
// Constructor
public ColorImageStatisticsDescription( Bitmap image )
{
// get image dimension
int width = image.Width;
int height = image.Height;
// lock it
BitmapData imgData = image.LockBits( new Rectangle( 0, 0, width, height ), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb );
// gather statistics
statRGB = new ImageStatistics( imgData );
statHSL = new ImageStatisticsHSL( imgData );
statYCbCr = new ImageStatisticsYCbCr( imgData );
// unlock image
image.UnlockBits( imgData );
}
}
}