using System; using System.Collections; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Windows.Forms; using OTS.WinFormsUI.Docking; using OTSModelSharp.ServiceCenter; namespace OTSMeasureApp { public partial class ToolWindow : DockContent { //国际化 OTSCommon.Language lan; Hashtable table; //测量主窗体 public OTSIncAMeasureAppForm m_MeasureAppForm; public OTSMeasureStatusWindow MeasureStatuWindow; NLog.Logger log ; public ToolWindow(OTSIncAMeasureAppForm m_MeasureForm, OTSMeasureStatusWindow MeasureStatuForm) { log = NLog.LogManager.GetCurrentClassLogger(); InitializeComponent(); m_MeasureAppForm = m_MeasureForm; MeasureStatuWindow = MeasureStatuForm; //国际化 lan = new OTSCommon.Language(this); table = lan.GetNameTable(this.Name); } private Bitmap bseImg; /// /// 获取当前的BSE原图 /// public Bitmap BseImg { get => bseImg; set => bseImg = value; } //private byte[] originalBseData; private byte[] bBseData; /// /// 获取当前的BSE原图数据 /// public byte[] OriginalBseData { get => bBseData; set => bBseData = value; } //去背景灰度最小值 private int bseGrayMinValue=-1; /// /// 去背景灰度最小值 /// public int BseGrayMinValue { get => bseGrayMinValue; set => bseGrayMinValue = value; } //去背景灰度最大值 private int bseGrayMaxValue = -1; /// /// 去背景灰度最大值 /// public int BseGrayMaxValue { get => bseGrayMaxValue; set => bseGrayMaxValue = value; } private void ToolWindow_Load(object sender, EventArgs e) { if (BseImg != null) { pbBSEImage.Image = BseImg; } if (BseGrayMinValue >-1) { nuDownGrayStart.Value = BseGrayMinValue; tbGrayStart.Value = BseGrayMinValue; } if (BseGrayMaxValue >-1) { nuDownGrayEnd.Value = BseGrayMaxValue; tbGrayEnd.Value = BseGrayMaxValue; } ShowGrayLevelImage(); } #region BSE图去背景 /// /// BSE图去背景 /// /// BSE原图 /// 开始灰度值 /// 结束灰度值 /// protected Bitmap RemoveBseGray(Bitmap bInput,int grayStart, int grayEnd) { int imgWidth = bInput.Width; int imgHeight = bInput.Height; //转换颜色 List colorMapTemp = new List(); for (int i = grayStart; i <= grayEnd; i++) { ColorMap colorMap = new ColorMap(); string colorName = "#" + Color.FromArgb(i, i, i).Name.ToString(); colorMap.OldColor = ColorTranslator.FromHtml(colorName); colorMap.NewColor = Color.White; colorMapTemp.Add(colorMap); } if (colorMapTemp.Count > 0) { Bitmap cutbitmap = new Bitmap(bInput.Width, bInput.Height); //创建Graphics对象 Graphics g = Graphics.FromImage(cutbitmap); //生成的图像大小 int width = bInput.Width; int height = bInput.Height; //编辑被着急图像所要显示的位置 Rectangle DrawRect = new Rectangle(0, 0, imgWidth, imgHeight); //编辑输出画布中着色的位置 Rectangle ShowRect = new Rectangle(0, 0, imgWidth, imgHeight); ImageAttributes attr = new ImageAttributes(); attr.SetRemapTable(colorMapTemp.ToArray()); //从输入图像中截图至临时图像中 g.DrawImage(bInput, ShowRect, 0, 0, DrawRect.Width, DrawRect.Height, GraphicsUnit.Pixel, attr); g.Dispose(); MemoryStream ms = new MemoryStream(); cutbitmap.Save(ms, ImageFormat.Png); cutbitmap.Dispose(); //返回图像对象 return (Bitmap)Image.FromStream(ms); } else { return null; } } #endregion #region 显示去背景BSE图 public void ShowBSEImage(Bitmap BseImg) { if (BseImg != null) { pbBSEImage.Image = BseImg; pbBSEImage.Refresh(); } } #endregion private void nuDwonGrayStart_ValueChanged(object sender, EventArgs e) { RemoveBseGrayValueChanged(); } private void nuDownGrayEnd_ValueChanged(object sender, EventArgs e) { RemoveBseGrayValueChanged(); } protected void RemoveBseGrayValueChanged() { int grayStart = (int)nuDownGrayStart.Value; int grayEnd = (int)nuDownGrayEnd.Value; if (grayStart <= grayEnd) { Bitmap reBseImg = RemoveBseGray(BseImg, grayStart, grayEnd); if (reBseImg != null) { ShowBSEImage(reBseImg); } } else { nuDownGrayEnd.Value = nuDownGrayStart.Value; } tbGrayStart.Value = (int)nuDownGrayStart.Value; tbGrayEnd.Value = (int)nuDownGrayEnd.Value; } private void tbGrayStart_Scroll(object sender, EventArgs e) { int grayStart = (int)tbGrayStart.Value; int grayEnd = (int)tbGrayEnd.Value; if (grayStart <= grayEnd) { Bitmap reBseImg = RemoveBseGray(BseImg, grayStart, grayEnd); if (reBseImg != null) { ShowBSEImage(reBseImg); } } else { tbGrayStart.Value = tbGrayStart.Value; tbGrayEnd.Value = tbGrayStart.Value; } nuDownGrayStart.Value = (int)tbGrayStart.Value; nuDownGrayEnd.Value = (int)tbGrayEnd.Value; } private void tbGrayEnd_Scroll(object sender, EventArgs e) { int grayStart = (int)tbGrayStart.Value; int grayEnd = (int)tbGrayEnd.Value; if (grayStart <= grayEnd) { Bitmap reBseImg = RemoveBseGray(BseImg, grayStart, grayEnd); if (reBseImg != null) { ShowBSEImage(reBseImg); } } else { tbGrayEnd.Value = tbGrayStart.Value; } nuDownGrayStart.Value = tbGrayStart.Value; nuDownGrayEnd.Value = tbGrayEnd.Value; } private void btnYes_Click(object sender, EventArgs e) { bseGrayMinValue = (int)nuDownGrayStart.Value; bseGrayMaxValue = (int)nuDownGrayEnd.Value; this.DialogResult = DialogResult.Yes; } private void btnCancel_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.Cancel; } #region BSE图去背景 #endregion protected void ShowGrayLevelImage() { var dGrayLevelData = new double[(int)GrayLevel.Max]; dGrayLevelData = GetGaryData(OriginalBseData, dGrayLevelData); int[] XData = new int[(int)GrayLevel.Max]; for (int i = 0; i < (int)GrayLevel.Max; i++) { XData[i] = i + 1; } int[] YData = new int[dGrayLevelData.Length]; for (int i = 0; i < dGrayLevelData.Length; i++) { YData[i] = (int)dGrayLevelData[i]; } DisChartData(XData, YData); } public double[] GetGaryData(byte[] Imagedata, double[] GrayLevelData) { //获得下标每一点的灰度值,并在数组里加一 for (int i = 0; i < Imagedata.Length; i++) { byte graylevel = Imagedata[i]; if (graylevel > 0 && graylevel < 255) { GrayLevelData[graylevel] += 1; } } return GrayLevelData; } public void DisChartData(int[] XData, int[] YData) { //添加数据 myChart1.Series[0].Points.DataBindXY(XData, YData); myChart1.Series[0].Label = ""; myChart1.Series[0].LegendText = ""; myChart1.Series[0].Name = "Graph"; myChart1.Series[0].IsVisibleInLegend = false; myChart1.Titles[0].Text = "GrayCurve"; } } }