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";
}
}
}