Commit ca4d7705 刘韬

1

1 个父辈 f46a3c9a
正在显示 59 个修改的文件 包含 9593 行增加77 行删除
......@@ -45,10 +45,6 @@
<SpecificVersion>False</SpecificVersion>
<HintPath>..\dll\Asa.PrintLabel.dll</HintPath>
</Reference>
<Reference Include="CodeLibrary, Version=1.0.8780.28463, Culture=neutral, processorArchitecture=AMD64">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\dll\CodeLibrary.dll</HintPath>
</Reference>
<Reference Include="ConfigHelper">
<HintPath>..\dll\ConfigHelper.dll</HintPath>
</Reference>
......@@ -232,6 +228,10 @@
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\CodeLibrary\CodeLibrary.csproj">
<Project>{2e0d9598-cb37-46dc-9c9b-d36d4d344451}</Project>
<Name>CodeLibrary</Name>
</ProjectReference>
<ProjectReference Include="..\Common\Common.csproj">
<Project>{43cdd09e-fcf3-4960-a01d-3bbfe9933122}</Project>
<Name>Common</Name>
......
......@@ -56,8 +56,8 @@ namespace AutoScanAndLabel
}
catch (Exception ex)
{
LogUtil.error(ex.Message);
throw new Exception(ex.Message); ;
LogUtil.error(ex.ToString());
throw new Exception(ex.ToString());
}
}
......
using Basler.Pylon;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CodeLibrary
{
public class BaslerCamera
{
public static BaslerCamera Instance= new BaslerCamera();
/// <summary>
/// 当前相机
/// </summary>
private Camera cameraCur = null;
/// <summary>
/// 所有相机列表
/// </summary>
private List<ICameraInfo> cameraAll;
/// <summary>
/// 所有相机的名称
/// </summary>
private List<string> cameraName;
/// <summary>
/// 获取连续图像
/// </summary>
public delegate void GrabImageEvent();
/// <summary>
/// 获取连续图像事件,需要跨线程操作
/// </summary>
public event GrabImageEvent GrabImage;
private BaslerCamera()
{
Load();
}
/// <summary>
/// 错误信息
/// </summary>
public string ErrInfo { set; get; }
/// <summary>
/// 相机总数
/// </summary>
public int Count
{
get { return cameraAll == null ? 0 : cameraAll.Count; }
}
/// <summary>
/// 相机名称,ModelName,SerialNumber
/// </summary>
public string[] CameraName
{
get {
if (cameraName == null)
{
cameraName = new List<string>();
}
return cameraName.ToArray(); }
}
/// <summary>
/// 当前相机是否打开
/// </summary>
public bool IsOpen
{
get
{
if (cameraCur == null)
return false;
else
return cameraCur.IsOpen;
}
}
/// <summary>
/// 相机图像宽度
/// </summary>
public int Width { set; get; }
/// <summary>
/// 相机图像高度
/// </summary>
public int Height { set; get; }
/// <summary>
/// 相机32位缓存
/// </summary>
public byte[] Buffer { get; private set; }
/// <summary>
/// 相机32位图像
/// </summary>
public Bitmap Image { get; private set; }
/// <summary>
/// 加载相机
/// </summary>
public void Load()
{
try
{
cameraAll = CameraFinder.Enumerate();
cameraName = new List<string>();
foreach (ICameraInfo info in cameraAll)
cameraName.Add(info[CameraInfoKey.ModelName].ToString() + " (" + info[CameraInfoKey.SerialNumber].ToString() + ")");
}
catch (Exception ex)
{
HDLogUtil.error("Basler Load Error:" + ex.StackTrace);
}
}
/// <summary>
/// 打开指定相机
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public bool Open(string name)
{
int n = cameraName.FindIndex(s => s == name);
if (n == -1)
return false;
else
return Open(n);
}
/// <summary>
/// 打开指定相机
/// </summary>
/// <param name="idx">索引</param>
/// <returns></returns>
public bool Open(int idx)
{
if (idx < 0 || idx >= cameraAll.Count) return false;
if (cameraCur != null) Close();
try
{
cameraCur = new Camera(cameraAll[idx]);
//cameraCur.ConnectionLost += OnConnectionLost;
//cameraCur.CameraOpened += OnCameraOpened;
//cameraCur.CameraClosed += OnCameraClosed;
//cameraCur.StreamGrabber.GrabStarted += OnGrabStarted;
cameraCur.StreamGrabber.ImageGrabbed += OnImageGrabbed;
//cameraCur.StreamGrabber.GrabStopped += OnGrabStopped;
cameraCur.Open();
Width = Convert.ToInt32(cameraCur.Parameters[PLCamera.Width].GetValue());
Height = Convert.ToInt32(cameraCur.Parameters[PLCamera.Height].GetValue());
cameraCur.Parameters[PLCamera.UserSetSelector].SetValue(PLCamera.UserSetSelector.UserSet1); //加载用户设置1
bool bln = cameraCur.Parameters[PLCamera.UserSetLoad].TryExecute(); //执行设置
return true;
}
catch (Exception ex)
{
ErrInfo = ex.Message;
return false;
}
}
/// <summary>
/// 关闭当前相机
/// </summary>
public void Close()
{
if (cameraCur != null)
{
cameraCur.Close();
cameraCur.Dispose();
cameraCur = null;
}
}
/// <summary>
/// 停止抓取数据
/// </summary>
public void Stop()
{
if (cameraCur != null)
cameraCur.StreamGrabber.Stop();
}
/// <summary>
/// 抓取一张图像
/// </summary>
public void GrabOne()
{
cameraCur.Parameters[PLCamera.AcquisitionMode].SetValue(PLCamera.AcquisitionMode.SingleFrame);
//cameraCur.StreamGrabber.Start();
//IGrabResult grabResult = cameraCur.StreamGrabber.RetrieveResult(5000, TimeoutHandling.ThrowException);
IGrabResult grabResult = cameraCur.StreamGrabber.GrabOne(5000);
if (!grabResult.IsValid) return;
Image = new Bitmap(grabResult.Width, grabResult.Height, PixelFormat.Format32bppRgb);
BitmapData bmpData = Image.LockBits(new Rectangle(0, 0, grabResult.Width, grabResult.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppRgb);
IntPtr ptrBmp = bmpData.Scan0;
int picSize = bmpData.Stride * grabResult.Height;
PixelDataConverter conv = new PixelDataConverter();
conv.OutputPixelFormat = PixelType.BGRA8packed;
conv.Convert(ptrBmp, picSize, grabResult);
Buffer = new byte[picSize];
System.Runtime.InteropServices.Marshal.Copy(ptrBmp, Buffer, 0, picSize);
Image.UnlockBits(bmpData);
//cameraCur.StreamGrabber.Stop();
}
/// <summary>
/// 抓取连续图像,触发GrabImage事件
/// </summary>
public void GrabContinuous()
{
cameraCur.Parameters[PLCamera.AcquisitionMode].SetValue(PLCamera.AcquisitionMode.Continuous);
cameraCur.StreamGrabber.Start(GrabStrategy.OneByOne, GrabLoop.ProvidedByStreamGrabber);
}
private void OnImageGrabbed(object sender, ImageGrabbedEventArgs e)
{
try
{
IGrabResult grabResult = e.GrabResult;
if (!grabResult.IsValid) return;
Image = new Bitmap(grabResult.Width, grabResult.Height, PixelFormat.Format32bppRgb);
BitmapData bmpData = Image.LockBits(new Rectangle(0, 0, grabResult.Width, grabResult.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppRgb);
IntPtr ptrBmp = bmpData.Scan0;
int picSize = bmpData.Stride * grabResult.Height;
PixelDataConverter conv = new PixelDataConverter();
conv.OutputPixelFormat = PixelType.BGRA8packed;
conv.Convert(ptrBmp, picSize, grabResult);
Buffer = new byte[picSize];
System.Runtime.InteropServices.Marshal.Copy(ptrBmp, Buffer, 0, picSize);
Image.UnlockBits(bmpData);
GrabImage?.Invoke();
}
catch (Exception ex)
{
ErrInfo = ex.Message;
}
finally
{
e.DisposeGrabResultIfClone();
}
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{2E0D9598-CB37-46DC-9C9B-D36D4D344451}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>CodeLibrary</RootNamespace>
<AssemblyName>CodeLibrary</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<Prefer32Bit>false</Prefer32Bit>
<PlatformTarget>x64</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="Basler.Pylon, Version=1.0.0.0, Culture=neutral, PublicKeyToken=e389355f398382ab, processorArchitecture=x86">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\dll\Basler.Pylon.dll</HintPath>
</Reference>
<Reference Include="ConfigHelper">
<HintPath>..\..\..\..\..\类库\ConfigHelper.dll</HintPath>
</Reference>
<Reference Include="halcondotnet">
<HintPath>..\dll\halcondotnet.dll</HintPath>
</Reference>
<Reference Include="IDHIKCamera, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\dll\IDHIKCamera.dll</HintPath>
</Reference>
<Reference Include="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304, processorArchitecture=AMD64">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\dll\log4net.dll</HintPath>
</Reference>
<Reference Include="MvCameraControl.Net, Version=2.4.1.2, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\..\类库\MvCameraControl.Net.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\dll\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
<Reference Include="zxing">
<HintPath>..\dll\zxing.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="camera\Common.cs" />
<Compile Include="camera\HIK.cs" />
<Compile Include="camera\HIKIDMVS.cs" />
<Compile Include="eyemDecode.cs" />
<Compile Include="eyemDecode2.cs" />
<Compile Include="FrmBase.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FrmBase.Designer.cs">
<DependentUpon>FrmBase.cs</DependentUpon>
</Compile>
<Compile Include="FrmCodeLearn.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FrmCodeLearn.Designer.cs">
<DependentUpon>FrmCodeLearn.cs</DependentUpon>
</Compile>
<Compile Include="FrmCodeDecode.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FrmCodeDecode.Designer.cs">
<DependentUpon>FrmCodeDecode.cs</DependentUpon>
</Compile>
<Compile Include="HDCodeHelper.cs" />
<Compile Include="HDCodeLearnHelper.cs" />
<Compile Include="HDLogUtil.cs" />
<Compile Include="ImageHelper.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="CodeResourceControl.cs" />
<Compile Include="RemoteDecodeHelper.cs" />
<Compile Include="ZXingCodeHelper.cs" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="FrmBase.resx">
<DependentUpon>FrmBase.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FrmCodeLearn.resx">
<DependentUpon>FrmCodeLearn.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FrmCodeDecode.resx">
<DependentUpon>FrmCodeDecode.cs</DependentUpon>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<Content Include="resources\resources.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="记录.txt" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
\ No newline at end of file
using log4net;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace CodeLibrary
{
public class CodeResourceControl
{
public static readonly ILog LOG = LogManager.GetLogger("LngResource");
//public delegate string GetStrDelegate(string id, string defaultStr);
//public static event GetStrDelegate GetStrEvent;
//public delegate string GetStringDelegate(string id, string defaultStr, params object[] param);
//public static event GetStringDelegate GetStringEvent;
public static bool OpenResourceLog = false;
public static string China = "zh-CN";
public static string English = "en-US";
public static string Japanese = "ja-JP";
//private static Dictionary<string, string> chineseMap = new Dictionary<string, string>();
//private static Dictionary<string, string> englishMap = new Dictionary<string, string>();
public static Dictionary<string, Dictionary<string, string>> LangMap = new Dictionary<string, Dictionary<string, string>>();
public delegate string GetLanguageDelegate();
public static event GetLanguageDelegate GetLanguageEvent;
public delegate void RefreshLanguageDelegate();
public static event RefreshLanguageDelegate RefreshLanguageEvent;
public static string GetLanguage()
{
if (GetLanguageEvent == null)
{
return China;
}
string result = GetLanguageEvent?.Invoke();
if (result == null)
{
return "";
}
CurrLanguage = result;
return result;
}
private static string spiltStr = "_";
private static string Text = "Text";
public static string GetTextIdStr(string className, string controlName)
{
return className + spiltStr + controlName + spiltStr + Text;
}
public static string GetTextIdStr(string className)
{
return className + spiltStr + Text;
}
public static string GetString(string id, string defaultStr)
{
string strCurLanguage = defaultStr;
var haslang = getLangRes(CurrLanguage);
if (!haslang)
{
return strCurLanguage;
}
try
{
LangMap[CurrLanguage].TryGetValue(id, out strCurLanguage);
if ((strCurLanguage == null || strCurLanguage.Equals("")) && (!defaultStr.Equals("")))
{
strCurLanguage = defaultStr;
NoIdLog(id, defaultStr);
}
}
catch (Exception)
{
if (defaultStr.Equals(""))
{
}
else
{
strCurLanguage = "No id:[" + id + "], please add.";
strCurLanguage = defaultStr;
NoIdLog(id, defaultStr);
}
}
if (strCurLanguage == null)
{
strCurLanguage = "";
}
return strCurLanguage;
}
public static string GetString(string id, string defaultStr, params object[] param)
{
string strCurLanguage = GetString(id, defaultStr);
return String.Format(strCurLanguage, param);
}
private static void NoIdLog(string id, string defaultStr)
{
if (OpenResourceLog)
{
if (LangMap.ContainsKey(CurrLanguage) && !LangMap[CurrLanguage].ContainsKey(id) && checkInterid(id))
LOG.Info("No Res id:" + id + "#" + defaultStr);
}
}
private static bool checkInterid(string id)
{
return true;
//string[] interstring = new string[] { "_txt", "_lbl" };
//var x = from a in interstring
// where id.IndexOf(a) > -1
// select a;
//return x.Count() == 0;
}
static CodeResourceControl()
{
}
private static bool getLangRes(string lang)
{
if (!LangMap.ContainsKey(lang))
{
string path = Application.StartupPath + @"\resources\" + lang + ".txt";
if (!File.Exists(path))
{
path = Application.StartupPath + @"\resources\" + lang + ".lngres";
if (!File.Exists(path))
{
return false;
}
}
string[] lines = File.ReadAllLines(path);
var map = new Dictionary<string, string>();
foreach (string line in lines)
{
string[] array = line.Split('#');
if (array.Length<2)
array = line.Split('\t');
if (array.Length >= 3)
{
string key = array[0];
string chinese = array[1];
string english = array[2];
if (map.ContainsKey(key))
{
map.Remove(key);
}
map.Add(key, english);
}
}
LangMap.Add(lang, map);
return true;
}
return true;
}
public static string CurrLanguage = "";
public static void LanguageProcess(ContainerControl cc, string className)
{
if (CurrLanguage.Equals(CodeResourceControl.GetLanguage()))
{
//return;
}
//string className = cc.ClassName;
CurrLanguage = CodeResourceControl.GetLanguage();
string name = CodeResourceControl.GetString(CodeResourceControl.GetTextIdStr(className), cc.Text);
if (!name.Equals("")) { cc.Text = name; }
PreControlLanaguage(cc, className);
RefreshLanguageEvent?.Invoke();
}
private static void PreControlLanaguage(Control partentControl, string className)
{
//if (partentControl.Tag.ToString() == "not")
// return;
//string className = this.ClassName;
Con_GetTxt(partentControl, out string title);
string newStr = CodeResourceControl.GetString(CodeResourceControl.GetTextIdStr(className, partentControl.Name), title);
if (!newStr.Equals(""))
{
Con_SetTxt(partentControl, newStr.Replace("\\n", "\n"));
}
foreach (Control con in partentControl.Controls)
{
if (con.Tag != null && con.Tag.ToString() == "not")
continue;
string txt = "";
bool haslang = false;
if (Con_GetTxt(con, out txt))
{
newStr = CodeResourceControl.GetString(CodeResourceControl.GetTextIdStr(className, con.Name), txt);
if (!newStr.Equals(""))
{
Con_SetTxt(con, newStr.Replace("\\n", "\n"));
//haslang = true;
}
}
if (con.Controls.Count > 0 && !haslang)
{
PreControlLanaguage(con, className);
}
}
}
static bool Con_GetTxt(Control con, out string txt)
{
txt = "";
if (con is Label || con is Button || con is RadioButton || con is CheckBox)
{
txt = con.Text;
return true;
}
string methodname = getMethodname(con);
var t = con.GetType();
var p = t.GetProperty(methodname);
if (p != null)
{
txt = p.GetValue(con, null).ToString();
return true;
}
return false;
}
static void Con_SetTxt(Control con, string txt)
{
if (con is Label || con is Button || con is RadioButton || con is CheckBox)
{
con.Text = txt;
return;
}
string methodname = getMethodname(con);
var t = con.GetType();
var p = t.GetProperty(methodname);
if (p == null)
return;
else
p.SetValue(con, txt, null);
}
static string getMethodname(Control con)
{
string methodname = "Text";
//if (con is UCBtnExt) methodname = "BtnText";
//if (con is UCTextBoxEx) methodname = "InputText";
//if (con is UCCheckBox) methodname = "TextValue";
//if (con is UCPanelTitle || con is FrmWithTitle) methodname = "Title";
if (con is Form) methodname = "Title";
return methodname;
}
}
}
using HalconDotNet;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CodeLibrary
{
public class DHBarCodeHelper
{ /// <summary>
/// 根据图片解析二维码
/// </summary>
/// <param name="ho_Image">Halcon中的图片对象</param>
/// <param name="codeCount">二维码数量</param>
/// <param name="codeParamPath">二维码参数路径,""表示不使用参数</param>
/// <param name="paramType">二维码类型,不传类型默认Data Matrix ECC 200</param>
/// <returns>解析到的二维码</returns>
public static List<CodeInfo> DecodeCode(HObject ho_Image, int codeCount, string codeParamPath, params string[] paramType)
{
List<string> codeType = new List<string>(paramType.ToList());
if (codeType.Count<string>() <= 0)
{
codeType.Add("CODE_39");
}
List<CodeInfo> codeList = new List<CodeInfo>();
foreach (string t in codeType)
{
List<CodeInfo> array = GetCode(ho_Image, t, codeParamPath, codeCount);
codeList.AddRange(array.ToArray<CodeInfo>());
}
return codeList;
}
private static List<CodeInfo> GetCode(HObject ho_Image, string symbolType, string hv_model_path, int codeCount)
{
List<CodeInfo> codeList = new List<CodeInfo>();
try
{
HTuple hv_Area = null;
HTuple hv_Row1 = null;
HTuple hv_Column = null;
HTuple hv_PointOrder = null;
HObject ho_SymbolXLDs;
HTuple hv_ResultHandles = null;
HTuple hv_DecodedDataStrings = null;
HTuple hv_DataCodeHandle = null;
HOperatorSet.GenEmptyObj(out ho_SymbolXLDs);
HOperatorSet.CreateBarCodeModel(symbolType, "default_parameters", "maximum_recognition", out hv_DataCodeHandle);
//string hv_model_path = GetCodeParamFilePath(symbolType);
if (!hv_model_path.Equals("") && File.Exists(hv_model_path))
{
HOperatorSet.ReadDataCode2dModel(hv_model_path, out hv_DataCodeHandle);
}
ho_SymbolXLDs.Dispose();
if (codeCount <= 0)
{
HOperatorSet.FindDataCode2d(ho_Image, out ho_SymbolXLDs, hv_DataCodeHandle,
new HTuple(), new HTuple(), out hv_ResultHandles, out hv_DecodedDataStrings);
}
else
{
HOperatorSet.FindDataCode2d(ho_Image, out ho_SymbolXLDs, hv_DataCodeHandle,
"stop_after_result_num", codeCount, out hv_ResultHandles, out hv_DecodedDataStrings);
}
HOperatorSet.AreaCenterXld(ho_SymbolXLDs, out hv_Area, out hv_Row1, out hv_Column, out hv_PointOrder);
if (HalconWindow != null)
{
ShowImage(HalconWindow, ho_Image, ho_SymbolXLDs);
}
HOperatorSet.ClearDataCode2dModel(hv_DataCodeHandle);
string[] resultList = hv_DecodedDataStrings.SArr;
if (resultList.Length > 0)
{
for (int i = 0; i < hv_DecodedDataStrings.SArr.Length; i++)
{
try
{
int x = (int)Math.Round(hv_Column.DArr[i]);
int y = (int)Math.Round(hv_Row1.DArr[i]);
string str = hv_DecodedDataStrings.SArr[i];
CodeInfo code = new CodeInfo(str, x, y);
codeList.Add(code);
}
catch (Exception ex)
{
HDLogUtil.error("处理二维码出错:索引=" + i + "," + resultList.ToString());
}
}
}
return codeList;
}
catch (Exception ex)
{
return codeList;
}
}
}
}
namespace CodeLibrary
{
partial class FrmBase
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.SuspendLayout();
//
// FrmBase
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(800, 450);
this.Name = "FrmBase";
this.Text = "FrmBase";
this.VisibleChanged += new System.EventHandler(this.FrmBase_VisibleChanged);
this.ResumeLayout(false);
}
#endregion
}
}
\ No newline at end of file
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace CodeLibrary
{
public partial class FrmBase : Form
{
public string CurrLanguage = "";
public string ClassName
{
get
{
return this.GetType().Name;
}
set
{
}
}
public FrmBase()
{
InitializeComponent();
}
public void LanguageProcess()
{
if (CurrLanguage.Equals(CodeResourceControl.GetLanguage()))
{
//return;
}
string className = this.ClassName;
CurrLanguage = CodeResourceControl.GetLanguage();
string name= CodeResourceControl.GetString(CodeResourceControl.GetTextIdStr(className), this.Text);
if (!name.Equals("")) { this.Text=name; }
foreach (Control con in this.Controls)
{
if (con is Label || con is Button || con is RadioButton || con is CheckBox)
{
string newStr = CodeResourceControl.GetString(CodeResourceControl.GetTextIdStr(className, con.Name), con.Text);
if (!newStr.Equals(""))
{
con.Text = newStr;
con.Tag = newStr;
}
if (CurrLanguage.Equals(CodeResourceControl.English))
{
con.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
}
else
{
con.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
}
}
else if (con.Controls.Count > 0)
{
PreControlLanaguage(con);
}
}
}
private void PreControlLanaguage(Control partentControl)
{
string className = this.ClassName;
string newStr = CodeResourceControl.GetString(CodeResourceControl.GetTextIdStr(className, partentControl.Name), partentControl.Text);
if (!newStr.Equals(""))
{
partentControl.Text = newStr;
}
foreach (Control con in partentControl.Controls)
{
if (con is Label || con is Button || con is RadioButton || con is CheckBox)
{
newStr = CodeResourceControl.GetString(CodeResourceControl.GetTextIdStr(className, con.Name), con.Text);
if (!newStr.Equals(""))
{ con.Text = newStr; }
if (CurrLanguage.Equals(CodeResourceControl.English))
{
con.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
}
else
{
con.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
}
}
else if (con.Controls.Count > 0)
{
PreControlLanaguage(con);
}
}
}
private void FrmBase_VisibleChanged(object sender, EventArgs e)
{
if (this.Visible.Equals(true))
{
CodeResourceControl.LanguageProcess(this, this.GetType().Name);
}
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
\ No newline at end of file
namespace CodeLibrary
{
partial class FrmCodeDecode
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmCodeDecode));
this.txtPath = new System.Windows.Forms.TextBox();
this.btnSelImage = new System.Windows.Forms.Button();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.txtResult = new System.Windows.Forms.TextBox();
this.hWindowControl1 = new HalconDotNet.HWindowControl();
this.btnbarCode = new System.Windows.Forms.Button();
this.btnLearn = new System.Windows.Forms.Button();
this.btnDCode = new System.Windows.Forms.Button();
this.btnClearLog = new System.Windows.Forms.Button();
this.cmbCount = new System.Windows.Forms.ComboBox();
this.lblCount = new System.Windows.Forms.Label();
this.btnCameraImage = new System.Windows.Forms.Button();
this.btnExit = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.cmbCamera = new System.Windows.Forms.ComboBox();
this.label2 = new System.Windows.Forms.Label();
this.cmbCodeType = new System.Windows.Forms.ComboBox();
this.label3 = new System.Windows.Forms.Label();
this.chbUseParam = new System.Windows.Forms.CheckBox();
this.txtParamPath = new System.Windows.Forms.TextBox();
this.label4 = new System.Windows.Forms.Label();
this.btnScanTest = new System.Windows.Forms.Button();
this.chbZxing = new System.Windows.Forms.CheckBox();
this.label5 = new System.Windows.Forms.Label();
this.label6 = new System.Windows.Forms.Label();
this.txt_reelphotodir = new System.Windows.Forms.TextBox();
this.check_issaveimage = new System.Windows.Forms.CheckBox();
this.button_optionfeil = new System.Windows.Forms.Button();
this.butt_cameracode = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.SuspendLayout();
//
// txtPath
//
this.txtPath.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.txtPath.Location = new System.Drawing.Point(892, 123);
this.txtPath.Name = "txtPath";
this.txtPath.Size = new System.Drawing.Size(127, 21);
this.txtPath.TabIndex = 0;
this.txtPath.Visible = false;
//
// btnSelImage
//
this.btnSelImage.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnSelImage.Location = new System.Drawing.Point(892, 189);
this.btnSelImage.Name = "btnSelImage";
this.btnSelImage.Size = new System.Drawing.Size(128, 33);
this.btnSelImage.TabIndex = 1;
this.btnSelImage.Tag = "打开本地图片";
this.btnSelImage.Text = "打开本地图片";
this.btnSelImage.UseVisualStyleBackColor = true;
this.btnSelImage.Visible = false;
this.btnSelImage.Click += new System.EventHandler(this.btnSelImage_Click);
//
// pictureBox1
//
this.pictureBox1.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.pictureBox1.BackColor = System.Drawing.Color.White;
this.pictureBox1.Location = new System.Drawing.Point(3, 96);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(559, 418);
this.pictureBox1.TabIndex = 2;
this.pictureBox1.TabStop = false;
//
// txtResult
//
this.txtResult.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.txtResult.Location = new System.Drawing.Point(568, 111);
this.txtResult.Multiline = true;
this.txtResult.Name = "txtResult";
this.txtResult.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
this.txtResult.Size = new System.Drawing.Size(302, 404);
this.txtResult.TabIndex = 3;
//
// hWindowControl1
//
this.hWindowControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.hWindowControl1.BackColor = System.Drawing.Color.Black;
this.hWindowControl1.BorderColor = System.Drawing.Color.Black;
this.hWindowControl1.ImagePart = new System.Drawing.Rectangle(0, 0, 640, 480);
this.hWindowControl1.Location = new System.Drawing.Point(9, 147);
this.hWindowControl1.Name = "hWindowControl1";
this.hWindowControl1.Size = new System.Drawing.Size(404, 278);
this.hWindowControl1.TabIndex = 8;
this.hWindowControl1.Visible = false;
this.hWindowControl1.WindowSize = new System.Drawing.Size(404, 278);
//
// btnbarCode
//
this.btnbarCode.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnbarCode.Location = new System.Drawing.Point(788, 10);
this.btnbarCode.Name = "btnbarCode";
this.btnbarCode.Size = new System.Drawing.Size(122, 33);
this.btnbarCode.TabIndex = 9;
this.btnbarCode.Tag = "一维码识别";
this.btnbarCode.Text = "一维码识别";
this.btnbarCode.UseVisualStyleBackColor = true;
this.btnbarCode.Visible = false;
this.btnbarCode.Click += new System.EventHandler(this.btnbarCode_Click);
//
// btnLearn
//
this.btnLearn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnLearn.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnLearn.Location = new System.Drawing.Point(922, 10);
this.btnLearn.Name = "btnLearn";
this.btnLearn.Size = new System.Drawing.Size(89, 33);
this.btnLearn.TabIndex = 10;
this.btnLearn.Tag = "学习";
this.btnLearn.Text = "学习";
this.btnLearn.UseVisualStyleBackColor = true;
this.btnLearn.Visible = false;
this.btnLearn.Click += new System.EventHandler(this.btnLearn_Click);
//
// btnDCode
//
this.btnDCode.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnDCode.Location = new System.Drawing.Point(788, 55);
this.btnDCode.Name = "btnDCode";
this.btnDCode.Size = new System.Drawing.Size(122, 33);
this.btnDCode.TabIndex = 11;
this.btnDCode.Tag = "二维码识别";
this.btnDCode.Text = "二维码识别";
this.btnDCode.UseVisualStyleBackColor = true;
this.btnDCode.Visible = false;
this.btnDCode.Click += new System.EventHandler(this.btnDCode_Click);
//
// btnClearLog
//
this.btnClearLog.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnClearLog.Location = new System.Drawing.Point(925, 228);
this.btnClearLog.Name = "btnClearLog";
this.btnClearLog.Size = new System.Drawing.Size(95, 33);
this.btnClearLog.TabIndex = 12;
this.btnClearLog.Tag = "清理日志";
this.btnClearLog.Text = "清理日志";
this.btnClearLog.UseVisualStyleBackColor = true;
this.btnClearLog.Visible = false;
this.btnClearLog.Click += new System.EventHandler(this.btnClearLog_Click);
//
// cmbCount
//
this.cmbCount.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cmbCount.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.cmbCount.FormattingEnabled = true;
this.cmbCount.Items.AddRange(new object[] {
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"11",
"12",
"13",
"14",
"15",
"16",
"17",
"18",
"19",
"20"});
this.cmbCount.Location = new System.Drawing.Point(656, 66);
this.cmbCount.Name = "cmbCount";
this.cmbCount.Size = new System.Drawing.Size(122, 25);
this.cmbCount.TabIndex = 16;
this.cmbCount.Visible = false;
//
// lblCount
//
this.lblCount.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.lblCount.Location = new System.Drawing.Point(574, 68);
this.lblCount.Name = "lblCount";
this.lblCount.Size = new System.Drawing.Size(75, 25);
this.lblCount.TabIndex = 15;
this.lblCount.Tag = "条码数量:";
this.lblCount.Text = "条码数量:";
this.lblCount.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
this.lblCount.Visible = false;
//
// btnCameraImage
//
this.btnCameraImage.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnCameraImage.Location = new System.Drawing.Point(892, 150);
this.btnCameraImage.Name = "btnCameraImage";
this.btnCameraImage.Size = new System.Drawing.Size(126, 33);
this.btnCameraImage.TabIndex = 17;
this.btnCameraImage.Tag = "相机获取图片";
this.btnCameraImage.Text = "相机获取图片";
this.btnCameraImage.UseVisualStyleBackColor = true;
this.btnCameraImage.Visible = false;
this.btnCameraImage.Click += new System.EventHandler(this.btnCameraImage_Click);
//
// btnExit
//
this.btnExit.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnExit.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnExit.Location = new System.Drawing.Point(922, 49);
this.btnExit.Name = "btnExit";
this.btnExit.Size = new System.Drawing.Size(89, 33);
this.btnExit.TabIndex = 18;
this.btnExit.Tag = "退出";
this.btnExit.Text = "退出";
this.btnExit.UseVisualStyleBackColor = true;
this.btnExit.Visible = false;
this.btnExit.Click += new System.EventHandler(this.btnExit_Click);
//
// label1
//
this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.label1.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label1.Location = new System.Drawing.Point(807, 126);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(72, 18);
this.label1.TabIndex = 19;
this.label1.Tag = "图片路径";
this.label1.Text = "图片路径";
this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
this.label1.Visible = false;
//
// cmbCamera
//
this.cmbCamera.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cmbCamera.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.cmbCamera.FormattingEnabled = true;
this.cmbCamera.Location = new System.Drawing.Point(250, 13);
this.cmbCamera.Name = "cmbCamera";
this.cmbCamera.Size = new System.Drawing.Size(312, 25);
this.cmbCamera.TabIndex = 21;
//
// label2
//
this.label2.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label2.Location = new System.Drawing.Point(154, 16);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(77, 19);
this.label2.TabIndex = 20;
this.label2.Tag = "相机列表:";
this.label2.Text = "相机列表:";
this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// cmbCodeType
//
this.cmbCodeType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cmbCodeType.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.cmbCodeType.FormattingEnabled = true;
this.cmbCodeType.Location = new System.Drawing.Point(656, 41);
this.cmbCodeType.Name = "cmbCodeType";
this.cmbCodeType.Size = new System.Drawing.Size(122, 25);
this.cmbCodeType.TabIndex = 23;
this.cmbCodeType.Visible = false;
this.cmbCodeType.SelectedIndexChanged += new System.EventHandler(this.cmbCodeType_SelectedIndexChanged);
//
// label3
//
this.label3.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label3.Location = new System.Drawing.Point(567, 41);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(82, 19);
this.label3.TabIndex = 22;
this.label3.Tag = "条码类型:";
this.label3.Text = "条码类型:";
this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
this.label3.Visible = false;
//
// chbUseParam
//
this.chbUseParam.AutoSize = true;
this.chbUseParam.Checked = true;
this.chbUseParam.CheckState = System.Windows.Forms.CheckState.Checked;
this.chbUseParam.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.chbUseParam.Location = new System.Drawing.Point(594, 15);
this.chbUseParam.Name = "chbUseParam";
this.chbUseParam.Size = new System.Drawing.Size(84, 24);
this.chbUseParam.TabIndex = 26;
this.chbUseParam.Tag = "使用参数";
this.chbUseParam.Text = "使用参数";
this.chbUseParam.UseVisualStyleBackColor = true;
this.chbUseParam.Visible = false;
//
// txtParamPath
//
this.txtParamPath.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txtParamPath.Enabled = false;
this.txtParamPath.Location = new System.Drawing.Point(892, 88);
this.txtParamPath.Name = "txtParamPath";
this.txtParamPath.Size = new System.Drawing.Size(128, 21);
this.txtParamPath.TabIndex = 28;
this.txtParamPath.Visible = false;
//
// label4
//
this.label4.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label4.Location = new System.Drawing.Point(811, 91);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(68, 18);
this.label4.TabIndex = 27;
this.label4.Tag = "参数路径";
this.label4.Text = "参数路径:";
this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
this.label4.Visible = false;
//
// btnScanTest
//
this.btnScanTest.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnScanTest.Location = new System.Drawing.Point(1069, 10);
this.btnScanTest.Name = "btnScanTest";
this.btnScanTest.Size = new System.Drawing.Size(167, 33);
this.btnScanTest.TabIndex = 30;
this.btnScanTest.Tag = "扫码测试";
this.btnScanTest.Text = "扫码测试";
this.btnScanTest.UseVisualStyleBackColor = true;
this.btnScanTest.Visible = false;
this.btnScanTest.Click += new System.EventHandler(this.btnScanTest_Click);
//
// chbZxing
//
this.chbZxing.AutoSize = true;
this.chbZxing.Checked = true;
this.chbZxing.CheckState = System.Windows.Forms.CheckState.Checked;
this.chbZxing.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.chbZxing.Location = new System.Drawing.Point(673, 15);
this.chbZxing.Name = "chbZxing";
this.chbZxing.Size = new System.Drawing.Size(116, 24);
this.chbZxing.TabIndex = 31;
this.chbZxing.Tag = "EyemDecode";
this.chbZxing.Text = "EyemDecode";
this.chbZxing.UseVisualStyleBackColor = true;
this.chbZxing.Visible = false;
//
// label5
//
this.label5.AutoSize = true;
this.label5.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label5.Location = new System.Drawing.Point(1083, 57);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(0, 20);
this.label5.TabIndex = 32;
//
// label6
//
this.label6.AutoSize = true;
this.label6.Location = new System.Drawing.Point(566, 96);
this.label6.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(89, 12);
this.label6.TabIndex = 33;
this.label6.Text = "识别条码内容:";
//
// txt_reelphotodir
//
this.txt_reelphotodir.Location = new System.Drawing.Point(158, 68);
this.txt_reelphotodir.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.txt_reelphotodir.Name = "txt_reelphotodir";
this.txt_reelphotodir.Size = new System.Drawing.Size(317, 21);
this.txt_reelphotodir.TabIndex = 34;
//
// check_issaveimage
//
this.check_issaveimage.AutoSize = true;
this.check_issaveimage.Location = new System.Drawing.Point(165, 45);
this.check_issaveimage.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.check_issaveimage.Name = "check_issaveimage";
this.check_issaveimage.Size = new System.Drawing.Size(96, 16);
this.check_issaveimage.TabIndex = 35;
this.check_issaveimage.Text = "是否保存图片";
this.check_issaveimage.UseVisualStyleBackColor = true;
//
// button_optionfeil
//
this.button_optionfeil.Location = new System.Drawing.Point(484, 55);
this.button_optionfeil.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.button_optionfeil.Name = "button_optionfeil";
this.button_optionfeil.Size = new System.Drawing.Size(77, 34);
this.button_optionfeil.TabIndex = 36;
this.button_optionfeil.Text = "选择文件夹";
this.button_optionfeil.UseVisualStyleBackColor = true;
this.button_optionfeil.Click += new System.EventHandler(this.button_optionfeilClick);
//
// butt_cameracode
//
this.butt_cameracode.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.butt_cameracode.Location = new System.Drawing.Point(9, 16);
this.butt_cameracode.Name = "butt_cameracode";
this.butt_cameracode.Size = new System.Drawing.Size(122, 72);
this.butt_cameracode.TabIndex = 37;
this.butt_cameracode.Tag = "";
this.butt_cameracode.Text = "获取相机图片及条码";
this.butt_cameracode.UseVisualStyleBackColor = true;
this.butt_cameracode.Click += new System.EventHandler(this.butt_cameracode_Click);
//
// FrmCodeDecode
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1028, 522);
this.Controls.Add(this.butt_cameracode);
this.Controls.Add(this.pictureBox1);
this.Controls.Add(this.button_optionfeil);
this.Controls.Add(this.check_issaveimage);
this.Controls.Add(this.txt_reelphotodir);
this.Controls.Add(this.hWindowControl1);
this.Controls.Add(this.label6);
this.Controls.Add(this.txtResult);
this.Controls.Add(this.btnSelImage);
this.Controls.Add(this.btnDCode);
this.Controls.Add(this.label5);
this.Controls.Add(this.chbZxing);
this.Controls.Add(this.btnScanTest);
this.Controls.Add(this.txtParamPath);
this.Controls.Add(this.label4);
this.Controls.Add(this.chbUseParam);
this.Controls.Add(this.cmbCodeType);
this.Controls.Add(this.cmbCamera);
this.Controls.Add(this.label2);
this.Controls.Add(this.btnExit);
this.Controls.Add(this.btnCameraImage);
this.Controls.Add(this.cmbCount);
this.Controls.Add(this.lblCount);
this.Controls.Add(this.btnClearLog);
this.Controls.Add(this.btnLearn);
this.Controls.Add(this.btnbarCode);
this.Controls.Add(this.txtPath);
this.Controls.Add(this.label1);
this.Controls.Add(this.label3);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.Name = "FrmCodeDecode";
this.Text = "二维码识别";
this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmCodeDecode_FormClosing);
this.Load += new System.EventHandler(this.FrmMain_Load);
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.TextBox txtPath;
private System.Windows.Forms.Button btnSelImage;
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.TextBox txtResult;
private HalconDotNet.HWindowControl hWindowControl1;
private System.Windows.Forms.Button btnbarCode;
private System.Windows.Forms.Button btnLearn;
private System.Windows.Forms.Button btnDCode;
private System.Windows.Forms.Button btnClearLog;
private System.Windows.Forms.ComboBox cmbCount;
private System.Windows.Forms.Label lblCount;
private System.Windows.Forms.Button btnCameraImage;
private System.Windows.Forms.Button btnExit;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.ComboBox cmbCamera;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.ComboBox cmbCodeType;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.CheckBox chbUseParam;
private System.Windows.Forms.TextBox txtParamPath;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.Button btnScanTest;
private System.Windows.Forms.Label label5;
public System.Windows.Forms.CheckBox chbZxing;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.TextBox txt_reelphotodir;
private System.Windows.Forms.CheckBox check_issaveimage;
private System.Windows.Forms.Button button_optionfeil;
private System.Windows.Forms.Button butt_cameracode;
}
}

using CodeLibrary;
using HalconDotNet;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Threading;
using System.Text.RegularExpressions;
using System.IO.MemoryMappedFiles;
using System.Net;
using System.Runtime.Serialization.Formatters.Binary;
using System.Xml.Serialization;
using Newtonsoft.Json;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.ProgressBar;
namespace CodeLibrary
{
public partial class FrmCodeDecode : FrmBase
{
private Stopwatch stopwatch = new Stopwatch();
// private List<string> baslerNameList = new List<string>();
// private List<string> hikNameList = new List<string>();
public FrmCodeDecode()
{
this.CurrLanguage = "en-US";
CodeResourceControl.CurrLanguage= "en-US";
InitializeComponent();
}
private string selCamera = CodeResourceControl.GetString("selCamera", "请先选择相机");
private string selImage = CodeResourceControl.GetString("selImage", "请先选择图片");
private string title = CodeResourceControl.GetString("title", "提示");
private string imageIsNull = CodeResourceControl.GetString("imageIsNull", "获取二维码图片为空");
private string sureDelete = CodeResourceControl.GetString("sureDelete", "确定删除文件:");
private void FrmMain_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
cmbCount.Items.Clear(); cmbCount.Items.Add(0);
for (int i = 1; i <= 300; i++)
{
cmbCount.Items.Add(i);
}
cmbCount.SelectedIndex = 0;
cmbCount.SelectedIndex = 0;
try
{
LoadCamera();
}
catch { }
if (HDCodeLearnHelper.codeTypeList.Count > 0)
{
cmbCodeType.DataSource = HDCodeLearnHelper.codeTypeList;
cmbCodeType.SelectedIndex = cmbCodeType.Items.Count-1;
}
else
{
cmbCodeType.Items.Add("remote");
cmbCodeType.SelectedIndex = 0;
}
}
private void ClearPicImg()
{
try
{
if (pictureBox1.Image != null)
{
pictureBox1.Image.Dispose();
pictureBox1.Image = null;
}
if (HDCodeLearnHelper.DefaultImage != null)
{
HDCodeLearnHelper.DefaultImage.Dispose();
HDCodeLearnHelper.DefaultImage = null;
}
}
catch (Exception ex)
{
HDLogUtil.error("ClearPicImg error : " + ex.ToString());
}
}
private void LoadCamera()
{
HDLogUtil.error("加载相机");
cmbCamera.Items.Clear();
Camera.Type = CameraType.HIKIDMVS;
Camera._cam.Load();
if (Camera._cam.Name == null)
return;
foreach (string str in Camera._cam.Name)
{
cmbCamera.Items.Add(str);
}
if (cmbCamera.Items.Count > 0)
{
cmbCamera.SelectedIndex = 0;
}
}
private void btnSelImage_Click(object sender, EventArgs e)
{
System.Windows.Forms.OpenFileDialog openDialog = new System.Windows.Forms.OpenFileDialog();
openDialog.Title = selImage;
openDialog.Filter = "(*.jpg;*.png;*.bmp;*.hobj)|*.jpg;*.png;*.bmp;*.hobj";
// openDialog.Filter = "All Supported Images (*.bmp;*.dib;*.rle;*.gif;*.jpg;*.png)|*.bmp;*.dib;*.rle;*.gif;*.jpg;*.png|Bitmaps (*.bmp;*.dib;*.rle)|*.bmp;*.dib;*.rle|Graphics Interchange Format (*.gif)|*.gif|Joint Photographic Experts (*.jpg)|*.jpg|Portable Network Graphics (*.png)|*.png|All Files (*.*)|*.*";
//openDialog.DefaultExt = "png";
System.Windows.Forms.DialogResult result = openDialog.ShowDialog();
if (result == System.Windows.Forms.DialogResult.Cancel)
{
return;
}
txtPath.Text = openDialog.FileName;
string filename = txtPath.Text;
if (string.IsNullOrEmpty(filename))
{
MessageBox.Show(imageIsNull);
}
ClearPicImg();
if (openDialog.FileName.EndsWith(".hobj"))
{
HObject hObject = null;
HOperatorSet.GenEmptyObj(out hObject);
hObject.ReadObject(openDialog.FileName);
if (hObject != null)
{
HDCodeLearnHelper.DefaultImage = hObject;
HDCodeHelper.HObject2Bpp8(hObject, out HDCodeLearnHelper.DefaultBitmap);
//pictureBox1.Image = (Bitmap)bitmap.Clone();
//HDCodeLearnHelper.DefaultBitmap = (Bitmap)bitmap.Clone();
//bitmap.Dispose();
ShowImage(hObject);
}
else
{
MessageBox.Show("读取文件失败:" + openDialog.FileName);
}
}
else
{
if (HDCodeLearnHelper.DefaultBitmap != null)
HDCodeLearnHelper.DefaultBitmap.Dispose();
//读取图片内容
Image img = (Image)Image.FromFile(filename).Clone();
pictureBox1.Image = img;
Bitmap bitmap = new Bitmap(filename);
HDCodeLearnHelper.DefaultBitmap = bitmap;
HObject hoimg;
HDCodeHelper.Bitmap2HObjectBpp24(bitmap,out hoimg);
HDCodeLearnHelper.DefaultImage = hoimg;
ShowImage(hoimg);
}
}
private void btnErZhi_Click(object sender, EventArgs e)
{
if (pictureBox1.Image == null || txtPath.Text.Equals(""))
{
MessageBox.Show(selImage, title, MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
Bitmap map = new Bitmap(pictureBox1.Image);
Bitmap newMap = ImageHelper.ConvertTo1Bpp1(map);
pictureBox1.Image = newMap;
}
private void btnGray_Click(object sender, EventArgs e)
{
if (pictureBox1.Image == null || txtPath.Text.Equals(""))
{
MessageBox.Show(selImage, title, MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
Bitmap map = new Bitmap(pictureBox1.Image);
Bitmap newMap = ImageHelper.ToGray(map);
pictureBox1.Image = newMap;
}
private void ShowCode(List<CodeInfo> list)
{
if (list.Count > 0)
{
txtResult.Text += "\r\n code list:";
foreach (CodeInfo code in list)
{
txtResult.Text += "\r\n" + "" + code.CodeType + " (X:" + code.X + ",Y:" + code.Y + ",R:" + code.Orientation + ") " + code.CodeStr;
//txtResult.Text += "\r\n" + "" + code.CodeType + " (X:" + code.X + ",Y:" + code.Y + ",R:" + code.Orientation + ") " + code.GetCodeStr();
}
}
else
{
txtResult.Text += "\r\n no code ";
}
}
private void btnbarCode_Click(object sender, EventArgs e)
{
if (HDCodeLearnHelper.DefaultImage == null)
{
MessageBox.Show(selImage, title, MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
int count = cmbCount.SelectedIndex;
txtResult.Text = "";
stopwatch.Restart();
HDCodeHelper.HalconWindow = this.hWindowControl1.HalconWindow;
if (chbZxing.Checked)
{
if (pictureBox1.Image == null)
{
MessageBox.Show(selImage, title, MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
Bitmap map = new Bitmap(pictureBox1.Image);
zxingDecode(map, "barcode");
}
else
{
List<CodeInfo> result = HDCodeHelper.DecodeBarCode(HDCodeLearnHelper.DefaultImage);
ShowCode(result);
txtResult.Text += "\r\n elapsed time:" + stopwatch.Elapsed.ToString();
}
}
public void ShowImage(HObject ho_Image)
{
HTuple width, height;
HOperatorSet.GetImageSize(ho_Image, out width, out height);
int dWidth = (int)width.D;
int dHeight = (int)height.D;
this.hWindowControl1.HalconWindow.SetPart(0, 0, dHeight, dWidth);
HOperatorSet.DispObj(ho_Image, hWindowControl1.HalconWindow);
}
private void btnLearn_Click(object sender, EventArgs e)
{
FrmCodeLearn frm = new FrmCodeLearn();
frm.ShowDialog();
}
private void btnDCode_Click(object sender, EventArgs e)
{
int count = cmbCount.SelectedIndex;
txtResult.Text = "";
stopwatch.Restart();
// Bitmap map = new Bitmap(pictureBox1.Image);
//HObject ho_image = HDCodeHelper.Bitmap2HObjectBpp24(map);
txtResult.Text += "\r\n elapsed time:" + stopwatch.Elapsed.ToString();
//hWindowControl1.HalconWindow.SetPart(0, 0, map.Height, map.Width);
//HOperatorSet.DispObj(ho_image, hWindowControl1.HalconWindow);
//ShowImage(ho_image);
HDCodeHelper.HalconWindow = this.hWindowControl1.HalconWindow;
string codeParamPath = HDCodeHelper.GetCodeParamFilePath(cmbCodeType.Text);
if (chbUseParam.Checked.Equals(false))
{
codeParamPath = "";
}
if (chbZxing.Checked)
{
if (pictureBox1.Image == null)
{
//MessageBox.Show(selImage, title, MessageBoxButtons.OK, MessageBoxIcon.Error);
//return;
}
if (HDCodeLearnHelper.DefaultBitmap != null)
{
Bitmap b = (Bitmap)HDCodeLearnHelper.DefaultBitmap.Clone();
/*int[] blocksizelist = new int[] {1, 3,5,7, 9, 11, 13, 15, 17, 19,21 };
int[] rangelist = new int[] { 5 };
foreach (int bs in blocksizelist)
{
foreach (int r in rangelist)
{
txtResult.Text += $"\r\n blocksize:{bs}, range:{r}";
Task<List<CodeInfo>> task = Task.Run(() =>
{
return EyemDecode.Decoder(ref b, null, bs, r);
});
task.Wait();
ShowCode(task.Result); Application.DoEvents();
}
}*/
var codelist = EyemDecode2.Decoder(ref b, null);
ShowCode(codelist); Application.DoEvents();
return;
}
}
else
{
if (HDCodeLearnHelper.DefaultImage == null)
{
MessageBox.Show(selImage, title, MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
List<CodeInfo> codeList = new List<CodeInfo>();
if (cmbCodeType.Text.ToLower().Equals("barcode"))
{
codeList = HDCodeHelper.DecodeBarCode(HDCodeLearnHelper.DefaultImage);
}
else if (cmbCodeType.Text.ToLower().Equals("remote"))
{
int codecount = 3;
int.TryParse(cmbCount.SelectedItem.ToString(),out codecount);
RemoteDecodeHelper.RemoteDecodeParam remoteDecodeParam = new RemoteDecodeHelper.RemoteDecodeParam
{
codeTypeList = new string[] { "barcode", "Data Matrix ECC 200", "QR Code", "PDF417", "eyem" },
codeCount = codecount,
timeout = 4000
};
codeList = RemoteDecodeHelper.DecodeRequest(HDCodeLearnHelper.DefaultBitmap, remoteDecodeParam);
if (codeList == null) return;
}
else
{
codeList = HDCodeHelper.DecodeCode(HDCodeLearnHelper.DefaultImage, count, codeParamPath, cmbCodeType.Text);
}
ShowCode(codeList);
txtResult.Text += "\r\n elapsed time:" + stopwatch.Elapsed.ToString();
}
}
private void zxingDecode(Bitmap map, string type)
{
List<string> results = ZXingCodeHelper.DeCodes(map, type);
txtResult.Text = " zxing decode:";
foreach (string code in results)
{
txtResult.Text += "\r\n" + "\r\n" + code;
}
txtResult.Text += "\r\n \r\n elapsed time:" + stopwatch.Elapsed.ToString();
}
private void btnClearLog_Click(object sender, EventArgs e)
{
HDLogUtil.ClearLog();
txtResult.Text = "";
}
private HObject GetCameraBitmap(out Bitmap bitmap)
{
bitmap = null;
try
{
int index = cmbCamera.SelectedIndex;
string camerName = cmbCamera.Text;
if (index < 0)
{
MessageBox.Show(selCamera);
return null;
}
HObject map;
map = Camera._cam.CaptureOnImage(camerName, out bitmap, out List<CodeInfo> code);
if (map == null)
{
Camera._cam.Close(camerName);
map = Camera._cam.CaptureOnImage(camerName, out bitmap, out code);
}
//bitmap?.Save("C:\\Users\\Acc\\Desktop\\IDMVS\\相机工具\\image\\1.png");
return map;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
return null;
}
private void btnCameraImage_Click(object sender, EventArgs e)
{
try
{
if (!chbZxing.Checked)
{
pictureBox1.Visible = false;
HObject bitmap = GetCameraBitmap(out Bitmap b);
if (bitmap != null)
{
HDLogUtil.info("从相机【" + cmbCamera.Text + "】获取到一张图片");
ClearPicImg();
//pictureBox1.Image = (Image)bitmap.Clone();
//HObject hoImage = HDCodeHelper.Bitmap2HObjectBpp24(bitmap);
HDCodeLearnHelper.DefaultImage = bitmap;
ShowImage(bitmap);
}
HDCodeLearnHelper.DefaultBitmap = b;
}
else
{
pictureBox1.Visible = true;
int index = cmbCamera.SelectedIndex;
string camerName = cmbCamera.Text;
if (index < 0)
{
MessageBox.Show(selCamera);
return;
}
Bitmap bitmap = null;
List < CodeInfo > codeInfos = Camera._cam.GetImageAndIdentifyCode(out bitmap);
if (bitmap != null)
{
HDLogUtil.info("从相机【" + cmbCamera.Text + "】获取到一张图片");
if (check_issaveimage.Checked)
{
ImageFormat rmat = bitmap.RawFormat;
string fileName = DateTime.Now.ToString("yyyyMMddHHmmss");
string path = txt_reelphotodir.Text + "\\" + fileName+".jpg";
bitmap?.Save(path);
}
ClearPicImg();
pictureBox1.Image = (Image)bitmap.Clone();
////HObject hoImage = HDCodeHelper.Bitmap2HObjectBpp24(bitmap);
//HDCodeLearnHelper.DefaultImage = bitmap;
//ShowImage(bitmap);
}
HDLogUtil.info($"{codeInfos.Count}");
//bitmap?.Save("C:\\Users\\Acc\\Desktop\\IDMVS\\相机工具\\image\\12.png");
txtResult.Text += "\r\n elapsed time:" + stopwatch.Elapsed.ToString();
foreach (var item in codeInfos)
{
txtResult.Text += "\r\n" + item.CodeStr;
}
}
}
catch (Exception ex)
{
HDLogUtil.error(ex.ToString());
}
}
private void btnExit_Click(object sender, EventArgs e)
{
if (HDCodeLearnHelper.DefaultBitmap != null)
HDCodeLearnHelper.DefaultBitmap.Dispose();
this.Close();
}
private void btnLigth_Click(object sender, EventArgs e)
{
if (pictureBox1.Image == null || txtPath.Text.Equals(""))
{
MessageBox.Show(selImage, title, MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
Bitmap map = new Bitmap(pictureBox1.Image);
Bitmap newMap = ImageHelper.KiLighten(map, 10);
pictureBox1.Image = newMap;
}
private void btnAn_Click(object sender, EventArgs e)
{
if (pictureBox1.Image == null || txtPath.Text.Equals(""))
{
MessageBox.Show(selImage, title, MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
Bitmap map = new Bitmap(pictureBox1.Image);
Bitmap newMap = ImageHelper.KiLighten(map, -10);
pictureBox1.Image = newMap;
}
private void cmbCodeType_SelectedIndexChanged(object sender, EventArgs e)
{
if (cmbCodeType.SelectedIndex >= 0)
{
txtParamPath.Text = HDCodeHelper.GetCodeParamFilePath(cmbCodeType.Text);
}
}
private System.Timers.Timer testTimer = new System.Timers.Timer();
private int testCount = 0;
private void button1_Click(object sender, EventArgs e)
{
if (testTimer.Enabled)
{
HDLogUtil.info("停止扫码测试");
testTimer.Stop();
}
else
{
HDLogUtil.info("开始扫码测试");
testCount = 0;
testTimer.Interval = 1000;
testTimer.Elapsed += TestTimer_Elapsed;
testTimer.AutoReset = true;
testTimer.Start();
}
}
private void TestTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
try
{
if (pictureBox1.Image == null)
{
return;
}
int count = cmbCount.SelectedIndex;
txtResult.Text = "";
stopwatch.Restart();
testCount++;
Bitmap map = new Bitmap(pictureBox1.Image);
HObject ho_image;
HDCodeHelper.Bitmap2HObjectBpp24(map,out ho_image);
txtResult.Text += "\r\n elapsed time:" + stopwatch.Elapsed.ToString();
hWindowControl1.HalconWindow.SetPart(0, 0, map.Height, map.Width);
HOperatorSet.DispObj(ho_image, hWindowControl1.HalconWindow);
ShowImage(ho_image);
HDCodeHelper.HalconWindow = this.hWindowControl1.HalconWindow;
string codeParamPath = HDCodeHelper.GetCodeParamFilePath(cmbCodeType.Text);
if (chbUseParam.Checked.Equals(false))
{
codeParamPath = "";
}
List<CodeInfo> codeList = new List<CodeInfo>();
if (cmbCodeType.Text.ToLower().Equals("barcode"))
{
codeList = HDCodeHelper.DecodeBarCode(ho_image);
}
else
{
codeList = HDCodeHelper.DecodeCode(ho_image, count, codeParamPath, cmbCodeType.Text);
}
ShowCode(codeList);
txtResult.Text += "\r\n elapsed time:" + stopwatch.Elapsed.ToString();
HDLogUtil.info("第【" + testCount + "】次扫码测试结束");
}
catch (Exception ex)
{
HDLogUtil.error(ex.ToString());
}
}
private void FrmCodeDecode_FormClosing(object sender, FormClosingEventArgs e)
{
try
{
HDLogUtil.info("关闭所有相机");
Camera._cam.CloseAll();
}
catch (global::System.Exception)
{
}
}
private void btnScanTest_Click(object sender, EventArgs e)
{
this.Enabled = false;
this.Cursor = Cursors.WaitCursor;
Task.Factory.StartNew(delegate
{
//ScanTest();
ScanDemo(100);
});
}
private void ScanTest()
{
for (int index = 1; index <= 200; index++)
{
try
{
label5.Text = "扫码测试_" + index;
int name = (index % 3) + 1;
string filename = @"F:\test\" + name + ".hobj";
if (!File.Exists(filename))
{
continue;
}
ClearPicImg();
if (filename.EndsWith(".hobj"))
{
HObject hObject = null;
HOperatorSet.GenEmptyObj(out hObject);
hObject.ReadObject(filename);
if (hObject != null)
{
HDCodeLearnHelper.DefaultImage = hObject;
ShowImage(hObject);
}
else
{
MessageBox.Show("读取文件失败:" + filename);
}
}
else
{
//读取图片内容
Image img = (Image)Image.FromFile(filename).Clone();
pictureBox1.Image = img;
Bitmap bitmap = new Bitmap(pictureBox1.Image);
HObject hoimg;
HDCodeHelper.Bitmap2HObjectBpp24(bitmap, out hoimg);
HDCodeLearnHelper.DefaultImage = hoimg;
ShowImage(hoimg);
}
btnDCode_Click(null, null);
Thread.Sleep(100);
}
catch (Exception ex)
{
HDLogUtil.error("ScanTest[" + index + "]出错:" + ex.ToString());
}
}
this.Enabled = true;
this.Cursor = Cursors.Default;
}
private void ScanDemo(int whileCount = 1)
{
string camerName = cmbCamera.Text;
if (cmbCamera.SelectedIndex < 0)
{
//MessageBox.Show(selCamera);
txtResult.Text = selCamera;
return;
}
int count = cmbCount.SelectedIndex;
List<string> codeTypeList = new List<string>(HDCodeLearnHelper.codeTypeList);
//Task task = null;
for (int index = 1; index <= whileCount; index++)
{
//task = Task.Factory.StartNew(delegate {
label5.Text = "扫码测试_" + index;
HObject ho_Image = null;
try
{
List<CodeInfo> codeInfos = null;
ho_Image = Camera._cam.CaptureOnImage(camerName, out codeInfos);
//如果codeInfos不等于空,证明是扫码相机
if (codeInfos != null)
{
string r = null;
foreach (CodeInfo c in codeInfos)
{
r += (c.CodeStr) + "##";
}
txtResult.Text = r;
}
if (ho_Image != null && codeInfos == null)
{
//ClearPicImg();
// ShowImage(ho_Image);
HDLogUtil.info(" 相机【" + camerName + "】获取图片完成,开始扫码");
List<CodeInfo> cc = new List<CodeInfo>();
string r = "ScanDemo[" + index + "]\r\n";
foreach (string codeType in codeTypeList)
{
//判断是否是一维码
if (codeType.ToLower().Equals("barcode"))
{
cc = HDCodeHelper.DecodeBarCode(ho_Image);
}
else
{
string codeParamPath = HDCodeHelper.GetCodeParamFilePath(codeType);
cc = HDCodeHelper.DecodeCode(ho_Image, count, codeParamPath, codeType);
}
foreach (CodeInfo c in cc)
{
r += (c.CodeStr) + "##";
}
}
//MessageBox.Show(r);
txtResult.Text = r;
}
}
catch (Exception ex)
{
HDLogUtil.error("ScanDemo[" + index + "]出错:" + ex.ToString());
}
finally
{
if (ho_Image != null)
{
ho_Image.Dispose();
ho_Image = null;
}
}
//});
//task.Wait();
//GC.Collect();
//Thread.Sleep(100);
//task.Dispose();
Thread.Sleep(5);
}
this.Enabled = true;
this.Cursor = Cursors.Default;
}
private void btnCopyN_Click(object sender, EventArgs e)
{
string text = cmbCamera.Text;
Clipboard.SetDataObject(text);
}
private void button_optionfeilClick(object sender, EventArgs e)
{
FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
folderBrowserDialog.ShowNewFolderButton = true;
if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
{
txt_reelphotodir.Text = folderBrowserDialog.SelectedPath;
}
}
private void butt_cameracode_Click(object sender, EventArgs e)
{
pictureBox1.Visible = true;
int index = cmbCamera.SelectedIndex;
string camerName = cmbCamera.Text;
if (index < 0)
{
MessageBox.Show(selCamera);
return;
}
Bitmap bitmap = null;
List<CodeInfo> codeInfos = Camera._cam.GetImageAndIdentifyCode(out bitmap);
if (bitmap != null && codeInfos != null)
{
HDLogUtil.info("从相机【" + cmbCamera.Text + "】获取到一张图片");
if (check_issaveimage.Checked)
{
if (codeInfos.Count > 0)
{
ImageFormat rmat = bitmap.RawFormat;
string fileName = DateTime.Now.ToString("yyyyMMddHHmmss");
string path = txt_reelphotodir.Text + "\\" + fileName + ".jpg";
string strdata = JsonConvert.SerializeObject(codeInfos);
bitmap?.Save(path);
string filePath = txt_reelphotodir.Text + "\\" + fileName + ".txt";
File.WriteAllText(filePath, strdata);
}
}
ClearPicImg();
pictureBox1.Image = (Image)bitmap.Clone();
////HObject hoImage = HDCodeHelper.Bitmap2HObjectBpp24(bitmap);
//HDCodeLearnHelper.DefaultImage = bitmap;
//ShowImage(bitmap);
}
HDLogUtil.info($"{codeInfos.Count}");
txtResult.Text += "\r\n elapsed time:" + stopwatch.Elapsed.ToString();
foreach (var item in codeInfos)
{
txtResult.Text += "\r\n" + item.CodeStr;
}
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAYGAAAAEAIAColAAAFgAAACgAAABgAAAAwAAAAAEAIAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JieVNiYnsTYm
J7E2JiaxNiYnsTYmJ7E2JiaxNiYnsTYmJrE2JiaxNiYnsTYmJrE2JiaxNiYnsTYmJrE2JiaxNiYnsTYm
JrE2JiexNiYnsTYmJ7E2JiexNiYnsTYmJ7E2JiexNiYnsTYmJ7E2JiavNiYnBAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJyY2JiexNiYnsTYmJ7E2JiexNiYmsTYmJ7E2JiexNiYmsTYm
J7E2JiexNiYmsTYmJ7E2JiexNiYmsTYmJ7E2JiexNiYmsTYmJ7E2JiexNiYmsTYmJ7E2JiexNiYmsTYm
J7E2JiexNiYmsTYmJ7E2Jic2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA2JiYONiYnMjYmJxoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAA2JifVNiYn/zYmJ/81Jif/NiYn/zYmJ/81Jif/NiYn/zUmJ/81Jif/NiYn/zUm
J/81Jif/NiYn/zUmJ/81Jif/NiYn/zUmJ/81Jif/NiYn/zYmJ/81Jif/NiYn/zYmJ/81Jif/NiYn/zYm
J/82Jif7NicnBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJzY1Jif/NiYn/zYm
J/82Jif/NSYn/zYmJ/82Jif/NSYn/zYmJ/82Jif/NSYn/zYmJ/82Jif/NSYn/zYmJ/82Jif/NSYn/zYm
J/82Jif/NSYn/zYmJ/82Jif/NSYn/zYmJ/82Jif/NSYn/zYmJ/82JidOAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAANSYnBjYmJ402Jif3NSYn/zUlJ/02Jie3NiYmIAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiUm/zYlJv81JSb/NiUm/zYl
Jv81JSb/NiUm/zUlJv81JSb/NiUm/zUlJv81JSb/NiUm/zUlJv81JSb/NiUm/zUlJv81JSb/NiUm/zUl
Jv81JSb/NiUm/zUlJv81JSb/NiUm/zUlJv82Jib7NycnBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAADYmJzY1JSb/NiUm/zUlJv82JSb/NSUm/zYlJv82JSb/NSUm/zYlJv82JSb/NSUm/zYl
Jv82JSb/NSUm/zYlJv82JSb/NSUm/zYlJv82JSb/NSUm/zYlJv82JSb/NSUm/zYlJv82JSb/NSUm/zYl
Jv82JidOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1JicENSYnqzYlJv82JSb/NSUm/zYl
Jv82JSb/NiYn3zYmJw4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA2JifVNiYn/zUmJv81Jib/NiYn/zUmJv81JSb/NiUn/zUlJv81JSb/NiUn/zUlJv81JSb/NiUn/zUl
Jv81JSb/NiUn/zUlJv81JSf/NiYn/zUlJ/81JSf/NiYn/zUlJ/81JSf/NiYn/zUlJ/82Jib7NycnBgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJzY1JSf/NiYn/zUlJ/82JSb/NSYm/zYl
J/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYl
J/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JidOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUm
JwQ1JietNSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYmJ2wAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiYn/zYmJ/81Jif/NiYn/zYmJ/81Jif/NiYn/zUm
J/81Jif/NiYn/zUmJ/81Jif/NiYn/zUmJ/81Jif/NiYn/zUmJ/81Jif/NiYn/zYmJ/81Jif/NiYn/zYm
J/81Jif/NiYn/zYmJ/82Jif7NicnBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYm
Jy41JifZNiYn2TUmJ9k2JifZNSYm2TYmJ9k2JifZNSYm2TYmJ9k2JifZNSYm2TYmJ+s2Jif/NSYn/zYm
J/82Jif/NiYn+TYmJ/E2JifxNSYn8TYmJ/E2JifxNSYn8TYmJ/E2JifxNSYn8TYmJ/E2JidKAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAANSYnBjUmJ6s2Jif/NSYn/zYmJ/82Jif/NSYn/zYmJ/82Jif/NSYn/zYm
J5EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiUm/zYl
Jv81JSb/NiUm/zYmJ8c1JSeNNSUnjTUlJ401JSeNNSUnjTUlJ401JSeNNSUnjTUlJ401JSeNNSUnjTUl
J401JSeNNSUnjTUlJ401JSeNNiYnszUlJv81JSb/NiUm/zUlJv82Jib7NycnBgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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
AAAAAAAANiYnVjUlJv82Jif9NiYneDUmKAAAAAAANiYnFDYmJ5U2Jif5NiUm/zUlJv81JSb/NiUm/zUl
Jv81JSb/NiUm/zUlJv81JSb/NiUm/zUlJv82JSb/NSUm/zYlJv82JSb/NSUm/zYlJv82JSb/NSUm/zYl
Jv82JSb/NSUm/zYlJv82JSb/NSUm/zYmJ+k2JidyNiYnCAAAAAA2JicCNSUnoTYlJv82JSb/NSUm/zYl
Jv82JSb/NSUm/zYlJv82JSb/NSUm/zYmJ+s2JicwAAAAAAAAAAAAAAAANiYnCjYmJ702JSb/NSUm/zYl
Jv82JSb/NSUm/zYlJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA2JifVNiYn/zUmJv81Jib/NiYn/zYmJ4MAAAAAAAAAAAAAAAA2JicmNiYn9zYmJvc2Jif3NiYn9zYm
Jvc2Jif3NiYn9zYmJvc2JifzNiYnBgAAAAAAAAAANiYnVjYmJ/s2JidgAAAAADcnJwA2JideNiYn7TUl
J/81JSf/NiYn/zUlJ/81JSf/NiYn/zUlJ/81JSf/NiYn/zUlJ/81JSf/NiYn/zUlJ/82Jif7NiYn+zYl
J/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NiYn3TYm
J0o2JiedNSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NiYn6TYmJywAAAAAAAAAAAAA
AAA2JicKNiYnvTYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiYn/zYmJ/81Jif/NiYn/zYmJ4MAAAAAAAAAAAAA
AAA3JycANiYmBDYmJgQ2JiYENiYmBDYmJgQ2JiYENiYmBDYmJgQ2JicENSYoAAAAAAAAAAAANiYnSjYm
J0oAAAAANSUmDDYmJ6k2Jif/NiYn/zYmJ/81Jif/NiYn/zYmJ/81Jif/NiYn/zYmJ/81Jif/NiYn7zYm
J7E2Jid2NiYnRDYmJxw2JicGNiYmBjYmJxA2JicoNSUnRjYmJ2w2JiedNiYn1zYmJ/02Jif/NSYn/zYm
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JidWNiUm/zUlJv81JSb/NiUm/zUl
Jv82JieRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJ042JSb/NSUm/zYlJv82JSb/NSUm/zYm
J40AAAAANiYnYjYlJv82JieVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANSUmlzYlJv82JSb/NSUm/zYl
J+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA2Jie/NiYn/zUlJ/81JSf/NiYn/zYmJ/M2JicUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAg
IAA2JifFNSYm/zYlJ/82JSb/NSYm/zYmJ+01JScGNiYnBDYmJ9U2JieVAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAANSYmlzYlJ/82JSb/NSYm/zYlJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJx42Jif9NiYn/zYmJ/81Jif/NiYn/zYmJ5MAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JidONSYn/zYmJ/82Jif/NSYn/zYmJ/81JidMAAAAADYm
J1I2JieVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANSYmlzYmJ/82Jif/NSYn/zYmJ+cAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJ3A1JSb/NiUm/zUl
Jv81JSb/NiUm/zYmJzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JiYENiYn4TYl
Jv82JSb/NSUm/zYlJv82JiedAAAAADUlJgA2JideAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANSUmlzYl
Jv82JSb/NSUm/zYlJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAADYmJ701JSf/NiYn/zUlJ/81JSf/NiYn2TcnJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAANiYniTYlJ/82JSb/NSYm/zYlJ/82JifhNiYoAAAAAAA3JycCAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAANSYmlzYlJ/82JSb/NSYm/zYlJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JicaNiUnIDYmJyA2JicgNiUnIDYmJxAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANiYnCDYmJ/c1Jif/NiYn/zYmJ/81Jif/NiYnkwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANiYnOjYmJ/82Jif/NSYn/zYm
J/82Jif/NiYnHgAAAAA4KCgANiYnIDYmJyA2JicgNiYnIDYmJyA2JicgNSYmpTYmJ/82Jif/NSYn/zYm
J+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiUm/zYl
Jv81JSb/NiUm/zYmJ4MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANiYnOjUl
Jv81JSb/NiUm/zUlJv81JSb/NiYnWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAANiYnBDYmJ/E2JSb/NSUm/zYlJv82JSb/NiYnUgAAAAA4KCgENiYn+TYlJv82JSb/NSUm/zYl
Jv82JSb/NSUm/zYlJv82JSb/NSUm/zYlJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAA2JifVNiYn/zUmJv81Jib/NiYn/zYmJ4MAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAANiYnbDUlJv81JSf/NiYn/zUlJ/81JSf/NiYnKAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJ7s2JSb/NSYm/zYlJ/82JSb/NiYnfAAA
AAA4KCgENiYn+TYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ+cAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiYn/zYmJ/81Jif/NiYn/zYm
J4MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANiYnlzUmJ/81Jif/NiYn/zYm
J/82Jif7NiYnCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYm
J402Jif/NSYn/zYmJ/82Jif/NiYnoQAAAAA3JycENiYn+TYmJ/82Jif/NSYn/zYmJ/82Jif/NSYn/zYm
J/82Jif/NSYn/zYmJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA2JifVNiUm/zYlJv81JSb/NiUm/zYmJ4MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAANiYnuTUlJv81JSb/NiUm/zUlJv82JifrNiYmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJ2Y2JSb/NSUm/zYlJv82JSb/NiYnuwAAAAA4KCgENiYn+TYl
Jv82JSb/NSUm/zYlJv82JSb/NSUm/zYlJv82JSb/NSUm/zYlJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JidoNSUnfDUlJ3w1JSd8NSUnfDYmJ0g2JiaDNiYngzYm
J4M2JiaDNiYngzYmJ4M2JiaDNiYnZAAAAAAAAAAANiYn0zUlJv81JSf/NiYn/zUlJ/82JifbAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJ0o2JSb/NSYm/zYl
J/82JSb/NiYn0QAAAAA1JSUANiYmEjUlJxI1JScSNiYmEjUlJxI1JicaNSYn+zYlJ/82JSb/NSYm/zYl
J+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAADcnJxI1Jif/NiYn/zUmJ/81Jif/NiYn/zUmJ/81Jif/NiYnxwAAAAAAAAAANiYn5TUm
J/81Jif/NiYn/zYmJ/82JifTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAADYmJzo2Jif/NSYn/zYmJ/82Jif/NiYn4QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA2JScINSYn+zYmJ/82Jif/NSYn/zYmJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADcnJxI1JSb/NiUm/zUlJv81JSb/NiUm/zUl
Jv81JSb/NiUnxwAAAAAAAAAANiUn6zUlJv81JSb/NiUm/zUlJv82JifTAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJzY2JSb/NSUm/zYlJv82JSb/NiYn6QAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JigINSUn+zYlJv82JSb/NSUm/zYlJ+cAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADcn
JxI1Jib/NiYn/zUmJv81Jib/NiYn/zUmJv81Jib/NiUnxwAAAAAAAAAANiYn2zUmJv81JSf/NiYn/zUm
J/82JifpOCgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYm
J0Q2JSb/NSYm/zYlJ/82JSb/NiYn6QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1JScINSYn+zYl
J/82JSb/NSYm/zYlJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAADcnJxI2Jib/NiYn/zYmJv82Jib/NiYn/zYmJv82Jib/NiYnxwAA
AAAAAAAANiYnvTYmJv82Jif/NiYn/zYmJ/82Jif9NiYnDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJ1w2Jib/NiYn/zYmJv82Jib/NiYn2wAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAA2JigINiYn+zYmJv82Jib/NiYn/zYmJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADcnJxI1JSb/NSUn/zUl
Jv81JSb/NiYn7zUlJuE1JSbhNSUnsQAAAAAAAAAANiYnlzUlJv81JSf/NiUm/zUlJ/81JSf/NiYnMAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJ3w1JSb/NSUn/zUl
Jv81JSb/NiYnwwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1JScINSUn+zUlJv81JSb/NSUn/zUl
J+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAADcnJxI1Jib/NiYn/zUmJv81Jib/NiYnbgAAAAAAAAAAAAAAAAAAAAAAAAAANiYnZjUm
Jv81JSf/NiYn/zUmJ/81JSf/NiYnXgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJyA2Jif3NiYn/zYm
Jv82Jib/NiYn/zYmJ7cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAANiYnszUlJ/81JSf/NiUm/zUlJ/81JSf/NiYnegAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAANSUmADYmJ7E1JSb/NSUn/zUlJv81JSb/NiYn/zYmJ0YAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANiYnMjYmJ/01JSf/NiYn/zUm
J/81JSf/NiYn9zYmJzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANiYnYjYlJ/82JSb/NSYm/zYlJ/82JSb/NiYnxTUl
JwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JicQNSYnFDUl
JxQ1JScUNSYnFDUlJxQ1JicUNiYnFDUmJxQ1JicUNiYnFDUmJxQ1JicUNiYnFDUmJxQ1JicUNiYnFDYm
JxAAAAAAAAAAADYmJ502Jif/NiYn/zYmJ/82Jif/NiYn/zYmJ9s2JicSAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2Jic2NiYn9TYm
Jv82Jib/NiYn/zYmJv82Jif9NiYnPDUlJwo1JicUNSUnFDUmJxQ1JicUNSUnFDUmJxQ1JicUNSUnFDUm
JxQ1JicUNSUnFDUmJxQ1JicUNSUnFDUmJxIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAA2JifVNSUn/zUlJv81JSb/NSUn/zUlJv81JSb/NSUn/zUlJv81JSb/NSUn/zUl
Jv81JSb/NSUn/zUlJv81JSb/NSUn/zYmJ/k2JicyAAAAADYmJxQ2JifpNiUm/zUlJ/81JSf/NiUm/zUl
J/82JifDNiYnDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAADUmJyw1JifrNSUn/zUlJv81JSb/NSUn/zUlJv82JiedNiYnDDYmJ9k1JSb/NSUn/zUl
Jv81JSb/NSUn/zUlJv81JSb/NSUn/zUlJv81JSb/NSUn/zUlJv81JSb/NSUn/zUlJ+cAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiYn/zYmJ/81JSb/NiYn/zYm
J/81Jib/NiYn/zUmJv81Jib/NiYn/zUmJv81Jib/NiYn/zUmJv81Jib/NiYn/zUmJv82JifXNiYnDAAA
AAA2JidONiYn/TUmJ/81JSf/NiYn/zUmJ/81JSf/NiYnwzYmJxIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANiYnPDYmJ+s2JSb/NSYm/zYlJ/82JSb/NSYm/zYm
J902JicONiYnoTYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYl
J/82JSb/NSYm/zYlJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA2JifVNiYn/zYmJv82Jib/NiYn/zYmJv82Jib/NiYn/zYmJv82Jib/NiYn/zYmJv82Jib/NiYn/zYm
Jv82Jib/NiYn/zYmJv82Jif/NiYnnTgoKAAAAAAANiYnizYmJ/82Jif/NiYn/zYmJ/82Jif/NiYn/zYm
J9c2JicsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmKAI2JiduNiYn+TYm
Jv82Jib/NiYn/zYmJv82Jib/NiYn9TYmJzQ2JidaNiYn/zYmJv82Jib/NiYn/zYmJv82Jib/NiYn/zYm
Jv82Jib/NiYn/zYmJv82Jib/NiYn/zYmJv82Jib/NiYn/zYmJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNSUn/zUlJv81JSb/NSUn/zUlJv81JSb/NSUn/zUl
Jv81JSb/NSUn/zUlJv81JSb/NSUn/zUlJv81JSb/NSUn/zUlJv81JSf/NiYn/zYmJ1gAAAAANiYmBDYm
J681JSf/NiUm/zUlJ/81JSf/NiUm/zUlJ/82Jif1NiYncjYmJwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAANiYnKjYmJ781JSb/NSUn/zUlJv81JSb/NSUn/zUlJv81JSf7NiYnUjYmJyA2JifxNSUn/zUl
Jv81JSb/NSUn/zUlJv81JSb/NSUn/zUlJv81JSb/NSUn/zUlJv81JSb/NSUn/zUlJv81JSb/NSUn/zUl
J+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiYn/zYm
J/81JSb/NiYn/zYmJ/81Jib/NiYn/zUmJv81Jib/NiYn/zUmJv81Jib/NiYn/zUmJv81Jib/NiYn/zUm
Jv81JSf/NiYn/zYmJ+82JicgAAAAADYmJwg2Jie7NiYn/zUmJ/81JSf/NiYn/zUmJ/81JSf/NiYn/zYm
J9U2JidSNiYnAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJyg2JiefNiYn+zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYm
J/s2JidcNiYnBDYmJ8c2JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYl
J/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAA2JifVNiYn/zYmJv82Jib/NiYn/zYmJ2Q2JidENiYnRDYmJ0Q2JidENiYnRDYm
J0Q2JidENiYnRDYmJ0Q2JidENiYnRDYmJ0Q2JidENiYnRDYmJ0Q2JiYkAAAAAAAAAAA2JicINiYnqzYm
J/82Jif/NiYn/zYmJ/82Jif/NiYn/zYmJ/82Jif/NiYn2TYmJ3Q2JiccOCgoAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJxQ2JidiNiYnvTYmJ/02Jib/NiYn/zYm
Jv82Jib/NiYn/zYmJv82Jib/NiYn8TYmJ0wAAAAANiYnNDYlJpE2JSaRNSUmkTYlJpE2JSaRNSUmkTYl
JpE2JSaRNSUmkTYlJpE2JSaRNSUmkTYlJpE2JifLNiYn/zYmJv82Jib/NiYn/zYmJ+cAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNSUn/zUlJv81JSb/NSUn/zYm
Jy4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAOCgoAAAAAAAAAAAANSUnAjYmJ342Jif9NiUm/zUlJ/81JSf/NiUm/zUlJ/81JSf/NiUm/zUl
J/82Jif9NiYnyzYmJ4s2JidUNiYnKjYmJwoAAAAAAAAAADcnJwI2JicWNiYnNjYmJ142JieRNiYnyzYm
Jvs1JSb/NSUn/zUlJv81JSb/NSUn/zUlJv81JSb/NSUn/zUlJv82JifTNiYnKgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JieHNSUn/zUl
Jv81JSb/NSUn/zUlJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA2JifVNiYn/zYmJ/81JSb/NiYn/zYmJy4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANiYnkzYmJ3o2JicOAAAAAAAAAAA2Jic+NiYn2zUm
J/81JSf/NiYn/zUmJ/81JSf/NiYn/zUmJ/81JSf/NiYn/zUmJ/81JSf/NiYn/zUmJ/82Jif3NiYn9TYm
J/02JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NiYn9zYm
J4U2JicIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAA2JieHNSYm/zYlJ/82JSb/NSYm/zYlJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiYn/zYmJv82Jib/NiYn/zYmJy4AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANiYnozYm
J/82JifrNiUndjYmJwwAAAAANiYnCDYmJ3o2JifvNiYn/zYmJ/82Jif/NiYn/zYmJ/82Jif/NiYn/zYm
J/82Jif/NiYn/zYmJ/82Jib/NiYn/zYmJv82Jib/NiYn/zYmJv82Jib/NiYn/zYmJv82Jib/NiYn/zYm
Jv82Jib/NiYn/zYmJ/s2JielNiYnJAAAAAA2JicONiYnJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JSaHNiYn/zYmJv82Jib/NiYn/zYm
J+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNSUn/zUl
Jv81JSb/NSUn/zYmJy4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAANSYnozUlJ/81JSf/NiUm/zYmJ+k2JidyNiYnCgAAAAA2JicSNiYnejYm
J+M1JSf/NiUm/zUlJ/81JSf/NiUm/zUlJ/81JSf/NiUm/zUlJ/81JSb/NSUn/zUlJv81JSb/NSUn/zUl
Jv81JSb/NSUn/zUlJv81JSb/NSUn/zUlJv82JifpNiYnjTYmJyQAAAAANicnADYmJ1Q2JibjNSYnaAAA
AAAAAAAAAAAAADYmJww2Jic8NSUnPDYmJzw2Jic8NSUnPDYmJzw2Jic8NSUnPDYmJyIAAAAAAAAAAAAA
AAA2JieHNSUn/zUlJv81JSb/NSUn/zUlJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAA2JifVNiYn/zUmJv81Jib/NiYn/zYmJy4AAAAAAAAAAAAAAAA2JicgNiUnzzUm
Js82JibPNiUnzzUmJs82JibPNiUnzzUmJs82JidmAAAAAAAAAAAAAAAANiUnozUmJ/81JSf/NiYm/zUm
J/81JSf/NiYnswAAAAAAAAAAAAAAADYmJwQ2JidGNiYnmzYmJ+M1JSf/NiYm/zUmJ/81JSf/NiYm/zUm
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
AAA2JieHNSYn/zYlJ/82JSf/NSYn/zYlJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAA2JifVNiYn/zYmJv82Jib/NiYn/zYmJy4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANiUnozYmJv82Jib/NiYm/zYm
Jv82Jib/NiUnuwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUmJ1Q2Jib/NiYm/zYm
Jv82Jib/NiYm/zYlJ9sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANiYmkTYm
Jv82Jib/NiYm/zYmJv82Jib/NSYmaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JSeHNiYm/zYmJv82Jib/NiYm/zYlJ+cAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNSUn/zUlJ/81JSf/NSUn/zYm
Jy4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAANiYnozUlJ/81JSf/NSUn/zUlJ/81JSf/NSUnuwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAADYmJ1Q1JSf/NSUn/zUlJ/81JSf/NSUn/zUmJ9sAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAANiYmkTUlJ/81JSf/NSUn/zUlJ/81JSf/NiYmaAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JieHNSUn/zUl
J/81JSf/NSUn/zUmJucAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA2JifVNiYn/zYmJv82Jib/NiYn/zYmJ1Q2JicuNiYnLjYmJy42JicuNiYnLjYmJy42JicuNiYnLjYm
Jy42JicuNiYnLjYmJy42JicuNiYnLjYmJy42JicuNiYntTUmJ/81JSf/NiYn/zUmJ/81JSf/NiUnuwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUmJ1Q1JSf/NiYn/zUmJ/82JSb/NSYn/zYm
J+E2JicuNiYnLjYmJy42JicuNiYnLjYmJwQAAAAAAAAAAAAAAAAAAAAANiYmkTYlJ/82JSb/NSYn/zYl
J/82JSb/NiYmaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAA2JieHNSYn/zYlJ/82JSb/NSYn/zYlJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiYn/zYmJ/82Jif/NiYn/zYmJ/82Jif/NiYn/zYm
J/82Jif/NiYn/zYmJ/82Jif/NiYn/zYmJ/82Jif/NiYn/zYmJ/82Jif/NiYn/zYmJ/82Jif/NiYn/zYm
J/82Jif/NiYn/zYmJ/82Jif/NiYnuwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUm
J1Q2Jif/NiYn/zYmJ/82Jif/NiYn/zYlJ/82Jif/NiYn/zYlJ/82Jif/NiYn/zYmJxYAAAAAAAAAAAAA
AAAAAAAANiYmkTYlJ/82Jif/NiYn/zYlJ/82Jif/NiYnyTYmJ6M2JiejNSYnozYmJ6M2JiejNSYnozYm
J6M2JiejNSYnozYmJ6M2JiejNSYnozYmJ6M2JiejNSYnozYmJ6M2JSfVNiYn/zYlJ/82Jif/NiYn/zYm
J+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNSUm/zUl
Jv81JSb/NSUm/zUlJv81JSb/NSUm/zUlJv81JSb/NSUm/zUlJv81JSb/NSUm/zUlJv81JSb/NSUm/zUl
Jv81JSb/NSUm/zUlJv81JSb/NSUm/zUlJv81JSb/NSUm/zUlJv81JSb/NSUnuwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAADYlJ1Q1JSb/NSUm/zUlJv81JSb/NSYm/zUlJv81JSb/NSYm/zUl
Jv81JSb/NSYm/zYmJxYAAAAAAAAAAAAAAAAAAAAANiYmkTUlJv81JSb/NSYm/zUlJv81JSb/NSYm/zUl
Jv81JSb/NSYm/zUlJv81JSb/NSYm/zUlJv81JSb/NSYm/zUlJv81JSb/NSYm/zUlJv81JSb/NSYm/zUl
Jv81JSb/NSYm/zUlJv81JSb/NSYm/zUlJucAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAA2JifVNiYn/zYmJv82Jib/NiYn/zYmJv81Jib/NiUn/zUmJv81Jib/NiUn/zUm
Jv81Jib/NiUn/zUmJv81Jib/NiUn/zUmJv81JSf/NiYn/zUmJ/81JSf/NiYn/zUmJ/81JSf/NiYn/zUm
J/81JSf/NiUnuwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUmJ1Q1JSf/NiYn/zUm
J/82JSb/NSYn/zYlJ/82JSb/NSYn/zYlJ/82JSb/NSYn/zYmJxYAAAAAAAAAAAAAAAAAAAAANiYmkTYl
J/82JSb/NSYn/zYlJ/82JSb/NSYn/zYlJ/82JSb/NSYn/zYlJ/82JSb/NSYn/zYlJ/82JSb/NSYn/zYl
J/82JSb/NSYn/zYlJ/82JSb/NSYn/zYlJ/82JSb/NSYn/zYlJ/82JSb/NSYn/zYlJ+cAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiYn/zYmJ/82Jif/NiYn/zYm
J/82Jif/NiYn/zYmJ/82Jif/NiYn/zYmJ/82Jif/NiYn/zYmJ/82Jif/NiYn/zYmJ/82Jif/NiYn/zYm
J/82Jif/NiYn/zYmJ/82Jif/NiYn/zYmJ/82Jif/NiYnuwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAADUmJ1Q2Jif/NiYn/zYmJ/82Jif/NiYn/zYlJ/82Jif/NiYn/zYlJ/82Jif/NiYn/zYm
JxYAAAAAAAAAAAAAAAAAAAAANiYmkTYlJ/82Jif/NiYn/zYlJ/82Jif/NiYn/zYlJ/82Jif/NiYn/zYl
J/82Jif/NiYn/zYlJ/82Jif/NiYn/zYlJ/82Jif/NiYn/zYlJ/82Jif/NiYn/zYlJ/82Jif/NiYn/zYl
J/82Jif/NiYn/zYmJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA2JifVNSUm/zUlJv81JSb/NSUm/zUlJv81JSb/NSUm/zUlJv81JSb/NSUm/zUlJv81JSb/NSUm/zUl
Jv81JSb/NSUm/zUlJv81JSb/NSUm/zUlJv81JSb/NSUm/zUlJv81JSb/NSUm/zUlJv81JSb/NSUnuwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYlJ1Q1JSb/NSUm/zUlJv81JSb/NSYm/zUl
Jv81JSb/NSYm/zUlJv81JSb/NSYm/zYmJxYAAAAAAAAAAAAAAAAAAAAANiYmkTUlJv81JSb/NSYm/zUl
Jv81JSb/NSYm/zUlJv81JSb/NSYm/zUlJv81JSb/NSYm/zUlJv81JSb/NSYm/zUlJv81JSb/NSYm/zUl
Jv81JSb/NSYm/zUlJv81JSb/NSYm/zUlJv81JSb/NSYm/zUlJucAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0JCgENSUpBjUlKQY1JSkGNSUpBjUlKQY0JCgGNSUpBjQl
KAY0JCgGNSUpBjQlKAY0JCgGNSUpBjQlKAY0JCgGNSUpBjQlKAY1JSkGNCUpBjUlKQY1JSkGNCUpBjUl
KQY1JSkGNCUpBjUlKQY1JSkGNSUoBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUl
KAI1JSkGNCUpBjUlKQY0JCkGNSUpBjQlKQY0JCkGNSUpBjQlKQY0JCkGNSUpBjMjJgAAAAAAAAAAAAAA
AAAAAAAANSUoBDQlKQY0JCkGNSUpBjQlKQY0JCkGNSUpBjQlKQY0JCkGNSUpBjQlKQY0JCkGNSUpBjQl
KQY0JCkGNSUpBjQlKQY0JCkGNSUpBjQlKQY0JCkGNSUpBjQlKQY0JCkGNSUpBjQlKQY0JCkGNSUpBjUl
KQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////////////
///////////////////////////////////////////////////8AAAAP/gAAAD////8AAAAP/gAAAD/
4P/8AAAAP/gAAAD/wH/8AAAAP/gAAAD/gH/8AAAAP/gAAAD/AD/8AAAAP///g//+AH/8D//4P///g//8
AH/8D//4Pwf/g//4AP/8D//4Pwf/g//wAf/8D//4Pwf/g//gA//8DwB4Pwf/h//AB//8DwB4P4////+A
D7/8DwB4P////j8AHz/8DwB4P////j4APj/8DwB4P/AB/3wAfD/8DwB4PwAAH/gA+D/8DwB4eAAAB/AB
8D/8DwB54AAAAeAD4D/8DwB7wAAAAEAHwD/8D///AAf8AAAPgD/8D//+AD//wAAfAD/8D//8Af//8AA+
AD/8D//4A////AB////8AAAwD////gD////8AAAgH////4Dx///8AABgP////8Dh///8AADAf////+Bh
///8AADA/////+Ax///8AAGB//////Ax/D////+B//////gZ+D////8D//////gZ+D////8D//////wd
+D////8H//////wP+D////4H//////wP+D////4H//////4P+D/8D/4P//////4OAD/8D/4P//////4O
AD/8D/wP//////4GAD/8D/wP//////8GAD//8BwP//////8H+D//8AwP//////8H+D//8AwP//////8H
+D//8AwP//////8H+D//8AwP//////8H+D//8AwP//////8H+D//8P4P//////4H+D//8P4H//////4O
D///8P4H//////4OD///8P4H//////4OD///8P8D//////wOD/////8D//////wf//////8D//////gf
//////+B//////gf//////+B//////A////////A//////A////////Af////+B////8AADgP////8BA
AD/8AABwH////4CAAD/8AAAwD////wGAAD/8AAA4B////AMAAD/8AAAcAf//8AYAAD/8H//+AH//wA4A
AD/8H///gAf8AB//8D/8H//3wAAAAD//8D/8H//x8AAAAP//8D/8H//wfAAAA9//8D/8HwDwHwAAHx8A
cD/8HwDwH/AD/h8AcD/8HwDwH///+B8AcD/8HwDwHz/4+B8AcD/8HwDwHw/g+B8AcD/8HwDwHw/g+B8A
cD/8HwDwHw/g+B8AcD/8HwDwH///+B8AcD/8HwDwH/gf+B8A8D/8H//wH/gf+B//8D/8H//wH/gf+B//
8D/8H//wH/gf+B//8D/8H//wH/gf+B//8D/8AAAAH/gA+AAAAD/8AAAAH/gA+AAAAD/8AAAAH/gA+AAA
AD/8AAAAH/gA+AAAAD/8AAAAH/gA+AAAAD//////////////////////////////////////////////
//////////////////////////////////////////////////8=
</value>
</data>
</root>
\ No newline at end of file
namespace CodeLibrary
{
partial class FrmCodeLearn
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmCodeLearn));
this.timer1 = new System.Windows.Forms.Timer(this.components);
this.btnStop = new System.Windows.Forms.Button();
this.btnOpen = new System.Windows.Forms.Button();
this.hWindowControl1 = new HalconDotNet.HWindowControl();
this.btnExit = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.cmbHalconCamera = new System.Windows.Forms.ComboBox();
this.cmbCodeType = new System.Windows.Forms.ComboBox();
this.label2 = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.txtParamPath = new System.Windows.Forms.TextBox();
this.lblCount = new System.Windows.Forms.Label();
this.cmbCount = new System.Windows.Forms.ComboBox();
this.richTextBox2 = new System.Windows.Forms.RichTextBox();
this.btnClearLog = new System.Windows.Forms.Button();
this.chbTest = new System.Windows.Forms.CheckBox();
this.btnSelImage = new System.Windows.Forms.Button();
this.txtPath = new System.Windows.Forms.TextBox();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.chbUseCamera = new System.Windows.Forms.CheckBox();
this.btnDelOld = new System.Windows.Forms.Button();
this.label4 = new System.Windows.Forms.Label();
this.chbHalcon = new System.Windows.Forms.CheckBox();
this.cmbCamera = new System.Windows.Forms.ComboBox();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.SuspendLayout();
//
// timer1
//
this.timer1.Interval = 1000;
this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
//
// btnStop
//
this.btnStop.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnStop.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnStop.Location = new System.Drawing.Point(739, 49);
this.btnStop.Name = "btnStop";
this.btnStop.Size = new System.Drawing.Size(144, 32);
this.btnStop.TabIndex = 3;
this.btnStop.Text = "结束学习";
this.btnStop.UseVisualStyleBackColor = true;
this.btnStop.Click += new System.EventHandler(this.btnStop_Click);
//
// btnOpen
//
this.btnOpen.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnOpen.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnOpen.Location = new System.Drawing.Point(739, 12);
this.btnOpen.Name = "btnOpen";
this.btnOpen.Size = new System.Drawing.Size(144, 32);
this.btnOpen.TabIndex = 1;
this.btnOpen.Text = "开始学习";
this.btnOpen.UseVisualStyleBackColor = true;
this.btnOpen.Click += new System.EventHandler(this.btnOpen_Click);
//
// hWindowControl1
//
this.hWindowControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.hWindowControl1.BackColor = System.Drawing.Color.Black;
this.hWindowControl1.BorderColor = System.Drawing.Color.Black;
this.hWindowControl1.ImagePart = new System.Drawing.Rectangle(0, 0, 640, 480);
this.hWindowControl1.Location = new System.Drawing.Point(6, 123);
this.hWindowControl1.Name = "hWindowControl1";
this.hWindowControl1.Size = new System.Drawing.Size(523, 600);
this.hWindowControl1.TabIndex = 5;
this.hWindowControl1.WindowSize = new System.Drawing.Size(523, 600);
//
// btnExit
//
this.btnExit.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnExit.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnExit.Location = new System.Drawing.Point(886, 49);
this.btnExit.Name = "btnExit";
this.btnExit.Size = new System.Drawing.Size(110, 32);
this.btnExit.TabIndex = 6;
this.btnExit.Text = "退出";
this.btnExit.UseVisualStyleBackColor = true;
this.btnExit.Click += new System.EventHandler(this.btnExit_Click);
//
// label1
//
this.label1.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label1.Location = new System.Drawing.Point(-16, 20);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(110, 20);
this.label1.TabIndex = 7;
this.label1.Text = "相机:";
this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// cmbHalconCamera
//
this.cmbHalconCamera.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cmbHalconCamera.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.cmbHalconCamera.FormattingEnabled = true;
this.cmbHalconCamera.Location = new System.Drawing.Point(112, 18);
this.cmbHalconCamera.Name = "cmbHalconCamera";
this.cmbHalconCamera.Size = new System.Drawing.Size(186, 25);
this.cmbHalconCamera.TabIndex = 8;
this.cmbHalconCamera.Visible = false;
//
// cmbCodeType
//
this.cmbCodeType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cmbCodeType.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.cmbCodeType.FormattingEnabled = true;
this.cmbCodeType.Location = new System.Drawing.Point(98, 55);
this.cmbCodeType.Name = "cmbCodeType";
this.cmbCodeType.Size = new System.Drawing.Size(113, 25);
this.cmbCodeType.TabIndex = 10;
this.cmbCodeType.SelectedIndexChanged += new System.EventHandler(this.cmbCodeType_SelectedIndexChanged);
//
// label2
//
this.label2.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label2.Location = new System.Drawing.Point(-16, 57);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(110, 20);
this.label2.TabIndex = 9;
this.label2.Text = "类型:";
this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// label3
//
this.label3.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label3.Location = new System.Drawing.Point(12, 101);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(189, 17);
this.label3.TabIndex = 11;
this.label3.Text = "参数路径";
this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// txtParamPath
//
this.txtParamPath.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txtParamPath.Enabled = false;
this.txtParamPath.Location = new System.Drawing.Point(207, 101);
this.txtParamPath.Name = "txtParamPath";
this.txtParamPath.Size = new System.Drawing.Size(319, 21);
this.txtParamPath.TabIndex = 12;
//
// lblCount
//
this.lblCount.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.lblCount.Location = new System.Drawing.Point(204, 56);
this.lblCount.Name = "lblCount";
this.lblCount.Size = new System.Drawing.Size(112, 20);
this.lblCount.TabIndex = 13;
this.lblCount.Text = "条码数量:";
this.lblCount.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// cmbCount
//
this.cmbCount.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cmbCount.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.cmbCount.FormattingEnabled = true;
this.cmbCount.Items.AddRange(new object[] {
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"11",
"12",
"13",
"14",
"15",
"16",
"17",
"18",
"19",
"20"});
this.cmbCount.Location = new System.Drawing.Point(322, 54);
this.cmbCount.Name = "cmbCount";
this.cmbCount.Size = new System.Drawing.Size(48, 25);
this.cmbCount.TabIndex = 14;
//
// richTextBox2
//
this.richTextBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.richTextBox2.Location = new System.Drawing.Point(535, 438);
this.richTextBox2.Name = "richTextBox2";
this.richTextBox2.Size = new System.Drawing.Size(465, 284);
this.richTextBox2.TabIndex = 15;
this.richTextBox2.Text = "";
//
// btnClearLog
//
this.btnClearLog.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnClearLog.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnClearLog.Location = new System.Drawing.Point(886, 12);
this.btnClearLog.Name = "btnClearLog";
this.btnClearLog.Size = new System.Drawing.Size(110, 32);
this.btnClearLog.TabIndex = 16;
this.btnClearLog.Text = "清理日志";
this.btnClearLog.UseVisualStyleBackColor = true;
this.btnClearLog.Click += new System.EventHandler(this.btnClearLog_Click);
//
// chbTest
//
this.chbTest.AutoSize = true;
this.chbTest.Checked = true;
this.chbTest.CheckState = System.Windows.Forms.CheckState.Checked;
this.chbTest.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.chbTest.Location = new System.Drawing.Point(376, 56);
this.chbTest.Name = "chbTest";
this.chbTest.Size = new System.Drawing.Size(147, 21);
this.chbTest.TabIndex = 17;
this.chbTest.Text = "学习结束自动识别测试";
this.chbTest.UseVisualStyleBackColor = true;
this.chbTest.CheckedChanged += new System.EventHandler(this.chbTest_CheckedChanged);
//
// btnSelImage
//
this.btnSelImage.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnSelImage.Location = new System.Drawing.Point(529, 12);
this.btnSelImage.Name = "btnSelImage";
this.btnSelImage.Size = new System.Drawing.Size(160, 32);
this.btnSelImage.TabIndex = 19;
this.btnSelImage.Text = "打开本地图片";
this.btnSelImage.UseVisualStyleBackColor = true;
this.btnSelImage.Click += new System.EventHandler(this.btnSelImage_Click);
//
// txtPath
//
this.txtPath.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.txtPath.Enabled = false;
this.txtPath.Location = new System.Drawing.Point(659, 101);
this.txtPath.Name = "txtPath";
this.txtPath.Size = new System.Drawing.Size(338, 21);
this.txtPath.TabIndex = 18;
//
// pictureBox1
//
this.pictureBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Right)));
this.pictureBox1.BackColor = System.Drawing.Color.White;
this.pictureBox1.Location = new System.Drawing.Point(535, 123);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(465, 309);
this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.pictureBox1.TabIndex = 20;
this.pictureBox1.TabStop = false;
//
// chbUseCamera
//
this.chbUseCamera.AutoSize = true;
this.chbUseCamera.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.chbUseCamera.Location = new System.Drawing.Point(376, 19);
this.chbUseCamera.Name = "chbUseCamera";
this.chbUseCamera.Size = new System.Drawing.Size(123, 21);
this.chbUseCamera.TabIndex = 21;
this.chbUseCamera.Text = "相机获取实时图片";
this.chbUseCamera.UseVisualStyleBackColor = true;
this.chbUseCamera.CheckedChanged += new System.EventHandler(this.chbUseCamera_CheckedChanged);
//
// btnDelOld
//
this.btnDelOld.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnDelOld.Location = new System.Drawing.Point(529, 49);
this.btnDelOld.Name = "btnDelOld";
this.btnDelOld.Size = new System.Drawing.Size(160, 32);
this.btnDelOld.TabIndex = 22;
this.btnDelOld.Text = "删除旧参数";
this.btnDelOld.UseVisualStyleBackColor = true;
this.btnDelOld.Click += new System.EventHandler(this.btnDelOld_Click);
//
// label4
//
this.label4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.label4.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label4.Location = new System.Drawing.Point(535, 103);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(122, 17);
this.label4.TabIndex = 23;
this.label4.Text = "图片路径";
this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// chbHalcon
//
this.chbHalcon.AutoSize = true;
this.chbHalcon.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.chbHalcon.Location = new System.Drawing.Point(304, 20);
this.chbHalcon.Name = "chbHalcon";
this.chbHalcon.Size = new System.Drawing.Size(115, 21);
this.chbHalcon.TabIndex = 24;
this.chbHalcon.Text = "Halcon获取图片";
this.chbHalcon.UseVisualStyleBackColor = true;
this.chbHalcon.Visible = false;
this.chbHalcon.CheckedChanged += new System.EventHandler(this.chbHalcon_CheckedChanged);
//
// cmbCamera
//
this.cmbCamera.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cmbCamera.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.cmbCamera.FormattingEnabled = true;
this.cmbCamera.Location = new System.Drawing.Point(98, 18);
this.cmbCamera.Name = "cmbCamera";
this.cmbCamera.Size = new System.Drawing.Size(272, 25);
this.cmbCamera.TabIndex = 25;
//
// FrmCodeLearn
//
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
this.ClientSize = new System.Drawing.Size(1008, 729);
this.Controls.Add(this.chbUseCamera);
this.Controls.Add(this.cmbCodeType);
this.Controls.Add(this.cmbCamera);
this.Controls.Add(this.chbHalcon);
this.Controls.Add(this.label4);
this.Controls.Add(this.btnDelOld);
this.Controls.Add(this.pictureBox1);
this.Controls.Add(this.btnSelImage);
this.Controls.Add(this.txtPath);
this.Controls.Add(this.chbTest);
this.Controls.Add(this.btnClearLog);
this.Controls.Add(this.richTextBox2);
this.Controls.Add(this.cmbCount);
this.Controls.Add(this.lblCount);
this.Controls.Add(this.txtParamPath);
this.Controls.Add(this.label3);
this.Controls.Add(this.label2);
this.Controls.Add(this.cmbHalconCamera);
this.Controls.Add(this.label1);
this.Controls.Add(this.btnExit);
this.Controls.Add(this.hWindowControl1);
this.Controls.Add(this.btnStop);
this.Controls.Add(this.btnOpen);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "FrmCodeLearn";
this.Text = "条码参数学习";
this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.FrmCamera_FormClosed);
this.Load += new System.EventHandler(this.FrmCamera_Load);
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Button btnOpen;
private System.Windows.Forms.Button btnStop;
private System.Windows.Forms.Timer timer1;
private HalconDotNet.HWindowControl hWindowControl1;
private System.Windows.Forms.Button btnExit;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.ComboBox cmbHalconCamera;
private System.Windows.Forms.ComboBox cmbCodeType;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.TextBox txtParamPath;
private System.Windows.Forms.Label lblCount;
private System.Windows.Forms.ComboBox cmbCount;
private System.Windows.Forms.RichTextBox richTextBox2;
private System.Windows.Forms.Button btnClearLog;
private System.Windows.Forms.CheckBox chbTest;
private System.Windows.Forms.Button btnSelImage;
private System.Windows.Forms.TextBox txtPath;
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.CheckBox chbUseCamera;
private System.Windows.Forms.Button btnDelOld;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.CheckBox chbHalcon;
private System.Windows.Forms.ComboBox cmbCamera;
}
}
\ No newline at end of file
using HalconDotNet;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using CodeLibrary;
namespace CodeLibrary
{
public partial class FrmCodeLearn : FrmBase
{
private List<string> baslerNameList = new List<string>();
private List<string> hikNameList = new List<string>();
public FrmCodeLearn()
{
InitializeComponent();
}
private string selCamera =CodeResourceControl.GetString("selCamera", "请先选择相机");
private string selImage = CodeResourceControl.GetString("selImage", "请先选择图片");
private string title = CodeResourceControl.GetString("title", "提示");
private string imageIsNull = CodeResourceControl.GetString("imageIsNull", "获取二维码图片为空");
private string sureDelete = CodeResourceControl.GetString("sureDelete", "确定删除文件:");
private HObject GetCameraImg()
{
HObject ho_image = null;
//Bitmap bitmap = null;
int index = cmbCamera.SelectedIndex;
string camerName = cmbCamera.Text;
if (index < 0)
{
MessageBox.Show(selCamera);
return null;
}
ho_image = Camera._cam.CaptureOnImage(camerName,out List<CodeInfo> cc);
return ho_image;
}
private void btnOpen_Click(object sender, EventArgs e)
{
string filePath = txtParamPath.Text;
string cameraName = "";
string codeType = this.cmbCodeType.Text;
int count = cmbCount.SelectedIndex + 1;
if (chbUseCamera.Checked)
{
if (chbHalcon.Checked)
{
cameraName = cmbHalconCamera.Text;
if (cameraName.Equals(""))
{
MessageBox.Show(selCamera,title, MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
else
{
// Bitmap bitmap = GetCameraBitmap();
HObject ho_Image = GetCameraImg();
if (ho_Image != null)
{
HDLogUtil.info("从相机【" + cmbCamera.Text + "】获取到一张图片");
ClearPicImg();
//pictureBox1.Image = (Image)bitmap.Clone();
//HObject hoImage = HDCodeHelper.Bitmap2HObjectBpp24(bitmap);
HDCodeLearnHelper.DefaultImage = ho_Image;
ShowImage(ho_Image);
}
else
{
return;
}
}
}
else
{
if (pictureBox1.Image == null)
{
MessageBox.Show(selImage,title ,MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
Bitmap bitmap = new Bitmap( pictureBox1.Image);
HObject Image;
HDCodeHelper.Bitmap2HObjectBpp24(bitmap,out Image);
HDCodeLearnHelper.DefaultImage = Image;
ShowImage(Image);
}
Task.Factory.StartNew(delegate ()
{
HDCodeLearnHelper.StartLearn(this.hWindowControl1.HalconWindow, cameraName, codeType, filePath, count,5000);
});
FormStatus(true);
}
private void LoadCamera()
{
cmbCamera.Items.Clear();
if (Camera._cam == null || Camera._cam.Name==null)
return;
foreach (string str in Camera._cam.Name)
{
cmbCamera.Items.Add(str);
}
if (cmbCamera.Items.Count > 0)
{
cmbCamera.SelectedIndex = 0;
}
}
private void FormStatus(bool open)
{
btnOpen.Enabled = !open;
btnStop.Enabled = open;
}
private void btnStop_Click(object sender, EventArgs e)
{
HDCodeLearnHelper.StopLearn();
FormStatus(false);
}
private void ClearPicImg()
{
try
{
if (pictureBox1.Image != null)
{
pictureBox1.Image.Dispose();
pictureBox1.Image = null;
}
}
catch (Exception ex)
{
HDLogUtil.error("ClearPicImg error : " + ex.ToString());
}
}
private void FrmCamera_Load(object sender, EventArgs e)
{
cmbCount.SelectedIndex = 0;
chbTest.Checked = HDCodeLearnHelper.IsNeedTest;
CheckForIllegalCrossThreadCalls = false;
HDLogUtil.logBox = this.richTextBox2;
if (HDCodeLearnHelper.codeTypeList.Count <= 0)
{
HDCodeLearnHelper.LoadConfig("", "");
}
LoadCamera();
FormStatus(false);
cmbHalconCamera.DataSource = HDCodeLearnHelper.cameraNameList;
if (HDCodeLearnHelper.cameraNameList.Count > 0)
{
cmbHalconCamera.SelectedIndex = 0;
}
cmbCodeType.DataSource = HDCodeLearnHelper.codeTypeList;
if (HDCodeLearnHelper.codeTypeList.Count > 0)
{
cmbCodeType.SelectedIndex = 0;
}
string filePath =HDCodeHelper.GetCodeParamFilePath(cmbCodeType.Text);
txtParamPath.Text = filePath;
cmbCount.Items.Clear();
for(int i = 1; i <= 300; i++)
{
cmbCount.Items.Add(i);
}
cmbCount.SelectedIndex = 0;
chbUseCamera.Checked = true;
timer1.Start();
}
private void FrmCamera_FormClosed(object sender, FormClosedEventArgs e)
{
if (btnStop.Enabled.Equals(true))
{
btnStop_Click(null, null);
HDLogUtil.logBox = null;
FormStatus(false);
}
}
private void timer1_Tick(object sender, EventArgs e)
{
if (HDCodeLearnHelper.IsRun)
{
if (btnOpen.Enabled)
{
btnOpen.Enabled = false ;
}
}
else
{
if (btnOpen.Enabled.Equals(false))
{
btnOpen.Enabled = true;
}
}
}
private void btnExit_Click(object sender, EventArgs e)
{
this.Close();
}
private void cmbCodeType_SelectedIndexChanged(object sender, EventArgs e)
{
if (cmbCodeType.SelectedIndex >= 0)
{
txtParamPath.Text = HDCodeHelper.GetCodeParamFilePath(cmbCodeType.Text );
}
}
private void btnClearLog_Click(object sender, EventArgs e)
{
HDLogUtil.ClearLog();
}
private void chbTest_CheckedChanged(object sender, EventArgs e)
{
HDCodeLearnHelper.IsNeedTest = chbTest.Checked;
}
private void btnSelImage_Click(object sender, EventArgs e)
{
System.Windows.Forms.OpenFileDialog openDialog = new System.Windows.Forms.OpenFileDialog();
openDialog.Title = selImage;
openDialog.Filter = "(*.jpg;*.png;*.bmp)|*.jpg;*.png;*.bmp";
//openDialog.DefaultExt = "png";
System.Windows.Forms.DialogResult result = openDialog.ShowDialog();
if (result == System.Windows.Forms.DialogResult.Cancel)
{
return;
}
txtPath.Text = openDialog.FileName;
string filename = txtPath.Text;
if (string.IsNullOrEmpty(filename))
{
MessageBox.Show(imageIsNull);
}
ClearPicImg();
//读取图片内容
Image img = (Image)Image.FromFile(filename).Clone();
pictureBox1.Image = img;
}
private void chbUseCamera_CheckedChanged(object sender, EventArgs e)
{
if (chbUseCamera.Checked)
{
cmbHalconCamera.Enabled = true ;
btnSelImage.Enabled = false;
}
else
{
cmbHalconCamera.Enabled = false ;
btnSelImage.Enabled = true ;
}
}
private void btnDelOld_Click(object sender, EventArgs e)
{
string path = txtParamPath.Text;
if (path.Equals(""))
{
return;
}
FileInfo file = new FileInfo(path);
DialogResult result = MessageBox.Show(sureDelete +file.Name+ "", title, MessageBoxButtons.YesNo);
if (result.Equals(DialogResult.Yes))
{
File.Delete(path);
}
}
private void chbHalcon_CheckedChanged(object sender, EventArgs e)
{
if (chbHalcon.Checked)
{
cmbHalconCamera.Visible = true;
cmbCamera.Visible = false;
}
else
{
cmbHalconCamera.Visible = false ;
cmbCamera.Visible = true ;
}
}
public void ShowImage(HObject ho_Image)
{
HTuple width, height;
HOperatorSet.GetImageSize(ho_Image, out width, out height);
int dWidth = (int)width.D;
int dHeight = (int)height.D;
this.hWindowControl1.HalconWindow.SetPart(0, 0, dHeight, dWidth);
HOperatorSet.DispObj(ho_Image, hWindowControl1.HalconWindow);
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="timer1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>25</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAYGAAAAEAIAColAAAFgAAACgAAABgAAAAwAAAAAEAIAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JieVNiYnsTYm
J7E2JiaxNiYnsTYmJ7E2JiaxNiYnsTYmJrE2JiaxNiYnsTYmJrE2JiaxNiYnsTYmJrE2JiaxNiYnsTYm
JrE2JiexNiYnsTYmJ7E2JiexNiYnsTYmJ7E2JiexNiYnsTYmJ7E2JiavNiYnBAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJyY2JiexNiYnsTYmJ7E2JiexNiYmsTYmJ7E2JiexNiYmsTYm
J7E2JiexNiYmsTYmJ7E2JiexNiYmsTYmJ7E2JiexNiYmsTYmJ7E2JiexNiYmsTYmJ7E2JiexNiYmsTYm
J7E2JiexNiYmsTYmJ7E2Jic2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA2JiYONiYnMjYmJxoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAA2JifVNiYn/zYmJ/81Jif/NiYn/zYmJ/81Jif/NiYn/zUmJ/81Jif/NiYn/zUm
J/81Jif/NiYn/zUmJ/81Jif/NiYn/zUmJ/81Jif/NiYn/zYmJ/81Jif/NiYn/zYmJ/81Jif/NiYn/zYm
J/82Jif7NicnBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJzY1Jif/NiYn/zYm
J/82Jif/NSYn/zYmJ/82Jif/NSYn/zYmJ/82Jif/NSYn/zYmJ/82Jif/NSYn/zYmJ/82Jif/NSYn/zYm
J/82Jif/NSYn/zYmJ/82Jif/NSYn/zYmJ/82Jif/NSYn/zYmJ/82JidOAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAANSYnBjYmJ402Jif3NSYn/zUlJ/02Jie3NiYmIAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiUm/zYlJv81JSb/NiUm/zYl
Jv81JSb/NiUm/zUlJv81JSb/NiUm/zUlJv81JSb/NiUm/zUlJv81JSb/NiUm/zUlJv81JSb/NiUm/zUl
Jv81JSb/NiUm/zUlJv81JSb/NiUm/zUlJv82Jib7NycnBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAADYmJzY1JSb/NiUm/zUlJv82JSb/NSUm/zYlJv82JSb/NSUm/zYlJv82JSb/NSUm/zYl
Jv82JSb/NSUm/zYlJv82JSb/NSUm/zYlJv82JSb/NSUm/zYlJv82JSb/NSUm/zYlJv82JSb/NSUm/zYl
Jv82JidOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1JicENSYnqzYlJv82JSb/NSUm/zYl
Jv82JSb/NiYn3zYmJw4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA2JifVNiYn/zUmJv81Jib/NiYn/zUmJv81JSb/NiUn/zUlJv81JSb/NiUn/zUlJv81JSb/NiUn/zUl
Jv81JSb/NiUn/zUlJv81JSf/NiYn/zUlJ/81JSf/NiYn/zUlJ/81JSf/NiYn/zUlJ/82Jib7NycnBgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJzY1JSf/NiYn/zUlJ/82JSb/NSYm/zYl
J/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYl
J/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JidOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUm
JwQ1JietNSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYmJ2wAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiYn/zYmJ/81Jif/NiYn/zYmJ/81Jif/NiYn/zUm
J/81Jif/NiYn/zUmJ/81Jif/NiYn/zUmJ/81Jif/NiYn/zUmJ/81Jif/NiYn/zYmJ/81Jif/NiYn/zYm
J/81Jif/NiYn/zYmJ/82Jif7NicnBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYm
Jy41JifZNiYn2TUmJ9k2JifZNSYm2TYmJ9k2JifZNSYm2TYmJ9k2JifZNSYm2TYmJ+s2Jif/NSYn/zYm
J/82Jif/NiYn+TYmJ/E2JifxNSYn8TYmJ/E2JifxNSYn8TYmJ/E2JifxNSYn8TYmJ/E2JidKAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAANSYnBjUmJ6s2Jif/NSYn/zYmJ/82Jif/NSYn/zYmJ/82Jif/NSYn/zYm
J5EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiUm/zYl
Jv81JSb/NiUm/zYmJ8c1JSeNNSUnjTUlJ401JSeNNSUnjTUlJ401JSeNNSUnjTUlJ401JSeNNSUnjTUl
J401JSeNNSUnjTUlJ401JSeNNiYnszUlJv81JSb/NiUm/zUlJv82Jib7NycnBgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAADYmJnY2JSb/NSUm/zYlJv82JSb/NiYnhQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1JicENSYnqzYlJv82JSb/NSUm/zYl
Jv82JSb/NSUm/zYlJv82JSb/NSUm/zYmJ24AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAA2JifVNiYn/zUmJv81Jib/NiYn/zYmJ4MAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANiYnVjUlJ/81JSf/NiYn/zUl
J/82Jib7NycnBgAAAAAAAAAAAAAAAAAAAAAAAAAANSUnIDYmJyg1JicoNiYnKDYmJyAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJ242JSb/NSYm/zYlJ/82JSb/NiYnhQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYm
JwQ1JierNSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NiYn8TYmJxQAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiYn/zYmJ/81Jif/NiYn/zYm
J4MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAANiYnVjYmJ/81Jif/NiYn/zYmJ/82Jif7NicnBgAAAAAAAAAAAAAAAAAAAAAAAAAANiYn0zYm
J/81Jif/NiYn/zYmJ8kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYm
J2Q2Jif/NSYn/zYmJ/82Jif/NiYnhQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAANiYnBDYmJ6c2Jif/NSYn/zYmJ/82Jif/NSYn/zYmJ/82Jif/NSYn/zYm
J/82Jif9NiYnXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA2JifVNiUm/zYlJv81JSb/NiUm/zYmJ4MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANiYnVjUlJv81JSb/NiUm/zUlJv82Jib7NycnBgAA
AAAAAAAAAAAAAAAAAAAAAAAANiUn0zUlJv81JSb/NiUm/zYmJskAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJ1w2JSb/NSUm/zYlJv82JSb/NiYnhQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JicENiYmpzYlJv82JSb/NSUm/zYl
Jv82JSb/NSUm/zYlJv82JSb/NSUm/zYmJ/02JidgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiYn/zUmJv81Jib/NiYn/zYmJ4MAAAAAAAAAAAAA
AAA2JicKNiYmOjYmJzo2Jic6NiYmOjYmJzo2Jic6NiYmOjYmJzo2Jic4NiYnAgAAAAAAAAAANiYnVjUl
J/81JSf/NiYn/zUlJ/82Jib7NycnBgAAAAAAAAAAAAAAAAAAAAAAAAAANiYn0zUlJ/81JSf/NiYn/zYm
JskAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJ1Q2JSb/NSYm/zYl
J/82JSb/NiYnhQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYm
JwQ2JienNSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NiYn+zYmJ1oAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiYn/zYm
J/81Jif/NiYn/zYmJ4MAAAAAAAAAAAAAAAA2JicoNiYn/zUmJ/81Jif/NiYn/zUmJ/81Jif/NiYn/zUm
J/82Jif7NicnBgAAAAAAAAAANiYnVjYmJ/81Jif/NiYn/zYmJ/82Jif7NicnBgAAAAAAAAAAAAAAAAAA
AAAAAAAANiYn0zYmJ/81Jif/NiYn/zYmJ8kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAADYmJzw1JSfNNSUnzTUlJ801JSfNNiYnagAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAANiYnBDYmJ6c2Jif/NSYn/zYmJ/82Jif/NSYn/zYmJ/82Jif/NSYn/zYm
J/82Jif5NiYnVAAAAAAAAAAAAAAAADYmJwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAA2JifVNiUm/zYlJv81JSb/NiUm/zYmJ4MAAAAAAAAAAAAAAAA2JicoNiUm/zUl
Jv81JSb/NiUm/zUlJv81JSb/NiUm/zUlJv82Jib7NycnBgAAAAAAAAAANiYnVjUlJv81JSb/NiUm/zUl
Jv82Jib7NycnBgAAAAAAAAAAAAAAAAAAAAAAAAAANSUndDUlJ401JSeNNSUnjTYmJ3AAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JicENiYmpzYlJv82JSb/NSUm/zYl
Jv82JSb/NSUm/zYlJv82JSb/NSUm/zYmJ/k2JidOAAAAAAAAAAAAAAAANiYnCjYmJ6UAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiYn/zUmJv81Jib/NiYn/zYm
J4MAAAAAAAAAAAAAAAA2JScoNiUn/zUlJv81JSb/NiUn/zUlJv81JSb/NiUn/zUlJv82Jib7NycnBgAA
AAAAAAAANiYnVjUlJ/81JSf/NiYn/zUlJ/82Jib7NycnBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJ3g2JSe3NSYmtzYmJ7c2JidSAAAAAAAAAAAAAAAAAAAAADYm
JwI2JielNSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NiYn9zYmJ0oAAAAAAAAAAAAA
AAA2JicKNiYnvTYlJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA2JifVNiYn/zYmJ/81Jif/NiYn/zYmJ4MAAAAAAAAAAAAAAAA2JicoNiYn/zUmJ/81Jif/NiYn/zUm
J/81Jif/NiYn/zUmJ/82Jif7NicnBgAAAAAAAAAANiYnVjYmJ/81Jif/NiYn/zYmJ/82Jif7NicnBgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJwI2JicINiYnDDYm
JwY3JycAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJxg2JiflNSYn/zYm
J+M2JicMAAAAAAAAAAAAAAAANiYnBDUlJ6E2Jif/NSYn/zYmJ/82Jif/NSYn/zYmJ/82Jif/NSYn/zYm
J/82Jif1NiYnRAAAAAAAAAAAAAAAADYmJwo2Jie9NSYn/zYmJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiUm/zYlJv81JSb/NiUm/zYmJ4MAAAAAAAAAAAAA
AAA2JicoNiUm/zUlJv81JSb/NiUm/zUlJv81JSb/NiUm/zUlJv82Jib7NycnBgAAAAAAAAAANiYnVjUl
Jv81JSb/NiUm/zUlJv82Jib7NycnBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmKAI2JicsNiYnYjYm
J5M2Jie5NiYn2TYmJ+82Jif9NSUm/zYmJ/k2JifrNiYnzzYmJ6s2JieBNiYnTDYmJxQAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAA2Jic6NiYn+TYmJ1gAAAAAAAAAAAAAAAA2JicCNSUnoTYlJv82JSb/NSUm/zYl
Jv82JSb/NSUm/zYlJv82JSb/NSUm/zYmJ/M2JidAAAAAAAAAAAAAAAAANiYnCjYmJ702JSb/NSUm/zYl
J+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiYn/zUm
Jv81Jib/NiYn/zYmJ4MAAAAAAAAAAAAAAAA2JScoNiUn/zUlJv81JSb/NiUn/zUlJv81JSb/NiUn/zUl
Jv82Jib7NycnBgAAAAAAAAAANiYnVjUlJ/81JSf/NiYn/zUlJ/82JienNiYnAgAAAAAAAAAAAAAAADYm
Jwg2JidSNiYnpTYmJ+s1JSf/NiYn/zUlJ/81JSf/NiYn/zUlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYl
J/82JSb/NSYm/zYmJ/02JifPNiYngzYmJy41JSUAAAAAAAAAAAAAAAAANiYnRDUlJwAAAAAAAAAAADYm
JwI2JSejNSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NiYn7zYmJzoAAAAAAAAAAAAA
AAA2JicKNiYnvTYlJ/82JSb/NSYm/zYlJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAA2JifVNiYn/zYmJ/81Jif/NiYn/zYmJ4MAAAAAAAAAAAAAAAA2JicoNiYn/zUm
J/81Jif/NiYn/zUmJ/81Jif/NiYn/zUmJ/82Jif7NicnBgAAAAAAAAAANiYnVjYmJ/81Jif/NiYn/zYm
J5E2JicCAAAAAAAAAAA2JiceNiYnjTYmJ+01Jif/NiYn/zYmJ/81Jif/NiYn/zYmJ/81Jif/NiYn/zYm
J/82Jif/NSYn/zYmJ/82Jif/NSYn/zYmJ/82Jif/NSYn/zYmJ/82Jif/NSYn/zYmJ/82JifPNiYnZjYm
JwoAAAAAAAAAAAAAAAAAAAAANiYnBDUlJ6E2Jif/NSYn/zYmJ/82Jif/NSYn/zYmJ/82Jif/NSYn/zYm
J/82JiftNiYnNgAAAAAAAAAAAAAAADYmJwo2Jie9NSYn/zYmJ/82Jif/NSYn/zYmJ+cAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiUm/zYlJv81JSb/NiUm/zYm
J4MAAAAAAAAAAAAAAAA2JicoNiUm/zUlJv81JSb/NiUm/zUlJv81JSb/NiUm/zUlJv82Jib7NycnBgAA
AAAAAAAANiYnVjUlJv82Jif9NiYneDUmKAAAAAAANiYnFDYmJ5U2Jif5NiUm/zUlJv81JSb/NiUm/zUl
Jv81JSb/NiUm/zUlJv81JSb/NiUm/zUlJv82JSb/NSUm/zYlJv82JSb/NSUm/zYlJv82JSb/NSUm/zYl
Jv82JSb/NSUm/zYlJv82JSb/NSUm/zYmJ+k2JidyNiYnCAAAAAA2JicCNSUnoTYlJv82JSb/NSUm/zYl
Jv82JSb/NSUm/zYlJv82JSb/NSUm/zYmJ+s2JicwAAAAAAAAAAAAAAAANiYnCjYmJ702JSb/NSUm/zYl
Jv82JSb/NSUm/zYlJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA2JifVNiYn/zUmJv81Jib/NiYn/zYmJ4MAAAAAAAAAAAAAAAA2JicmNiYn9zYmJvc2Jif3NiYn9zYm
Jvc2Jif3NiYn9zYmJvc2JifzNiYnBgAAAAAAAAAANiYnVjYmJ/s2JidgAAAAADcnJwA2JideNiYn7TUl
J/81JSf/NiYn/zUlJ/81JSf/NiYn/zUlJ/81JSf/NiYn/zUlJ/81JSf/NiYn/zUlJ/82Jif7NiYn+zYl
J/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NiYn3TYm
J0o2JiedNSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NiYn6TYmJywAAAAAAAAAAAAA
AAA2JicKNiYnvTYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiYn/zYmJ/81Jif/NiYn/zYmJ4MAAAAAAAAAAAAA
AAA3JycANiYmBDYmJgQ2JiYENiYmBDYmJgQ2JiYENiYmBDYmJgQ2JicENSYoAAAAAAAAAAAANiYnSjYm
J0oAAAAANSUmDDYmJ6k2Jif/NiYn/zYmJ/81Jif/NiYn/zYmJ/81Jif/NiYn/zYmJ/81Jif/NiYn7zYm
J7E2Jid2NiYnRDYmJxw2JicGNiYmBjYmJxA2JicoNSUnRjYmJ2w2JiedNiYn1zYmJ/02Jif/NSYn/zYm
J/82Jif/NSYn/zYmJ/82Jif/NSYn/zYmJ/82Jif/NSYn/zYmJ/82Jif/NSYn/zYmJ/82Jif/NSYn/zYm
J/82JiflNiYnKgAAAAAAAAAAAAAAADYmJwo2Jie9NSYn/zYmJ/82Jif/NSYn/zYmJ/82Jif/NSYn/zYm
J+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiUm/zYl
Jv81JSb/NiUm/zYmJ4MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAANSUlAAAAAAA2JicaNiYn0TUlJv81JSb/NiUm/zUlJv81JSb/NiUm/zUl
Jv81JSb/NiYn8zYmJ582JidENiYnBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAADYmJxw2JidqNiYnxzYmJ/82JSb/NSUm/zYlJv82JSb/NSUm/zYlJv82JSb/NSUm/zYl
Jv82JSb/NSUm/zYlJv82JSb/NSUm/zYlJ+E2JiYmAAAAAAAAAAAAAAAANiYnDDYmJ8E2JSb/NSUm/zYl
Jv82JSb/NSUm/zYlJv82JSb/NSUm/zYlJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAA2JifVNiYn/zUmJv81Jib/NiYn/zYmJ4MAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJx42JiffNiYn/zUl
J/81JSf/NiYn/zUlJ/81JSf/NiYn/zYmJ+k2Jid2NiYnEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJzA2JierNiYn/TYl
J/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NiYn3zYmJyIAAAAAAAAAAAAA
AAA1JicMNSYnwTYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ+cAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiYn/zYmJ/81Jif/NiYn/zYm
J4MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAANiYnFDUmJ9k1Jif/NiYn/zYmJ/81Jif/NiYn/zYmJ/82Jif5NiYniTYmJw4AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAANiYnNjYmJ802Jif/NSYn/zYmJ/82Jif/NSYn/zYmJ/82Jif/NSYn/zYm
J/82JifbNiYnHgAAAAAAAAAAAAAAAAAAAAA1JicMNiYnIDYmJyA2JicgNiYnIDYmJyA2JicgNiYnIDYm
JyA2JicgNiYnIDYmJxwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA2JifVNiUm/zYlJv81JSb/NiUm/zYmJ9E2JiahNiYnoTYmJqE2JiahNiYnoTYmJqE2JiahNiYnoTYm
JqE2JiahNiYnoTYmJqE2JiehNiYnmTYmJwY2JiYENiYnwTUlJv81JSb/NiUm/zUlJv81JSb/NiUm/zYm
J9c2JicwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJwY2JieJNiYn/TYl
Jv82JSb/NSUm/zYlJv82JSb/NSUm/zYmJ9c2JiYaAAAAAAAAAAAAAAAAAAAAADYmJxY2JidGAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiYn/zUmJv81Jib/NiYn/zUmJv81JSb/NiUn/zUl
Jv81JSb/NiUn/zUlJv81JSb/NiUn/zUlJv81JSb/NiUn/zUlJv81JSf/NiYngQAAAAA2JieHNiYn/zUl
J/81JSf/NiYn/zUlJ/81JSf/NiYnsTYmJwwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAANiYnWDYmJ/k2JSb/NSYm/zYlJ/82JSb/NSYm/zYmJ7U1JScCAAAAAAAA
AAA2JiYONiYngTYmJ/M2JieVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiYn/zYm
J/81Jif/NiYn/zYmJ/81Jif/NiYn/zUmJ/81Jif/NiYn/zUmJ/81Jif/NiYn/zUmJ/81Jif/NiYn/zUm
J/82JifhNiYnCjYmJzg2Jif9NiYn/zYmJ/81Jif/NiYn/zYmJ/82JiehNiYnBAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJ0w2Jif5NSYn/zYm
J/82Jif/NSYn/zYmJ/82JidqAAAAADYmJzg2JifpNSYn/zYmJ/82JieVAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAA2JifVNiUm/zYlJv81JSb/NiUm/zYlJv81JSb/NiUm/zUlJv81JSb/NiUm/zUl
Jv81JSb/NiUm/zUlJv81JSb/NiUm/zUlJv82JidaNiYmBDYmJ881JSb/NiUm/zUlJv81JSb/NiUm/zYm
J7E2JicEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAA2JidiNSUn/zYlJv82JSb/NSUm/zYlJv82JifxNiYnGjYmJxA2JiftNSUm/zYl
Jv82JieVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiYn/zUmJv81Jib/NiYn/zUm
Jv81JSb/NiUn/zUlJv81JSb/NiUn/zUlJv81JSb/NiUn/zUlJv81JSb/NiUn/zYmJ8U2JigANiYnYDUl
J/81JSf/NiYn/zUlJ/81JSf/NiYn1TYmJwwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANiYnmTYlJ/82JSb/NSYm/zYl
J/82JSb/NiYnmwAAAAA2Jid0NSYm/zYlJ/82JieVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA2JierNSUnzTUlJ801JSfNNSUnzTUlJ801JSfNNSUnzTUlJ801JSfNNSUnzTUlJ801JSfNNSUnzTUl
J801JSfNNSUnzTYmJzQ2JicENiYn3TYmJ/81Jif/NiYn/zYmJ/82Jif7NiYnMgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAANiYnDDYmJ902Jif/NSYn/zYmJ/82Jif/NiYn+TYmJyA2JicKNiYn4zYmJ/82JieVAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAANiYnbDYmJ7U2Jie1NiYntTYmJ6UAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JidWNiUm/zUlJv81JSb/NiUm/zUl
Jv82JieRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJ042JSb/NSUm/zYlJv82JSb/NSUm/zYm
J40AAAAANiYnYjYlJv82JieVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANSUmlzYlJv82JSb/NSUm/zYl
J+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA2Jie/NiYn/zUlJ/81JSf/NiYn/zYmJ/M2JicUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAg
IAA2JifFNSYm/zYlJ/82JSb/NSYm/zYmJ+01JScGNiYnBDYmJ9U2JieVAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAANSYmlzYlJ/82JSb/NSYm/zYlJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJx42Jif9NiYn/zYmJ/81Jif/NiYn/zYmJ5MAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JidONSYn/zYmJ/82Jif/NSYn/zYmJ/81JidMAAAAADYm
J1I2JieVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANSYmlzYmJ/82Jif/NSYn/zYmJ+cAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJ3A1JSb/NiUm/zUl
Jv81JSb/NiUm/zYmJzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JiYENiYn4TYl
Jv82JSb/NSUm/zYlJv82JiedAAAAADUlJgA2JideAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANSUmlzYl
Jv82JSb/NSUm/zYlJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAADYmJ701JSf/NiYn/zUlJ/81JSf/NiYn2TcnJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAANiYniTYlJ/82JSb/NSYm/zYlJ/82JifhNiYoAAAAAAA3JycCAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAANSYmlzYlJ/82JSb/NSYm/zYlJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JicaNiUnIDYmJyA2JicgNiUnIDYmJxAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANiYnCDYmJ/c1Jif/NiYn/zYmJ/81Jif/NiYnkwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANiYnOjYmJ/82Jif/NSYn/zYm
J/82Jif/NiYnHgAAAAA4KCgANiYnIDYmJyA2JicgNiYnIDYmJyA2JicgNSYmpTYmJ/82Jif/NSYn/zYm
J+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiUm/zYl
Jv81JSb/NiUm/zYmJ4MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANiYnOjUl
Jv81JSb/NiUm/zUlJv81JSb/NiYnWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAANiYnBDYmJ/E2JSb/NSUm/zYlJv82JSb/NiYnUgAAAAA4KCgENiYn+TYlJv82JSb/NSUm/zYl
Jv82JSb/NSUm/zYlJv82JSb/NSUm/zYlJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAA2JifVNiYn/zUmJv81Jib/NiYn/zYmJ4MAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAANiYnbDUlJv81JSf/NiYn/zUlJ/81JSf/NiYnKAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJ7s2JSb/NSYm/zYlJ/82JSb/NiYnfAAA
AAA4KCgENiYn+TYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ+cAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiYn/zYmJ/81Jif/NiYn/zYm
J4MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANiYnlzUmJ/81Jif/NiYn/zYm
J/82Jif7NiYnCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYm
J402Jif/NSYn/zYmJ/82Jif/NiYnoQAAAAA3JycENiYn+TYmJ/82Jif/NSYn/zYmJ/82Jif/NSYn/zYm
J/82Jif/NSYn/zYmJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA2JifVNiUm/zYlJv81JSb/NiUm/zYmJ4MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAANiYnuTUlJv81JSb/NiUm/zUlJv82JifrNiYmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJ2Y2JSb/NSUm/zYlJv82JSb/NiYnuwAAAAA4KCgENiYn+TYl
Jv82JSb/NSUm/zYlJv82JSb/NSUm/zYlJv82JSb/NSUm/zYlJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JidoNSUnfDUlJ3w1JSd8NSUnfDYmJ0g2JiaDNiYngzYm
J4M2JiaDNiYngzYmJ4M2JiaDNiYnZAAAAAAAAAAANiYn0zUlJv81JSf/NiYn/zUlJ/82JifbAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJ0o2JSb/NSYm/zYl
J/82JSb/NiYn0QAAAAA1JSUANiYmEjUlJxI1JScSNiYmEjUlJxI1JicaNSYn+zYlJ/82JSb/NSYm/zYl
J+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAADcnJxI1Jif/NiYn/zUmJ/81Jif/NiYn/zUmJ/81Jif/NiYnxwAAAAAAAAAANiYn5TUm
J/81Jif/NiYn/zYmJ/82JifTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAADYmJzo2Jif/NSYn/zYmJ/82Jif/NiYn4QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA2JScINSYn+zYmJ/82Jif/NSYn/zYmJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADcnJxI1JSb/NiUm/zUlJv81JSb/NiUm/zUl
Jv81JSb/NiUnxwAAAAAAAAAANiUn6zUlJv81JSb/NiUm/zUlJv82JifTAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJzY2JSb/NSUm/zYlJv82JSb/NiYn6QAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JigINSUn+zYlJv82JSb/NSUm/zYlJ+cAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADcn
JxI1Jib/NiYn/zUmJv81Jib/NiYn/zUmJv81Jib/NiUnxwAAAAAAAAAANiYn2zUmJv81JSf/NiYn/zUm
J/82JifpOCgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYm
J0Q2JSb/NSYm/zYlJ/82JSb/NiYn6QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1JScINSYn+zYl
J/82JSb/NSYm/zYlJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAADcnJxI2Jib/NiYn/zYmJv82Jib/NiYn/zYmJv82Jib/NiYnxwAA
AAAAAAAANiYnvTYmJv82Jif/NiYn/zYmJ/82Jif9NiYnDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJ1w2Jib/NiYn/zYmJv82Jib/NiYn2wAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAA2JigINiYn+zYmJv82Jib/NiYn/zYmJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADcnJxI1JSb/NSUn/zUl
Jv81JSb/NiYn7zUlJuE1JSbhNSUnsQAAAAAAAAAANiYnlzUlJv81JSf/NiUm/zUlJ/81JSf/NiYnMAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJ3w1JSb/NSUn/zUl
Jv81JSb/NiYnwwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1JScINSUn+zUlJv81JSb/NSUn/zUl
J+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAADcnJxI1Jib/NiYn/zUmJv81Jib/NiYnbgAAAAAAAAAAAAAAAAAAAAAAAAAANiYnZjUm
Jv81JSf/NiYn/zUmJ/81JSf/NiYnXgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJyA2Jif3NiYn/zYm
Jv82Jib/NiYn/zYmJ7cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAANiYnszUlJ/81JSf/NiUm/zUlJ/81JSf/NiYnegAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAANSUmADYmJ7E1JSb/NSUn/zUlJv81JSb/NiYn/zYmJ0YAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANiYnMjYmJ/01JSf/NiYn/zUm
J/81JSf/NiYn9zYmJzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANiYnYjYlJ/82JSb/NSYm/zYlJ/82JSb/NiYnxTUl
JwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JicQNSYnFDUl
JxQ1JScUNSYnFDUlJxQ1JicUNiYnFDUmJxQ1JicUNiYnFDUmJxQ1JicUNiYnFDUmJxQ1JicUNiYnFDYm
JxAAAAAAAAAAADYmJ502Jif/NiYn/zYmJ/82Jif/NiYn/zYmJ9s2JicSAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2Jic2NiYn9TYm
Jv82Jib/NiYn/zYmJv82Jif9NiYnPDUlJwo1JicUNSUnFDUmJxQ1JicUNSUnFDUmJxQ1JicUNSUnFDUm
JxQ1JicUNSUnFDUmJxQ1JicUNSUnFDUmJxIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAA2JifVNSUn/zUlJv81JSb/NSUn/zUlJv81JSb/NSUn/zUlJv81JSb/NSUn/zUl
Jv81JSb/NSUn/zUlJv81JSb/NSUn/zYmJ/k2JicyAAAAADYmJxQ2JifpNiUm/zUlJ/81JSf/NiUm/zUl
J/82JifDNiYnDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAADUmJyw1JifrNSUn/zUlJv81JSb/NSUn/zUlJv82JiedNiYnDDYmJ9k1JSb/NSUn/zUl
Jv81JSb/NSUn/zUlJv81JSb/NSUn/zUlJv81JSb/NSUn/zUlJv81JSb/NSUn/zUlJ+cAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiYn/zYmJ/81JSb/NiYn/zYm
J/81Jib/NiYn/zUmJv81Jib/NiYn/zUmJv81Jib/NiYn/zUmJv81Jib/NiYn/zUmJv82JifXNiYnDAAA
AAA2JidONiYn/TUmJ/81JSf/NiYn/zUmJ/81JSf/NiYnwzYmJxIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANiYnPDYmJ+s2JSb/NSYm/zYlJ/82JSb/NSYm/zYm
J902JicONiYnoTYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYl
J/82JSb/NSYm/zYlJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA2JifVNiYn/zYmJv82Jib/NiYn/zYmJv82Jib/NiYn/zYmJv82Jib/NiYn/zYmJv82Jib/NiYn/zYm
Jv82Jib/NiYn/zYmJv82Jif/NiYnnTgoKAAAAAAANiYnizYmJ/82Jif/NiYn/zYmJ/82Jif/NiYn/zYm
J9c2JicsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmKAI2JiduNiYn+TYm
Jv82Jib/NiYn/zYmJv82Jib/NiYn9TYmJzQ2JidaNiYn/zYmJv82Jib/NiYn/zYmJv82Jib/NiYn/zYm
Jv82Jib/NiYn/zYmJv82Jib/NiYn/zYmJv82Jib/NiYn/zYmJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNSUn/zUlJv81JSb/NSUn/zUlJv81JSb/NSUn/zUl
Jv81JSb/NSUn/zUlJv81JSb/NSUn/zUlJv81JSb/NSUn/zUlJv81JSf/NiYn/zYmJ1gAAAAANiYmBDYm
J681JSf/NiUm/zUlJ/81JSf/NiUm/zUlJ/82Jif1NiYncjYmJwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAANiYnKjYmJ781JSb/NSUn/zUlJv81JSb/NSUn/zUlJv81JSf7NiYnUjYmJyA2JifxNSUn/zUl
Jv81JSb/NSUn/zUlJv81JSb/NSUn/zUlJv81JSb/NSUn/zUlJv81JSb/NSUn/zUlJv81JSb/NSUn/zUl
J+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiYn/zYm
J/81JSb/NiYn/zYmJ/81Jib/NiYn/zUmJv81Jib/NiYn/zUmJv81Jib/NiYn/zUmJv81Jib/NiYn/zUm
Jv81JSf/NiYn/zYmJ+82JicgAAAAADYmJwg2Jie7NiYn/zUmJ/81JSf/NiYn/zUmJ/81JSf/NiYn/zYm
J9U2JidSNiYnAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJyg2JiefNiYn+zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYm
J/s2JidcNiYnBDYmJ8c2JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYl
J/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAA2JifVNiYn/zYmJv82Jib/NiYn/zYmJ2Q2JidENiYnRDYmJ0Q2JidENiYnRDYm
J0Q2JidENiYnRDYmJ0Q2JidENiYnRDYmJ0Q2JidENiYnRDYmJ0Q2JiYkAAAAAAAAAAA2JicINiYnqzYm
J/82Jif/NiYn/zYmJ/82Jif/NiYn/zYmJ/82Jif/NiYn2TYmJ3Q2JiccOCgoAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYmJxQ2JidiNiYnvTYmJ/02Jib/NiYn/zYm
Jv82Jib/NiYn/zYmJv82Jib/NiYn8TYmJ0wAAAAANiYnNDYlJpE2JSaRNSUmkTYlJpE2JSaRNSUmkTYl
JpE2JSaRNSUmkTYlJpE2JSaRNSUmkTYlJpE2JifLNiYn/zYmJv82Jib/NiYn/zYmJ+cAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNSUn/zUlJv81JSb/NSUn/zYm
Jy4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAOCgoAAAAAAAAAAAANSUnAjYmJ342Jif9NiUm/zUlJ/81JSf/NiUm/zUlJ/81JSf/NiUm/zUl
J/82Jif9NiYnyzYmJ4s2JidUNiYnKjYmJwoAAAAAAAAAADcnJwI2JicWNiYnNjYmJ142JieRNiYnyzYm
Jvs1JSb/NSUn/zUlJv81JSb/NSUn/zUlJv81JSb/NSUn/zUlJv82JifTNiYnKgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JieHNSUn/zUl
Jv81JSb/NSUn/zUlJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA2JifVNiYn/zYmJ/81JSb/NiYn/zYmJy4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANiYnkzYmJ3o2JicOAAAAAAAAAAA2Jic+NiYn2zUm
J/81JSf/NiYn/zUmJ/81JSf/NiYn/zUmJ/81JSf/NiYn/zUmJ/81JSf/NiYn/zUmJ/82Jif3NiYn9TYm
J/02JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NSYm/zYlJ/82JSb/NiYn9zYm
J4U2JicIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAA2JieHNSYm/zYlJ/82JSb/NSYm/zYlJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiYn/zYmJv82Jib/NiYn/zYmJy4AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANiYnozYm
J/82JifrNiUndjYmJwwAAAAANiYnCDYmJ3o2JifvNiYn/zYmJ/82Jif/NiYn/zYmJ/82Jif/NiYn/zYm
J/82Jif/NiYn/zYmJ/82Jib/NiYn/zYmJv82Jib/NiYn/zYmJv82Jib/NiYn/zYmJv82Jib/NiYn/zYm
Jv82Jib/NiYn/zYmJ/s2JielNiYnJAAAAAA2JicONiYnJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JSaHNiYn/zYmJv82Jib/NiYn/zYm
J+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNSUn/zUl
Jv81JSb/NSUn/zYmJy4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAANSYnozUlJ/81JSf/NiUm/zYmJ+k2JidyNiYnCgAAAAA2JicSNiYnejYm
J+M1JSf/NiUm/zUlJ/81JSf/NiUm/zUlJ/81JSf/NiUm/zUlJ/81JSb/NSUn/zUlJv81JSb/NSUn/zUl
Jv81JSb/NSUn/zUlJv81JSb/NSUn/zUlJv82JifpNiYnjTYmJyQAAAAANicnADYmJ1Q2JibjNSYnaAAA
AAAAAAAAAAAAADYmJww2Jic8NSUnPDYmJzw2Jic8NSUnPDYmJzw2Jic8NSUnPDYmJyIAAAAAAAAAAAAA
AAA2JieHNSUn/zUlJv81JSb/NSUn/zUlJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAA2JifVNiYn/zUmJv81Jib/NiYn/zYmJy4AAAAAAAAAAAAAAAA2JicgNiUnzzUm
Js82JibPNiUnzzUmJs82JibPNiUnzzUmJs82JidmAAAAAAAAAAAAAAAANiUnozUmJ/81JSf/NiYm/zUm
J/81JSf/NiYnswAAAAAAAAAAAAAAADYmJwQ2JidGNiYnmzYmJ+M1JSf/NiYm/zUmJ/81JSf/NiYm/zUm
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
AAA2JieHNSYn/zYlJ/82JSf/NSYn/zYlJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAA2JifVNiYn/zYmJv82Jib/NiYn/zYmJy4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANiUnozYmJv82Jib/NiYm/zYm
Jv82Jib/NiUnuwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUmJ1Q2Jib/NiYm/zYm
Jv82Jib/NiYm/zYlJ9sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANiYmkTYm
Jv82Jib/NiYm/zYmJv82Jib/NSYmaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JSeHNiYm/zYmJv82Jib/NiYm/zYlJ+cAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNSUn/zUlJ/81JSf/NSUn/zYm
Jy4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAANiYnozUlJ/81JSf/NSUn/zUlJ/81JSf/NSUnuwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAADYmJ1Q1JSf/NSUn/zUlJ/81JSf/NSUn/zUmJ9sAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAANiYmkTUlJ/81JSf/NSUn/zUlJ/81JSf/NiYmaAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JieHNSUn/zUl
J/81JSf/NSUn/zUmJucAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA2JifVNiYn/zYmJv82Jib/NiYn/zYmJ1Q2JicuNiYnLjYmJy42JicuNiYnLjYmJy42JicuNiYnLjYm
Jy42JicuNiYnLjYmJy42JicuNiYnLjYmJy42JicuNiYntTUmJ/81JSf/NiYn/zUmJ/81JSf/NiUnuwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUmJ1Q1JSf/NiYn/zUmJ/82JSb/NSYn/zYm
J+E2JicuNiYnLjYmJy42JicuNiYnLjYmJwQAAAAAAAAAAAAAAAAAAAAANiYmkTYlJ/82JSb/NSYn/zYl
J/82JSb/NiYmaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAA2JieHNSYn/zYlJ/82JSb/NSYn/zYlJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiYn/zYmJ/82Jif/NiYn/zYmJ/82Jif/NiYn/zYm
J/82Jif/NiYn/zYmJ/82Jif/NiYn/zYmJ/82Jif/NiYn/zYmJ/82Jif/NiYn/zYmJ/82Jif/NiYn/zYm
J/82Jif/NiYn/zYmJ/82Jif/NiYnuwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUm
J1Q2Jif/NiYn/zYmJ/82Jif/NiYn/zYlJ/82Jif/NiYn/zYlJ/82Jif/NiYn/zYmJxYAAAAAAAAAAAAA
AAAAAAAANiYmkTYlJ/82Jif/NiYn/zYlJ/82Jif/NiYnyTYmJ6M2JiejNSYnozYmJ6M2JiejNSYnozYm
J6M2JiejNSYnozYmJ6M2JiejNSYnozYmJ6M2JiejNSYnozYmJ6M2JSfVNiYn/zYlJ/82Jif/NiYn/zYm
J+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNSUm/zUl
Jv81JSb/NSUm/zUlJv81JSb/NSUm/zUlJv81JSb/NSUm/zUlJv81JSb/NSUm/zUlJv81JSb/NSUm/zUl
Jv81JSb/NSUm/zUlJv81JSb/NSUm/zUlJv81JSb/NSUm/zUlJv81JSb/NSUnuwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAADYlJ1Q1JSb/NSUm/zUlJv81JSb/NSYm/zUlJv81JSb/NSYm/zUl
Jv81JSb/NSYm/zYmJxYAAAAAAAAAAAAAAAAAAAAANiYmkTUlJv81JSb/NSYm/zUlJv81JSb/NSYm/zUl
Jv81JSb/NSYm/zUlJv81JSb/NSYm/zUlJv81JSb/NSYm/zUlJv81JSb/NSYm/zUlJv81JSb/NSYm/zUl
Jv81JSb/NSYm/zUlJv81JSb/NSYm/zUlJucAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAA2JifVNiYn/zYmJv82Jib/NiYn/zYmJv81Jib/NiUn/zUmJv81Jib/NiUn/zUm
Jv81Jib/NiUn/zUmJv81Jib/NiUn/zUmJv81JSf/NiYn/zUmJ/81JSf/NiYn/zUmJ/81JSf/NiYn/zUm
J/81JSf/NiUnuwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUmJ1Q1JSf/NiYn/zUm
J/82JSb/NSYn/zYlJ/82JSb/NSYn/zYlJ/82JSb/NSYn/zYmJxYAAAAAAAAAAAAAAAAAAAAANiYmkTYl
J/82JSb/NSYn/zYlJ/82JSb/NSYn/zYlJ/82JSb/NSYn/zYlJ/82JSb/NSYn/zYlJ/82JSb/NSYn/zYl
J/82JSb/NSYn/zYlJ/82JSb/NSYn/zYlJ/82JSb/NSYn/zYlJ/82JSb/NSYn/zYlJ+cAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JifVNiYn/zYmJ/82Jif/NiYn/zYm
J/82Jif/NiYn/zYmJ/82Jif/NiYn/zYmJ/82Jif/NiYn/zYmJ/82Jif/NiYn/zYmJ/82Jif/NiYn/zYm
J/82Jif/NiYn/zYmJ/82Jif/NiYn/zYmJ/82Jif/NiYnuwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAADUmJ1Q2Jif/NiYn/zYmJ/82Jif/NiYn/zYlJ/82Jif/NiYn/zYlJ/82Jif/NiYn/zYm
JxYAAAAAAAAAAAAAAAAAAAAANiYmkTYlJ/82Jif/NiYn/zYlJ/82Jif/NiYn/zYlJ/82Jif/NiYn/zYl
J/82Jif/NiYn/zYlJ/82Jif/NiYn/zYlJ/82Jif/NiYn/zYlJ/82Jif/NiYn/zYlJ/82Jif/NiYn/zYl
J/82Jif/NiYn/zYmJ+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA2JifVNSUm/zUlJv81JSb/NSUm/zUlJv81JSb/NSUm/zUlJv81JSb/NSUm/zUlJv81JSb/NSUm/zUl
Jv81JSb/NSUm/zUlJv81JSb/NSUm/zUlJv81JSb/NSUm/zUlJv81JSb/NSUm/zUlJv81JSb/NSUnuwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYlJ1Q1JSb/NSUm/zUlJv81JSb/NSYm/zUl
Jv81JSb/NSYm/zUlJv81JSb/NSYm/zYmJxYAAAAAAAAAAAAAAAAAAAAANiYmkTUlJv81JSb/NSYm/zUl
Jv81JSb/NSYm/zUlJv81JSb/NSYm/zUlJv81JSb/NSYm/zUlJv81JSb/NSYm/zUlJv81JSb/NSYm/zUl
Jv81JSb/NSYm/zUlJv81JSb/NSYm/zUlJv81JSb/NSYm/zUlJucAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0JCgENSUpBjUlKQY1JSkGNSUpBjUlKQY0JCgGNSUpBjQl
KAY0JCgGNSUpBjQlKAY0JCgGNSUpBjQlKAY0JCgGNSUpBjQlKAY1JSkGNCUpBjUlKQY1JSkGNCUpBjUl
KQY1JSkGNCUpBjUlKQY1JSkGNSUoBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUl
KAI1JSkGNCUpBjUlKQY0JCkGNSUpBjQlKQY0JCkGNSUpBjQlKQY0JCkGNSUpBjMjJgAAAAAAAAAAAAAA
AAAAAAAANSUoBDQlKQY0JCkGNSUpBjQlKQY0JCkGNSUpBjQlKQY0JCkGNSUpBjQlKQY0JCkGNSUpBjQl
KQY0JCkGNSUpBjQlKQY0JCkGNSUpBjQlKQY0JCkGNSUpBjQlKQY0JCkGNSUpBjQlKQY0JCkGNSUpBjUl
KQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////////////
///////////////////////////////////////////////////8AAAAP/gAAAD////8AAAAP/gAAAD/
4P/8AAAAP/gAAAD/wH/8AAAAP/gAAAD/gH/8AAAAP/gAAAD/AD/8AAAAP///g//+AH/8D//4P///g//8
AH/8D//4Pwf/g//4AP/8D//4Pwf/g//wAf/8D//4Pwf/g//gA//8DwB4Pwf/h//AB//8DwB4P4////+A
D7/8DwB4P////j8AHz/8DwB4P////j4APj/8DwB4P/AB/3wAfD/8DwB4PwAAH/gA+D/8DwB4eAAAB/AB
8D/8DwB54AAAAeAD4D/8DwB7wAAAAEAHwD/8D///AAf8AAAPgD/8D//+AD//wAAfAD/8D//8Af//8AA+
AD/8D//4A////AB////8AAAwD////gD////8AAAgH////4Dx///8AABgP////8Dh///8AADAf////+Bh
///8AADA/////+Ax///8AAGB//////Ax/D////+B//////gZ+D////8D//////gZ+D////8D//////wd
+D////8H//////wP+D////4H//////wP+D////4H//////4P+D/8D/4P//////4OAD/8D/4P//////4O
AD/8D/wP//////4GAD/8D/wP//////8GAD//8BwP//////8H+D//8AwP//////8H+D//8AwP//////8H
+D//8AwP//////8H+D//8AwP//////8H+D//8AwP//////8H+D//8P4P//////4H+D//8P4H//////4O
D///8P4H//////4OD///8P4H//////4OD///8P8D//////wOD/////8D//////wf//////8D//////gf
//////+B//////gf//////+B//////A////////A//////A////////Af////+B////8AADgP////8BA
AD/8AABwH////4CAAD/8AAAwD////wGAAD/8AAA4B////AMAAD/8AAAcAf//8AYAAD/8H//+AH//wA4A
AD/8H///gAf8AB//8D/8H//3wAAAAD//8D/8H//x8AAAAP//8D/8H//wfAAAA9//8D/8HwDwHwAAHx8A
cD/8HwDwH/AD/h8AcD/8HwDwH///+B8AcD/8HwDwHz/4+B8AcD/8HwDwHw/g+B8AcD/8HwDwHw/g+B8A
cD/8HwDwHw/g+B8AcD/8HwDwH///+B8AcD/8HwDwH/gf+B8A8D/8H//wH/gf+B//8D/8H//wH/gf+B//
8D/8H//wH/gf+B//8D/8H//wH/gf+B//8D/8AAAAH/gA+AAAAD/8AAAAH/gA+AAAAD/8AAAAH/gA+AAA
AD/8AAAAH/gA+AAAAD/8AAAAH/gA+AAAAD//////////////////////////////////////////////
//////////////////////////////////////////////////8=
</value>
</data>
</root>
\ No newline at end of file
using HalconDotNet;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CodeLibrary
{
public class HDCodeHelper
{
/// <summary>
/// 二维码参数文件保存的默认路径\CodeParam\
/// </summary>
public static string CodeParamPath = @"\CodeParam\";
/// <summary>
/// 显示的窗口
/// </summary>
public static HWindow HalconWindow = null;
/// <summary>
/// 根据图片路径解析二维码
/// </summary>
/// <param name="filePath">图片路径</param>
/// <param name="codeCount">二维码数量</param>
/// <param name="codeParamPath">二维码参数路径,""表示不使用参数</param>
/// <param name="paramType">二维码类型,不传类型默认Data Matrix ECC 200</param>
/// <returns>解析到的二维码</returns>
public static List<CodeInfo> DecodeCode(string filePath, int codeCount, string codeParamPath, params string[] paramType)
{
HObject ho_Image;
HOperatorSet.GenEmptyObj(out ho_Image);
ho_Image.Dispose();
HOperatorSet.ReadImage(out ho_Image, filePath);
if (HalconWindow != null)
{
HOperatorSet.DispObj(ho_Image, HalconWindow);
}
return DecodeCode(ho_Image, codeCount, codeParamPath, paramType);
}
///// <summary>
///// 根据图片解析二维码
///// </summary>
///// <param name="map">图片对象</param>
///// <param name="codeCount">二维码数量</param>
///// <param name="codeParamPath">二维码参数路径,""表示不使用参数</param>
///// <param name="paramType">二维码类型,不传类型默认Data Matrix ECC 200</param>
///// <returns>解析到的二维码</returns>
//public static List<CodeInfo> DecodeCode(Bitmap map, int codeCount, string codeParamPath, params string[] paramType)
//{
// HObject ho_image;
// Bitmap2HObjectBpp24(map,out ho_image);
// return DecodeCode(ho_image, codeCount, codeParamPath, paramType);
//}
/// <summary>
/// 根据图片解析二维码
/// </summary>
/// <param name="ho_Image">Halcon中的图片对象</param>
/// <param name="codeCount">二维码数量</param>
/// <param name="codeParamPath">二维码参数路径,""表示不使用参数</param>
/// <param name="paramType">二维码类型,不传类型默认Data Matrix ECC 200</param>
/// <returns>解析到的二维码</returns>
public static List<CodeInfo> DecodeCode(HObject ho_Image, int codeCount, string codeParamPath, params string[] paramType)
{
List<string> codeType = new List<string>(paramType.ToList());
if (codeType.Count<string>() <= 0)
{
codeType.Add("Data Matrix ECC 200");
}
List<CodeInfo> codeList = new List<CodeInfo>();
foreach (string t in codeType)
{
List<CodeInfo> array = DecodeCode(ho_Image, t, codeParamPath, codeCount);
codeList.AddRange(array.ToArray<CodeInfo>());
}
foreach (CodeInfo code in codeList)
{
code.CodeStr = code.GetCodeStr();
}
return codeList;
}
public static List<CodeInfo> DecodeCode(HObject ho_Image, string symbolType, string hv_model_path, int codeCount,int timeOut=1500)
{
HDLogUtil.debug(" DecodeCode[" + symbolType + "][" + hv_model_path + "][" + codeCount + "] 开始");
List<CodeInfo> codeList = new List<CodeInfo>();
try
{
HTuple hv_Area = null;
HTuple hv_Row1 = null;
HTuple hv_Column = null;
HTuple hv_PointOrder = null;
HObject ho_SymbolXLDs;
HTuple hv_ResultHandles = null;
HTuple hv_DecodedDataStrings = null;
HTuple hv_DataCodeHandle = null;
HOperatorSet.GenEmptyObj(out ho_SymbolXLDs);
HOperatorSet.CreateDataCode2dModel(symbolType, "default_parameters", "maximum_recognition", out hv_DataCodeHandle);
//string hv_model_path = GetCodeParamFilePath(symbolType);
if (!hv_model_path.Equals("") && File.Exists(hv_model_path))
{
HOperatorSet.ReadDataCode2dModel(hv_model_path, out hv_DataCodeHandle);
}
// HOperatorSet.SetDataCode2dParam(hv_DataCodeHandle, "timeout", 3000);
ho_SymbolXLDs.Dispose();
// set_data_code_2d_param(DataCodeHandle, 'timeout', 200)
HOperatorSet.SetDataCode2dParam(hv_DataCodeHandle, "timeout", timeOut);
//HOperatorSet.SetDataCode2dParam(hv_DataCodeHandle, "string_encoding", "locale");
if (codeCount <= 0)
{
HOperatorSet.FindDataCode2d(ho_Image, out ho_SymbolXLDs, hv_DataCodeHandle,
new HTuple(), new HTuple(), out hv_ResultHandles, out hv_DecodedDataStrings);
}
else
{
HOperatorSet.FindDataCode2d(ho_Image, out ho_SymbolXLDs, hv_DataCodeHandle,
"stop_after_result_num", codeCount, out hv_ResultHandles, out hv_DecodedDataStrings);
}
HOperatorSet.AreaCenterXld(ho_SymbolXLDs, out hv_Area, out hv_Row1, out hv_Column, out hv_PointOrder);
if (HalconWindow != null)
{
ShowImage(HalconWindow, ho_Image, ho_SymbolXLDs);
}
HOperatorSet.ClearDataCode2dModel(hv_DataCodeHandle);
if (hv_DecodedDataStrings.Length > 0)
{
string[] resultList = hv_DecodedDataStrings.SArr;
for (int i = 0; i < hv_DecodedDataStrings.SArr.Length; i++)
{
try
{
int x = (int)Math.Round(hv_Column.DArr[i]);
int y = (int)Math.Round(hv_Row1.DArr[i]);
string str = hv_DecodedDataStrings.SArr[i];
CodeInfo code = new CodeInfo(str, x, y);
codeList.Add(code);
}
catch (Exception)
{
HDLogUtil.error("处理二维码出错:索引=" + i + "," + resultList.ToString());
}
}
}
HDLogUtil.debug(" DecodeCode[" + symbolType + "][" + hv_model_path + "][" + codeCount + "] 结束,返回数量:"+codeList.Count);
if (hv_Area != null)
{
hv_Area.UnPinTuple();
}
if (hv_Row1 != null)
{
hv_Row1.UnPinTuple();
}
if (hv_Column != null)
{
hv_Column.UnPinTuple();
}
if (hv_PointOrder != null)
{
hv_PointOrder.UnPinTuple();
}
if (hv_ResultHandles != null)
{
hv_ResultHandles.UnPinTuple();
}
if (hv_DecodedDataStrings != null)
{
hv_DecodedDataStrings.UnPinTuple();
}
if (hv_DataCodeHandle != null)
{
hv_DataCodeHandle.UnPinTuple();
}
if (ho_SymbolXLDs != null)
{
ho_SymbolXLDs.Dispose();
ho_SymbolXLDs = null;
}
return codeList;
}
catch (Exception ex)
{
HDLogUtil.error("DecodeCode出错:" + ex.ToString());
HDLogUtil.debug(" DecodeCode[" + symbolType + "][" + hv_model_path + "][" + codeCount + "] 结束,返回数量:" + codeList.Count);
return codeList;
}
}
internal static void ShowImage(HWindow window, HObject ho_Image, HObject ho_SymbolXLDs)
{
if (window == null || ho_Image == null)
{
return;
}
Task.Factory.StartNew(delegate ()
{
try
{
HTuple width, height;
//int dWidth = 0; int dHeight = 0;
HOperatorSet.GetImageSize(ho_Image, out width, out height);
int dWidth = (int)width.D;
int dHeight = (int)height.D;
window.SetPart(0, 0, dHeight, dWidth);
HOperatorSet.SetColor(window, "red");
HOperatorSet.SetLineWidth(window, new HTuple(2));
if (ho_Image != null)
{
HOperatorSet.DispObj(ho_Image, window);
}
if (ho_SymbolXLDs != null)
{
HOperatorSet.DispObj(ho_SymbolXLDs, window);
}
}
catch (Exception)
{
}
});
}
/// <summary>
/// 将BitMap转换为HObject对象
/// </summary>
public static bool Bitmap2HObjectBpp24(Bitmap bmp, out HObject ho_Image)
{
ho_Image = null;
try
{
HOperatorSet.GenEmptyObj(out ho_Image);
ho_Image.Dispose();
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
BitmapData srcBmpData = bmp.LockBits(rect, ImageLockMode.ReadOnly, bmp.PixelFormat);
if (bmp.PixelFormat == PixelFormat.Format8bppIndexed)
HOperatorSet.GenImage1(out ho_Image, "byte", bmp.Width, bmp.Height, srcBmpData.Scan0);
else if (bmp.PixelFormat == PixelFormat.Format24bppRgb)
HOperatorSet.GenImageInterleaved(out ho_Image, srcBmpData.Scan0, "rgb", bmp.Width, bmp.Height, 0, "byte", 0, 0, 0, 0, -1, 0);
else
HOperatorSet.GenImageInterleaved(out ho_Image, srcBmpData.Scan0, "bgrx", bmp.Width, bmp.Height, 0, "byte", 0, 0, 0, 0, -1, 0);
bmp.UnlockBits(srcBmpData);
return true;
}
catch (Exception ex)
{
HDLogUtil.error("将BitMap转换为HObject对象出错:" + ex.ToString());
ho_Image = null;
}
return false;
}
public static void HObject2Bpp8(HObject image, out Bitmap res)
{
HTuple hpoint, type, width, height;
const int Alpha = 255;
long[] ptr = new long[2];
HOperatorSet.GetImagePointer1(image, out hpoint, out type, out width, out height);
res = new Bitmap(width, height, PixelFormat.Format8bppIndexed);
ColorPalette pal = res.Palette;
for (int i = 0; i <= 255; i++)
{
pal.Entries[i] = Color.FromArgb(Alpha, i, i, i);
}
res.Palette = pal;
Rectangle rect = new Rectangle(0, 0, width, height);
BitmapData bitmapData = res.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
int PixelSize = Bitmap.GetPixelFormatSize(bitmapData.PixelFormat) / 8;
ptr[0] = (long)bitmapData.Scan0;
ptr[1] = hpoint.L;
if (width % 4 == 0)
CopyMemory((IntPtr)ptr[0], (IntPtr)ptr[1], width * height * PixelSize);
else
{
for (int i = 0; i < height - 1; i++)
{
ptr[1] += width;
CopyMemory((IntPtr)ptr[0], (IntPtr)ptr[1], width * PixelSize);
ptr[0] += bitmapData.Stride;
}
}
res.UnlockBits(bitmapData);
}
[DllImport("Kernel32.dll")]
private static extern void CopyMemory(IntPtr dest, IntPtr source, int size);
internal static string GetCodeParamFilePath(string codeType)
{
if (CodeParamPath.Equals(""))
{
CodeParamPath = @"\CodeParam\";
}
string appPath = Application.StartupPath + CodeParamPath;
if (!Directory.Exists(appPath))
{
Directory.CreateDirectory(appPath);
}
string filePath = appPath + codeType + ".dcm";
return filePath;
}
public static List<CodeInfo> DecodeBarCode(string filePath)
{
HObject ho_Image;
HOperatorSet.GenEmptyObj(out ho_Image);
ho_Image.Dispose();
HOperatorSet.ReadImage(out ho_Image, filePath);
return DecodeBarCode(ho_Image);
}
//public static List<CodeInfo> DecodeBarCode(Bitmap bitmap)
//{
// HObject ho_image;
// Bitmap2HObjectBpp24(bitmap,out ho_image);
// return DecodeBarCode(ho_image);
//}
public static List<CodeInfo> DecodeBarCode(HObject ho_Image)
{
List<CodeInfo> codeList = new List<CodeInfo>();
try
{
HObject ho_GrayImage, ho_SymbolRegions;
HTuple hv_BarCodeHandle = null, hv_DecodedDataStrings = null, hv_DecodedDataTypes = null; ;
HOperatorSet.GenEmptyObj(out ho_GrayImage);
HOperatorSet.GenEmptyObj(out ho_SymbolRegions);
HTuple hv_Area = null;
HTuple hv_Row1 = null;
HTuple hv_Column = null;
HTuple hv_Orientation = null;
HOperatorSet.Rgb1ToGray(ho_Image, out ho_GrayImage);
HOperatorSet.GenEmptyObj(out ho_SymbolRegions);
ho_SymbolRegions.Dispose();
HOperatorSet.CreateBarCodeModel(new HTuple(), new HTuple(), out hv_BarCodeHandle);
if (ConfigHelper.Config.Get("HOperatorSet_element_size_min",-1)>=0)
HOperatorSet.SetBarCodeParam(hv_BarCodeHandle, "element_size_min", ConfigHelper.Config.Get("HOperatorSet_element_size_min", -1));
HOperatorSet.FindBarCode(ho_GrayImage, out ho_SymbolRegions, hv_BarCodeHandle, "auto", out hv_DecodedDataStrings);
//HOperatorSet.AreaCenterXld(ho_SymbolRegions, out hv_Area, out hv_Row1, out hv_Column, out hv_PointOrder);
HOperatorSet.GetBarCodeResult(hv_BarCodeHandle, "all", "decoded_types", out hv_DecodedDataTypes);
HOperatorSet.GetBarCodeResult(hv_BarCodeHandle, "all", "orientation", out hv_Orientation);
HOperatorSet.AreaCenter(ho_SymbolRegions, out hv_Area, out hv_Row1, out hv_Column);
if (HalconWindow != null)
{
HOperatorSet.SetDraw(HalconWindow, "margin");
ShowImage(HalconWindow, ho_Image, ho_SymbolRegions);
}
string[] resultList = hv_DecodedDataStrings.SArr;
if (resultList.Length > 0)
{
for (int i = 0; i < hv_DecodedDataStrings.SArr.Length; i++)
{
try
{
int x = (int)Math.Round(hv_Column.DArr[i]);
int y = (int)Math.Round(hv_Row1.DArr[i]);
string str = hv_DecodedDataStrings.SArr[i];
string type = hv_DecodedDataTypes.SArr[i];
CodeInfo code = new CodeInfo(str, x, y, type);
code.Orientation = hv_Orientation.DArr[i];
codeList.Add(code);
if (HalconWindow != null)
{
HOperatorSet.SetTposition(HalconWindow, new HTuple(x), new HTuple(y));
HOperatorSet.WriteString(HalconWindow,new HTuple ( "(" + (i + 1).ToString() + ")"));
}
}
catch (Exception)
{
HDLogUtil.error("处理一维码出错:索引=" + i + "," + resultList.ToString());
}
}
}
HOperatorSet.ClearBarCodeModel(hv_BarCodeHandle);
if (hv_Area != null)
{
hv_Area.UnPinTuple();
}
if (hv_Row1 != null)
{
hv_Row1.UnPinTuple();
}
if (hv_Column != null)
{
hv_Column.UnPinTuple();
}
if (hv_Orientation != null)
{
hv_Orientation.UnPinTuple();
}
if (ho_GrayImage != null)
{
ho_GrayImage.Dispose();
ho_GrayImage = null;
}
if (ho_SymbolRegions != null)
{
ho_SymbolRegions.Dispose();
ho_SymbolRegions = null;
}
return codeList;
}
catch (Exception)
{
return codeList;
}
}
}
[Serializable]
public class CodeInfo
{
public string CodeStr = "";
public int X = 0;
public int Y = 0;
public string CodeType;
public double Orientation = 0;
public Point LabelCenter= Point.Empty;
public int LabelDistance = 0;
public CodeInfo() { }
public CodeInfo(string codeStr,int x,int y)
{
this.CodeStr = codeStr;
this.X = x;
this.Y = y;
}
public CodeInfo(string codeStr, int x, int y,string type)
{
this.CodeType = type;
this.CodeStr = codeStr;
this.X = x;
this.Y = y;
}
public string GetCodeStr()
{
return Gb2312Correct(CodeStr);
}
/// <summary>
/// 判断字符串中是否包含中文
/// </summary>
/// <param name="str">需要判断的字符串</param>
/// <returns>判断结果</returns>
public static bool HasChinese(string str)
{
return Regex.IsMatch(str, @"[\u4e00-\u9fa5]");
}
/// <summary>
/// utf8文字用gb2312格式显示时候乱码,需要转换为gb2312
/// </summary>
/// <param name="text"></param>
/// <returns></returns>
public static string Gb2312Correct(string text)
{
//string ascii= Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(text));
//return ascii;
if (!HasChinese(text))
{
return text;
}
//声明字符集
System.Text.Encoding utf8, gb2312;
//utf8
utf8 = System.Text.Encoding.GetEncoding("utf-8");
//gb2312
gb2312 = System.Text.Encoding.GetEncoding("gb2312");
byte[] gb;
gb = utf8.GetBytes(text);
//utf8.GetString(System.Text.Encoding.Convert(utf8, gb2312, gb));
gb = System.Text.Encoding.Convert(utf8, gb2312, gb);
//返回转换后的字符
string s = utf8.GetString(gb);
int sp = 0;
while (true)
{
sp = s.IndexOf("?", sp+1);
if (sp < 0)
break;
if (s.Substring(sp, 2) != "?;")
{
s = s.Insert(sp + 1, ";");
}
}
return s;
}
}
}
using HalconDotNet;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace CodeLibrary
{
public class HDCodeLearnHelper
{
/// <summary>
/// 图片对象,学习时如果使用图片学习,需要先设置此属性
/// </summary>
public static HObject DefaultImage = null;
public static Bitmap DefaultBitmap = null;
/// <summary>
/// 学习后是否自动测试,默认是
/// </summary>
public static bool IsNeedTest = true;
/// <summary>
/// 是否正在学习中
/// </summary>
public static bool IsRun = false;
internal static List<string> cameraNameList = new List<string>();
internal static List<string> codeTypeList = new List<string>();
private static char spiltChar = '#';
/// <summary>
/// 初始化摄像机名称和二维码类型
/// </summary>
/// <param name="nameStr">摄像机名称,多个用#分割</param>
/// <param name="codeStr">二维码类型,多个用#分割</param>
public static void LoadConfig(string nameStr, string codeStr)
{
cameraNameList = new List<string>();
codeTypeList = new List<string>();
try
{
string[] nameArray = nameStr.Split(spiltChar);
foreach (string str in nameArray)
{
HDLogUtil.info("加载到摄像机名称:" + str.Trim());
cameraNameList.Add(str.Trim());
}
string[] codeArray = codeStr.Split(spiltChar);
foreach (string str in codeArray)
{
HDLogUtil.info("加载到二维码类型:" + str.Trim());
codeTypeList.Add(str.Trim());
}
if (codeTypeList.Count <= 0)
{
codeTypeList.Add("Data Matrix ECC 200");
codeTypeList.Add("QR Code");
}
codeTypeList.Add("remote");
}
catch (Exception ex)
{
HDLogUtil.error("解析摄像机配置出错:" + ex.StackTrace);
}
}
private static HTuple hv_AcqHandle = null;
private static Stopwatch stopWatch = new Stopwatch();
/// <summary>
/// 开始学习二维码
/// </summary>
/// <param name="Window">显示的窗口</param>
/// <param name="camerName">摄像机名称,使用图片学习传""</param>
/// <param name="codeType">二维码类型</param>
/// <param name="paramPath">二维码参数文件路径</param>
/// <param name="codeCount">二维码数量</param>
/// <param name="timeOutMs">超时时间,默认5000毫秒</param>
public static void StartLearn(HWindow Window, string camerName, string codeType, string paramPath, int codeCount, int timeOutMs)
{
if (codeCount <= 0)
{
codeCount = 1;
}
if (timeOutMs <= 0)
{
timeOutMs = 5000;
}
if (camerName.Equals("") && DefaultImage == null)
{
return;
}
HDLogUtil.info("开始学习[" + camerName + "][" + codeType + "] [" + codeCount + "] [" + timeOutMs + "]");
learnCode(Window, camerName, codeType, paramPath, codeCount, timeOutMs);
}
private static bool IsTestEnd = false;
private static bool IsLearnEnd = false;
public static void StopLearn()
{
IsTestEnd = true;
IsLearnEnd = true;
IsRun = false;
}
private static bool OpenCamera(string cameraName)
{
if (cameraName.Equals(""))
{
return true;
}
try
{ //[1] HD USB Camera
if (cameraName.ToUpper().Contains("USB") || (cameraName.ToUpper().Contains("[") && cameraName.ToUpper().Contains("]")))
{
HOperatorSet.OpenFramegrabber("DirectShow", 1, 1, 0, 0, 0, 0, "default", 8, "rgb", -1, "false", "default", cameraName, 0, -1, out hv_AcqHandle);
}
else
{
HOperatorSet.OpenFramegrabber("GigEVision", 0, 0, 0, 0, 0, 0, "default", -1, "default", -1, "false", "default", cameraName, 0, -1, out hv_AcqHandle);
}
return true;
}
catch (Exception ex)
{
HDLogUtil.error("open camera [" + cameraName + "]error :" + ex.ToString() + "");
CloseCamera(cameraName);
return false;
}
}
private static void CloseCamera(string cameraName)
{
if (cameraName.Equals(""))
{
return;
}
try
{
HOperatorSet.CloseFramegrabber(hv_AcqHandle);
hv_AcqHandle = null;
}
catch (Exception ex)
{
HDLogUtil.error("close camera[" + cameraName + "]error:" + ex.ToString());
}
}
private static HObject GetImage(string cameraName)
{
if (cameraName.Equals(""))
{
return DefaultImage;
}
else
{
HObject ho_Image = null;
HOperatorSet.GenEmptyObj(out ho_Image);
ho_Image.Dispose();
HOperatorSet.GrabImageAsync(out ho_Image, hv_AcqHandle, -1);
return ho_Image;
}
}
private static List<string> findCode = new List<string>();
// Main procedure
private static bool learnCode(HWindow hv_ExpDefaultWinHandle, string cameraName, string codeType, string paramPath, int codeCount, int timeOutMs)
{
stopWatch.Restart();
IsRun = true;
IsLearnEnd = false;
IsTestEnd = false;
try
{
HTuple hv_code_type = codeType;
HTuple hv_model_path = paramPath;
HObject ho_SymbolXLDs = null;
HTuple hv_train_first = null, /*hv_AcqHandle = null,*/ hv_DataCodeHandle = null;
HTuple hv_ResultHandles = new HTuple(), hv_DecodedDataStrings = new HTuple();
HTuple hv_GenParamNames = new HTuple(), hv_ModelBeforeTraining = new HTuple();
HOperatorSet.GenEmptyObj(out ho_SymbolXLDs);
findCode = new List<string>();
hv_train_first = 1;
if (!OpenCamera(cameraName))
{
HDLogUtil.info("open camera [" + cameraName + "] fail,学习结束");
StopLearn();
return false;
}
if (File.Exists(hv_model_path))
{
try
{
HOperatorSet.ReadDataCode2dModel(hv_model_path, out hv_DataCodeHandle);
}
catch (Exception)
{
HOperatorSet.CreateDataCode2dModel(hv_code_type, new HTuple(), new HTuple(), out hv_DataCodeHandle);
}
}
else
{
HOperatorSet.CreateDataCode2dModel(hv_code_type, new HTuple(), new HTuple(), out hv_DataCodeHandle);
}
if ((int)(hv_train_first) != 0)
{
while (findCode.Count < codeCount && IsLearnEnd.Equals(false))
{
HObject ho_Image = GetImage(cameraName);
if (ho_Image != null)
{
ho_SymbolXLDs.Dispose();
HOperatorSet.FindDataCode2d(ho_Image, out ho_SymbolXLDs, hv_DataCodeHandle, "train", "all", out hv_ResultHandles, out hv_DecodedDataStrings);
if ((int)(new HTuple((new HTuple(hv_DecodedDataStrings.TupleLength())).TupleNotEqual(0))) != 0)
{
HOperatorSet.QueryDataCode2dParams(hv_DataCodeHandle, "get_model_params", out hv_GenParamNames);
HOperatorSet.GetDataCode2dParam(hv_DataCodeHandle, hv_GenParamNames, out hv_ModelBeforeTraining);
CodeResultAdd(hv_DecodedDataStrings, codeType, "学习");
}
ShowImage(hv_ExpDefaultWinHandle, ho_Image, ho_SymbolXLDs);
ho_Image.Dispose();
}
if (findCode.Count >= codeCount || stopWatch.ElapsedMilliseconds > timeOutMs)
{
HDLogUtil.info(" 持续时间[" + stopWatch.ElapsedMilliseconds + "]数量[" + findCode.Count + "]结束学习");
break;
}
Thread.Sleep(500);
}
//*参数写入文件
//HDLogUtil.info("[" + cameraName + "][" + codeType + "]保存参数到文件【" + paramPath + "】");
HOperatorSet.WriteDataCode2dModel(hv_DataCodeHandle, hv_model_path);
HOperatorSet.ClearDataCode2dModel(hv_DataCodeHandle);
}
//Read the previously saved data code model
findCode = new List<string>();
HOperatorSet.ReadDataCode2dModel(hv_model_path, out hv_DataCodeHandle);
while (findCode.Count < codeCount && IsTestEnd.Equals(false) && IsNeedTest)
{
HObject ho_Image = GetImage(cameraName);
if (ho_Image != null)
{
ho_SymbolXLDs.Dispose();
HOperatorSet.FindDataCode2d(ho_Image, out ho_SymbolXLDs, hv_DataCodeHandle, "stop_after_result_num", codeCount, out hv_ResultHandles, out hv_DecodedDataStrings);
ShowImage(hv_ExpDefaultWinHandle, ho_Image, ho_SymbolXLDs);
if ((int)(new HTuple((new HTuple(hv_DecodedDataStrings.TupleLength())).TupleNotEqual(0))) != 0)
{
CodeResultAdd(hv_DecodedDataStrings, codeType, "识别");
}
ho_Image.Dispose();
}
if (findCode.Count >= codeCount || stopWatch.ElapsedMilliseconds > timeOutMs)
{
HDLogUtil.info(" 持续时间[" + stopWatch.ElapsedMilliseconds + "]数量[" + findCode.Count + "]结束识别");
break;
}
Thread.Sleep(500);
}
HOperatorSet.ClearDataCode2dModel(hv_DataCodeHandle);
CloseCamera(cameraName);
ho_SymbolXLDs.Dispose();
StopLearn();
if (hv_code_type != null)
{
hv_code_type.UnPinTuple();
}
if (hv_model_path != null)
{
hv_model_path.UnPinTuple();
}
if (hv_train_first != null)
{
hv_train_first.UnPinTuple();
}
if (hv_ResultHandles != null)
{
hv_ResultHandles.UnPinTuple();
}
if (hv_DataCodeHandle != null)
{
hv_DataCodeHandle.UnPinTuple();
}
if (hv_DecodedDataStrings != null)
{
hv_DecodedDataStrings.UnPinTuple();
}
if (hv_GenParamNames != null)
{
hv_GenParamNames.UnPinTuple();
}
if (hv_ModelBeforeTraining != null)
{
hv_ModelBeforeTraining.UnPinTuple();
}
return true;
}
catch (Exception ex)
{
HDLogUtil.error("出错了:" + ex.ToString());
CloseCamera(cameraName);
StopLearn();
return false;
}
}
private static void CodeResultAdd(HTuple hv_DecodedDataStrings, string codeType, string logname)
{
string[] resultList = hv_DecodedDataStrings.SArr;
foreach (string str in resultList)
{
if (!findCode.Contains(str))
{
findCode.Add(str);
HDLogUtil.info(" " + logname + "到二维码[" + str + "]");
}
}
}
private static void ShowImage(HWindow hv_ExpDefaultWinHandle, HObject ho_Image, HObject ho_SymbolXLDs)
{
HDCodeHelper.ShowImage(hv_ExpDefaultWinHandle, ho_Image, ho_SymbolXLDs);
//if (hv_ExpDefaultWinHandle == null || ho_Image == null)
//{
// return;
//}
//Task.Factory.StartNew(delegate ()
//{
// try
// {
// HTuple width, height;
// //int dWidth = 0; int dHeight = 0;
// HOperatorSet.GetImageSize(ho_Image, out width, out height);
// int dWidth = (int)width.D;
// int dHeight = (int)height.D;
// hv_ExpDefaultWinHandle.SetPart(0, 0, dHeight, dWidth);
// HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "red");
// HOperatorSet.SetLineWidth(hv_ExpDefaultWinHandle, new HTuple(2));
// HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandle);
// HOperatorSet.DispObj(ho_SymbolXLDs, hv_ExpDefaultWinHandle);
// }
// catch (Exception ex)
// {
// }
//});
}
}
}
using IDHIKCamera;
using log4net;
using log4net.Config;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace CodeLibrary
{
public class HDLogUtil
{
private static string logName = "";
public static string LogName
{
get { return logName; }
set
{
logName = value;
LOGGER = LogManager.GetLogger(LogName);
}
}
private static ILog LOGGER = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private static Dictionary<int, DateTime> lastErrorLogTime = new Dictionary<int, DateTime>();
public static System.Windows.Forms.RichTextBox logBox = null;
public static int showCount = 50;
public static bool debug_opened = false;
static HDLogUtil()
{
XmlConfigurator.Configure();
//LibLogUtil.LogEvent += LibLogUtil_LogEvent;
}
/*
private static void LibLogUtil_LogEvent(LibLogEventArg libLogEventArg)
{
if (libLogEventArg.Level.Equals(LibLogLevel.Info))
{
HDLogUtil.info(libLogEventArg.Msg + " " + libLogEventArg.Exception?.ToString());
}
else if (libLogEventArg.Level.Equals(LibLogLevel.Warning))
{
HDLogUtil.info(libLogEventArg.Msg + " " + libLogEventArg.Exception?.ToString());
}
else if (libLogEventArg.Level.Equals(LibLogLevel.Debug))
{
HDLogUtil.debug(libLogEventArg.Msg + " " + libLogEventArg.Exception?.ToString());
}
else if (libLogEventArg.Level.Equals(LibLogLevel.Error))
{
HDLogUtil.error(libLogEventArg.Msg + " " + libLogEventArg.Exception?.ToString());
}
}
*/
public static void info(string msg)
{
LOGGER.Info("HDLogUtil" + " - " + msg);
AddToBox(msg);
}
public static void debug(string msg)
{
LOGGER.Debug("HDLogUtil" + " - " + msg);
if (debug_opened)
{
AddToBox(msg);
}
}
public static void error(string errorMsg)
{
LOGGER.Error("HDLogUtil" + " - " + errorMsg);
AddToBox(errorMsg);
}
private static void AddToBox(string msg)
{
try
{
if (logBox == null)
{
return;
}
ShowLogPro(msg);
}
catch (Exception ex)
{
LOGGER.Error("出错:" + ex.StackTrace);
}
}
private static int count = 0;
private static void ShowLogPro(string msg)
{
try
{
if (count > showCount)
{
count = 0;
logBox.Clear();
}
System.DateTime now = System.DateTime.Now;
logBox.AppendText(now.ToLongTimeString() + " " + msg + Environment.NewLine);
count++;
}
catch (Exception ex)
{
LOGGER.Error("出错:" + ex.ToString());
}
}
public static void ClearLog()
{
if (logBox != null)
{
logBox.Text = "";
count = 0;
}
}
}
}
//引用MvCameraControl.Net.dll
using System;
using MvCamCtrl.NET;
using System.Drawing;
using System.Drawing.Imaging;
using System.Collections.Generic;
using System.Runtime.InteropServices;
namespace CodeLibrary
{
/// <summary>
/// 海康相机
/// </summary>
public class HIKCamera
{
public static HIKCamera Instance = new HIKCamera();
/// <summary>
/// 当前相机
/// </summary>
private MyCamera cameraCurr;
/// <summary>
/// 所有相机列表
/// </summary>
private MyCamera.MV_CC_DEVICE_INFO_LIST cameraAll;
/// <summary>
/// 所有相机的名称
/// </summary>
private List<string> cameraName = new List<string>();
/// <summary>
/// 海康相机
/// </summary>
private HIKCamera()
{
cameraAll = new MyCamera.MV_CC_DEVICE_INFO_LIST();
Load();
}
/// <summary>
/// 错误信息
/// </summary>
public string ErrInfo { set; get; }
/// <summary>
/// 相机总数
/// </summary>
public int Count
{
get { return (int)cameraAll.nDeviceNum; }
}
/// <summary>
/// 相机名称,ModelName,SerialNumber
/// </summary>
public string[] CameraName
{
get
{
if (cameraName == null)
{
cameraName = new List<string>();
}
return cameraName.ToArray(); }
}
/// <summary>
/// 当前相机是否打开
/// </summary>
public bool IsOpen
{
get
{
if (cameraCurr == null)
return false;
else
return true;
}
}
/// <summary>
/// 相机图像宽度
/// </summary>
public int Width { set; get; }
/// <summary>
/// 相机图像高度
/// </summary>
public int Height { set; get; }
/// <summary>
/// 相机32位缓存
/// </summary>
public byte[] Buffer { get; private set; }
/// <summary>
/// 相机32位图像
/// </summary>
public Bitmap Image { get; private set; }
/// <summary>
/// 加载相机
/// </summary>
public void Load()
{
try
{
int rtn = MyCamera.MV_CC_EnumDevices_NET(MyCamera.MV_GIGE_DEVICE | MyCamera.MV_USB_DEVICE, ref cameraAll);
if (rtn != MyCamera.MV_OK) return;
cameraName.Clear();
string s = "";
for (int i = 0; i < cameraAll.nDeviceNum; i++)
{
MyCamera.MV_CC_DEVICE_INFO device = (MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(cameraAll.pDeviceInfo[i], typeof(MyCamera.MV_CC_DEVICE_INFO));
if (device.nTLayerType == MyCamera.MV_GIGE_DEVICE)
{
IntPtr buffer = Marshal.UnsafeAddrOfPinnedArrayElement(device.SpecialInfo.stGigEInfo, 0);
MyCamera.MV_GIGE_DEVICE_INFO gigeInfo = (MyCamera.MV_GIGE_DEVICE_INFO)Marshal.PtrToStructure(buffer, typeof(MyCamera.MV_GIGE_DEVICE_INFO));
s = "GigE:" + gigeInfo.chModelName + " (" + gigeInfo.chSerialNumber + ")";
}
else if (device.nTLayerType == MyCamera.MV_USB_DEVICE)
{
IntPtr buffer = Marshal.UnsafeAddrOfPinnedArrayElement(device.SpecialInfo.stUsb3VInfo, 0);
MyCamera.MV_USB3_DEVICE_INFO usbInfo = (MyCamera.MV_USB3_DEVICE_INFO)Marshal.PtrToStructure(buffer, typeof(MyCamera.MV_USB3_DEVICE_INFO));
s = "USB:" + usbInfo.chModelName + " (" + usbInfo.chSerialNumber + ")";
}
cameraName.Add(s);
}
}
catch (Exception ex)
{
HDLogUtil.error("HIK Load Error:" + ex.StackTrace);
}
}
/// <summary>
/// 打开指定相机
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public bool Open(string name)
{
int n = cameraName.FindIndex(s => s == name);
if (n == -1)
return false;
else
return Open(n);
}
/// <summary>
/// 打开指定相机
/// </summary>
/// <param name="idx">索引</param>
/// <returns></returns>
public bool Open(int idx)
{
if (idx < 0 || idx >= Count) return false;
if (cameraCurr != null) Close();
try
{
MyCamera.MV_CC_DEVICE_INFO device = (MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(cameraAll.pDeviceInfo[idx], typeof(MyCamera.MV_CC_DEVICE_INFO));
cameraCurr = new MyCamera();
if (cameraCurr == null) return false;
int nRet = cameraCurr.MV_CC_CreateDevice_NET(ref device);
if (nRet != MyCamera.MV_OK) return false;
nRet = cameraCurr.MV_CC_OpenDevice_NET();
if (nRet != MyCamera.MV_OK)
{
cameraCurr.MV_CC_DestroyDevice_NET();
return false;
}
if (device.nTLayerType == MyCamera.MV_GIGE_DEVICE)
{
int nPacketSize = cameraCurr.MV_CC_GetOptimalPacketSize_NET();
if (nPacketSize > 0) nRet = cameraCurr.MV_CC_SetIntValue_NET("GevSCPSPacketSize", (uint)nPacketSize);
}
cameraCurr.MV_CC_SetEnumValue_NET("AcquisitionMode", 2); //工作在连续模式
cameraCurr.MV_CC_SetEnumValue_NET("TriggerMode", 0); //连续模式
MyCamera.MVCC_INTVALUE pstValue = new MyCamera.MVCC_INTVALUE();
nRet = cameraCurr.MV_CC_GetWidth_NET(ref pstValue);
Width = (int)pstValue.nCurValue;
nRet = cameraCurr.MV_CC_GetHeight_NET(ref pstValue);
Height = (int)pstValue.nCurValue;
return true;
}
catch (Exception ex)
{
ErrInfo = ex.Message;
return false;
}
}
/// <summary>
/// 关闭当前相机
/// </summary>
public void Close()
{
if (cameraCurr != null)
{
cameraCurr.MV_CC_CloseDevice_NET();
cameraCurr.MV_CC_DestroyDevice_NET();
cameraCurr = null;
}
}
/// <summary>
/// 停止抓取数据
/// </summary>
public void Stop()
{
if (cameraCurr == null) return;
int rtn = cameraCurr.MV_CC_StopGrabbing_NET();
if (rtn != MyCamera.MV_OK) return;
}
/// <summary>
/// 抓取一张图像
/// </summary>
public void GrabOne()
{
int rtn = cameraCurr.MV_CC_StartGrabbing_NET();
if (rtn != MyCamera.MV_OK) return;
MyCamera.MVCC_INTVALUE stParam = new MyCamera.MVCC_INTVALUE();
rtn = cameraCurr.MV_CC_GetIntValue_NET("PayloadSize", ref stParam);
if (rtn != MyCamera.MV_OK) return;
uint dataSize = stParam.nCurValue;
byte[] dataArr = new byte[dataSize];
uint buffSize = dataSize * 3 + 2048;
byte[] buffArr = new byte[buffSize];
IntPtr pData = Marshal.UnsafeAddrOfPinnedArrayElement(dataArr, 0);
MyCamera.MV_FRAME_OUT_INFO_EX stFrameInfo = new MyCamera.MV_FRAME_OUT_INFO_EX();
rtn = cameraCurr.MV_CC_GetOneFrameTimeout_NET(pData, dataSize, ref stFrameInfo, 100000);
if (rtn != MyCamera.MV_OK) return;
MyCamera.MvGvspPixelType enDstPixelType = stFrameInfo.enPixelType;
switch (stFrameInfo.enPixelType)
{
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono12_Packed:
enDstPixelType = stFrameInfo.enPixelType; break;
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR12_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG12_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB12_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG12_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_YUV422_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_YUV422_YUYV_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_YCBCR411_8_CBYYCRYY:
enDstPixelType = MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed; break;
}
IntPtr pImage = Marshal.UnsafeAddrOfPinnedArrayElement(buffArr, 0);
MyCamera.MV_PIXEL_CONVERT_PARAM stConverPixelParam = new MyCamera.MV_PIXEL_CONVERT_PARAM();
stConverPixelParam.nWidth = stFrameInfo.nWidth;
stConverPixelParam.nHeight = stFrameInfo.nHeight;
stConverPixelParam.pSrcData = pData;
stConverPixelParam.nSrcDataLen = stFrameInfo.nFrameLen;
stConverPixelParam.enSrcPixelType = stFrameInfo.enPixelType;
stConverPixelParam.enDstPixelType = enDstPixelType;
stConverPixelParam.pDstBuffer = pImage;
stConverPixelParam.nDstBufferSize = buffSize;
rtn = cameraCurr.MV_CC_ConvertPixelType_NET(ref stConverPixelParam);
if (rtn != MyCamera.MV_OK) return;
if (enDstPixelType == MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8)
{
Image = new Bitmap(stFrameInfo.nWidth, stFrameInfo.nHeight, stFrameInfo.nWidth * 1, PixelFormat.Format8bppIndexed, pImage);
ColorPalette cp = Image.Palette;
for (int i = 0; i < 256; i++)
cp.Entries[i] = Color.FromArgb(i, i, i);
Image.Palette = cp;
int picSize = Image.Width * Image.Height;
Buffer = new byte[picSize];
Array.Copy(buffArr, Buffer, picSize);
//Rectangle rect = new Rectangle(0, 0, Image.Width, Image.Height);
//BitmapData bmpData = Image.LockBits(rect, ImageLockMode.ReadWrite, Image.PixelFormat);
//IntPtr iPtr = bmpData.Scan0;
//int picSize = Image.Width * Image.Height;
//Buffer = new byte[picSize];
//Marshal.Copy(iPtr, Buffer, 0, picSize);
//Image.UnlockBits(bmpData);
}
else
{
for (int i = 0; i < stFrameInfo.nHeight; i++)
{
for (int j = 0; j < stFrameInfo.nWidth; j++)
{
byte chRed = buffArr[i * stFrameInfo.nWidth * 3 + j * 3];
buffArr[i * stFrameInfo.nWidth * 3 + j * 3] = buffArr[i * stFrameInfo.nWidth * 3 + j * 3 + 2];
buffArr[i * stFrameInfo.nWidth * 3 + j * 3 + 2] = chRed;
}
}
Image = new Bitmap(stFrameInfo.nWidth, stFrameInfo.nHeight, stFrameInfo.nWidth * 3, PixelFormat.Format24bppRgb, pImage);
int picSize = Image.Width * Image.Height * 3;
Buffer = new byte[picSize];
Array.Copy(buffArr, Buffer, picSize);
}
rtn = cameraCurr.MV_CC_StopGrabbing_NET();
if (rtn != MyCamera.MV_OK) return;
}
/// <summary>
/// 抓取连续图像,触发GrabImage事件
/// </summary>
/// <param name="hWnd"></param>
public void GrabContinuous(IntPtr hWnd)
{
int rtn = cameraCurr.MV_CC_StartGrabbing_NET();
if (rtn != MyCamera.MV_OK) return;
rtn = cameraCurr.MV_CC_Display_NET(hWnd);
if (rtn != MyCamera.MV_OK) return;
}
}
}
\ No newline at end of file
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace CodeLibrary
{
public class ImageHelper
{ /// <summary>
/// 图像灰度化
/// </summary>
/// <param name="bmp"></param>
/// <returns></returns>
public static Bitmap ToGray(Bitmap bmp)
{
for (int i = 0; i < bmp.Width; i++)
{
for (int j = 0; j < bmp.Height; j++)
{
//获取该点的像素的RGB的颜色
Color color = bmp.GetPixel(i, j);
//利用公式计算灰度值
int gray = (int)(color.R * 0.3 + color.G * 0.59 + color.B * 0.11);
Color newColor = Color.FromArgb(gray, gray, gray);
bmp.SetPixel(i, j, newColor);
}
}
return bmp;
}
/// <summary>
/// 图像灰度反转
/// </summary>
/// <param name="bmp"></param>
/// <returns></returns>
public static Bitmap GrayReverse(Bitmap bmp)
{
for (int i = 0; i < bmp.Width; i++)
{
for (int j = 0; j < bmp.Height; j++)
{
//获取该点的像素的RGB的颜色
Color color = bmp.GetPixel(i, j);
Color newColor = Color.FromArgb(255 - color.R, 255 - color.G, 255 - color.B);
bmp.SetPixel(i, j, newColor);
}
}
return bmp;
}
/// <summary>
/// 图像二值化1:取图片的平均灰度作为阈值,低于该值的全都为0,高于该值的全都为255
/// </summary>
/// <param name="bmp"></param>
/// <returns></returns>
public static Bitmap ConvertTo1Bpp1(Bitmap bmp)
{
int average = 0;
for (int i = 0; i < bmp.Width; i++)
{
for (int j = 0; j < bmp.Height; j++)
{
Color color = bmp.GetPixel(i, j);
average += color.B;
}
}
average = (int)average / (bmp.Width * bmp.Height);
for (int i = 0; i < bmp.Width; i++)
{
for (int j = 0; j < bmp.Height; j++)
{
//获取该点的像素的RGB的颜色
Color color = bmp.GetPixel(i, j);
int value = 255 - color.B;
Color newColor = value > average ? Color.FromArgb(0, 0, 0) : Color.FromArgb(255, 255, 255);
bmp.SetPixel(i, j, newColor);
}
}
return bmp;
}
/// <summary>
/// 图像二值化2
/// </summary>
/// <param name="img"></param>
/// <returns></returns>
public static Bitmap ConvertTo1Bpp2(Bitmap img)
{
int w = img.Width;
int h = img.Height;
Bitmap bmp = new Bitmap(w, h, PixelFormat.Format1bppIndexed);
BitmapData data = bmp.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite, PixelFormat.Format1bppIndexed);
for (int y = 0; y < h; y++)
{
byte[] scan = new byte[(w + 7) / 8];
for (int x = 0; x < w; x++)
{
Color c = img.GetPixel(x, y);
if (c.GetBrightness() >= 0.5) scan[x / 8] |= (byte)(0x80 >> (x % 8));
}
Marshal.Copy(scan, 0, (IntPtr)((int)data.Scan0 + data.Stride * y), scan.Length);
}
return bmp;
}
/// <summary>
/// 图像明暗调整
/// </summary>
/// <param name="b">原始图</param>
/// <param name="degree">亮度[-255, 255]</param>
/// <returns></returns>
public static Bitmap KiLighten(Bitmap b, int degree)
{
if (b == null)
{
return null;
}
if (degree < -255) degree = -255;
if (degree > 255) degree = 255;
try
{
int width = b.Width;
int height = b.Height;
int pix = 0;
BitmapData data = b.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
unsafe
{
byte* p = (byte*)data.Scan0;
int offset = data.Stride - width * 3;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
// 处理指定位置像素的亮度
for (int i = 0; i < 3; i++)
{
pix = p[i] + degree;
if (degree < 0) p[i] = (byte)Math.Max(0, pix);
if (degree > 0) p[i] = (byte)Math.Min(255, pix);
} // i
p += 3;
} // x
p += offset;
} // y
}
b.UnlockBits(data);
return b;
}
catch
{
return null;
}
} // end of Lighten
}
}
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("CodeLibrary")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("CodeLibrary")]
[assembly: AssemblyCopyright("Copyright © 2018")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("2e0d9598-cb37-46dc-9c9b-d36d4d344451")]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
// 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
//[assembly: AssemblyVersion("1.0.0.0")]
//[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyVersion("1.0.*")]
//[assembly: AssemblyFileVersion("1.0.*")]
\ No newline at end of file
using CodeLibrary;
using HalconDotNet;
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Serialization;
public class RemoteDecodeHelper
{
static int webclienttimeout = 30 * 1000;
static Process p = new Process();
static string serverhost = "http://127.0.0.1:58137/";
public static List<CodeInfo> DecodeRequest(HObject hoimg, RemoteDecodeParam remoteDecodeParam)
{
byte[] requestdata;
lock (hoimg)
{
using (MemoryStream mStream = new MemoryStream())
{
hoimg.Serialize(mStream);
requestdata = mStream.ToArray();
mStream.Close();
}
}
return DecodeRequest(requestdata, remoteDecodeParam,true);
}
public static List<CodeInfo> DecodeRequest(Bitmap bitmap, RemoteDecodeParam remoteDecodeParam)
{
if (bitmap == null)
return null;
byte[] requestdata;
lock (bitmap)
{
using (MemoryStream mStream = new MemoryStream())
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(mStream, bitmap);
requestdata = mStream.ToArray();
mStream.Close();
}
}
return DecodeRequest(requestdata, remoteDecodeParam);
}
static List<CodeInfo> DecodeRequest(byte[] requestdata, RemoteDecodeParam remoteDecodeParam,bool isHObject=false)
{
try
{
CheckAndRunServer();
}
catch (Exception ex) {
return new List<CodeInfo> { new CodeInfo("ScanCodeServer start error:"+ ex, 0,0) };
}
string param;
using (MemoryStream mStreamparam = new MemoryStream())
{
XmlSerializer xf = new XmlSerializer(typeof(RemoteDecodeParam));
xf.Serialize(mStreamparam, remoteDecodeParam);
param = base64UrlEncode(mStreamparam.ToArray());
mStreamparam.Close();
}
string url = serverhost+"ProcessBitmap?param=";
if (isHObject)
url = serverhost+"Process?param=";
byte[] resp;
try
{
using (MyWebClient webClient = new MyWebClient(webclienttimeout))
{
resp = webClient.UploadData(url + param, requestdata);
requestdata = null;
}
}
catch(WebException we)
{
TaskKill("ScanCodeServer");
return new List<CodeInfo> { new CodeInfo("ScanCodeServer run error:" + we, 0, 0) };
}
catch
{
return null;
}
List<CodeInfo> codeInfos=null;
var ss = Encoding.UTF8.GetString(resp).Trim().Trim('"');
ss = ss.Replace(@"\/", "/");
try
{
var bb = Convert.FromBase64String(ss);
using (MemoryStream mStreamResult = new MemoryStream(bb))
{
XmlSerializer xff = new XmlSerializer(typeof(List<CodeInfo>));
codeInfos = (List<CodeInfo>)xff.Deserialize(mStreamResult);
}
}
catch {
throw new Exception(ss);
}
return codeInfos;
}
/// <summary>
/// 在url中传递base64字符串需要替换加号等符号
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
static string base64UrlEncode(byte[] input)
{
return Convert.ToBase64String(input).Replace('+', '-').Replace('/', '_');
}
/// <summary>
/// 检查并自动启动服务器
/// </summary>
static void CheckAndRunServer()
{
lock (p)
{
var port = (int)Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\ScanCodeServer\\", "port", 58137);
serverhost = "http://127.0.0.1:" + port + "/";
var pss = Process.GetProcessesByName("ScanCodeServer");
if (pss.Length > 0 && !pss[0].HasExited)
return;
var f = Application.StartupPath+ "\\ScanCodeServer\\ScanCodeServer.exe";
if (!File.Exists(f))
{
throw new Exception("找不到扫码服务器文件");
}
p.StartInfo = new ProcessStartInfo(f);
p.Start();
Thread.Sleep(3000);
int checkcount = 15;
while (checkcount > 0)
{
checkcount--;
Thread.Sleep(500);
port = (int)Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\ScanCodeServer\\", "port", 58137);
serverhost = "http://127.0.0.1:"+ port + "/";
using (MyWebClient webClient = new MyWebClient(webclienttimeout))
{
var s = webClient.DownloadString(serverhost + "alive");
if (s.Trim() == "\"1\"")
return;
}
}
TaskKill("ScanCodeServer");
throw new Exception("扫码服务器打开失败,退出码:"+ p.ExitCode);
}
}
static void TaskKill(string processname) {
var pss = Process.GetProcessesByName(processname);
foreach (var p in pss)
{
try
{
p.Kill();
}
catch { }
}
}
[Serializable]
public struct RemoteDecodeParam
{
public string[] codeTypeList;
public int codeCount;
public int timeout;
}
public class MyWebClient : WebClient
{
private int _timeout;
public MyWebClient(int timeout)
{
this._timeout = timeout;
}
protected override WebRequest GetWebRequest(Uri address)
{
var result = base.GetWebRequest(address);
result.Timeout = this._timeout;
return result;
}
}
}
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using ZXing;
using ZXing.Common;
using ZXing.Multi.QrCode;
namespace CodeLibrary
{
public class ZXingCodeHelper
{
public static List<string> DeCodes(Bitmap map, string codeType)
{
if (codeType.ToUpper().Equals("QR CODE"))
{
return DecodeQRCodes(map);
}
else if (codeType.ToUpper().Equals("DATA MATRIX ECC 200"))
{
return DecodeCodes(map);
}
else if (codeType.ToUpper().Equals("BARCODE"))
{
return DecodeCodes(map);
}
else
{
return DecodeCodes(map);
}
}
public static List<string> DecodeCodes(Bitmap bmp)
{
MultiFormatReader mreader = new MultiFormatReader();
ZXing.Multi.GenericMultipleBarcodeReader genericMultiple = new ZXing.Multi.GenericMultipleBarcodeReader(mreader);
LuminanceSource source = new BitmapLuminanceSource(bmp);
BinaryBitmap binarybitmap = new BinaryBitmap(new HybridBinarizer(source));
Result[] rr = genericMultiple.decodeMultiple(binarybitmap);
List<string> result = new List<string>();
if (rr != null)
{
foreach (Result res in rr)
{
if (res != null)
{
string text = res.ToString();
if (!IsGBCode(text))
{
text = ConvertISO88591ToEncoding(text, Encoding.Default);
}
result.Add(text);
}
}
}
return result;
}
public static List<string> DecodeBarCodes(Bitmap bmp)
{
List<string> result = new List<string>();
BarcodeReader br = new BarcodeReader();
DecodingOptions decodeOption = new DecodingOptions();
decodeOption.PossibleFormats = new List<BarcodeFormat>() { BarcodeFormat.CODE_39, BarcodeFormat.CODE_128 };
br.Options = decodeOption;
Result res = br.Decode(bmp);
if (res != null)
{
result.Add(res.ToString());
}
return result;
}
public static List<string> DecodeDMCodes(Bitmap bmp)
{
ZXing.Datamatrix.DataMatrixReader qc = new ZXing.Datamatrix.DataMatrixReader();
List<string> result = new List<string>();
LuminanceSource source = new BitmapLuminanceSource(bmp);
BinaryBitmap binarybitmap = new BinaryBitmap(new HybridBinarizer(source));
IDictionary<DecodeHintType, object> hints = new Dictionary<DecodeHintType, object>();
hints.Add(DecodeHintType.CHARACTER_SET, "UTF-8");
hints.Add(DecodeHintType.TRY_HARDER, "3");
Result res = qc.decode(binarybitmap, hints);
if (res != null)
{
result.Add(res.ToString());
}
return result;
}
public static List<string> DecodeQRCodes(Bitmap bmp)
{
QRCodeMultiReader qc = new QRCodeMultiReader();
List<string> result = new List<string>();
LuminanceSource source = new BitmapLuminanceSource(bmp);
BinaryBitmap binarybitmap = new BinaryBitmap(new HybridBinarizer(source));
IDictionary<DecodeHintType, object> hints = new Dictionary<DecodeHintType, object>();
hints.Add(DecodeHintType.CHARACTER_SET, "GB2312");
hints.Add(DecodeHintType.TRY_HARDER, "3");
Result[] r = qc.decodeMultiple(binarybitmap, hints);
if (r != null)
{
foreach (Result res in r)
{
if (res != null)
{
string text = res.ToString();
//if (!IsGBCode(text))
//{
// string chStr = "生产日期(或厂家批次):";
// int index = text.IndexOf(chStr);
// if (index > 0)
// {
// string sub1 = text.Substring(0, index);
// int sub3startIndex =index+ chStr.Length;
// string sub3 = text.Substring(sub3startIndex,text.Length- sub3startIndex);
// string sub1r = ConvertISO88591ToEncoding(sub1, Encoding.Default);
// string sub3r = ConvertISO88591ToEncoding(sub3, Encoding.Default);
// text = sub1r + chStr + sub3r;
// }
// else
// {
// text = ConvertISO88591ToEncoding(text, Encoding.Default);
// }
//}
result.Add(text);
}
}
}
return result;
}
//public static string DecodeQRCode(Bitmap bmp)
//{
// string text = "";
// DecodingOptions option = new DecodingOptions();
// //option.PossibleFormats = new List<BarcodeFormat>() { BarcodeFormat.QR_CODE, BarcodeFormat.All_1D };
// option.PossibleFormats = new List<BarcodeFormat>() { BarcodeFormat.QR_CODE };
// BarcodeReader br = new BarcodeReader();
// br.Options = option;
// Result rs = br.Decode(bmp);
// if (rs == null)
// {
// text = "";
// }
// else
// {
// text = rs.ToString();
// if (!IsGBCode(text))
// {
// text = ConvertISO88591ToEncoding(text, Encoding.Default);
// }
// }
// return text;
//}
//转换
private static string ConvertISO88591ToEncoding(string srcString, Encoding dstEncode)
{
String sResult;
Encoding ISO88591Encoding = Encoding.GetEncoding("ISO-8859-1");
Encoding GB2312Encoding = Encoding.GetEncoding("GB2312"); //这个地方很特殊,必须利用GB2312编码
byte[] srcBytes = ISO88591Encoding.GetBytes(srcString);
//将原本存储ISO-8859-1的字节数组当成GB2312转换成目标编码(关键步骤)
byte[] dstBytes = Encoding.Convert(GB2312Encoding, dstEncode, srcBytes);
char[] dstChars = new char[dstEncode.GetCharCount(dstBytes, 0, dstBytes.Length)];
dstEncode.GetChars(dstBytes, 0, dstBytes.Length, dstChars, 0);//利用char数组存储字符
sResult = new string(dstChars);
return sResult;
}
/// <summary>
/// 判断一个word是否为GB2312编码的汉字
/// </summary>
/// <param name="word"></param>
/// <returns></returns>
private static bool IsGBCode(string word)
{
byte[] bytes = Encoding.GetEncoding("GB2312").GetBytes(word);
if (bytes.Length <= 1) // if there is only one byte, it is ASCII code or other code
{
return false;
}
else
{
byte byte1 = bytes[0];
byte byte2 = bytes[1];
if (byte1 >= 176 && byte1 <= 247 && byte2 >= 160 && byte2 <= 254) //判断是否是GB2312
{
return true;
}
else
{
return false;
}
}
}
}
}
using Basler.Pylon;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CodeLibrary
{
public class BaslerCManager
{
/// <summary>
/// 当前相机
/// </summary>
// private Camera cameraCur = null;
private static Dictionary<string, BaslerCameraBean> cameraMap = new Dictionary<string, BaslerCameraBean>();
/// <summary>
/// 所有相机列表
/// </summary>
private static List<ICameraInfo> cameraAll;
/// <summary>
/// 所有相机的名称
/// </summary>
private static List<string> cameraName;
/// <summary>
/// 获取连续图像
/// </summary>
public delegate void GrabImageEvent();
///// <summary>
///// 获取连续图像事件,需要跨线程操作
///// </summary>
//public event GrabImageEvent GrabImage;
private BaslerCManager()
{
Load();
}
/// <summary>
/// 错误信息
/// </summary>
public static string ErrInfo { set; get; }
/// <summary>
/// 相机总数
/// </summary>
public int Count
{
get { return cameraAll == null ? 0 : cameraAll.Count; }
}
/// <summary>
/// 相机名称,ModelName,SerialNumber
/// </summary>
public static string[] CameraName
{
get
{
if (cameraName == null)
{
cameraName = new List<string>();
}
return cameraName.ToArray();
}
}
public static BaslerCameraBean GetCamera(string cName)
{
if (cameraMap.ContainsKey(cName))
{
return cameraMap[cName];
}
return null;
}
public static void AddCamera(string name, BaslerCameraBean bean)
{
if (cameraMap.ContainsKey(name))
{
cameraMap.Remove(name);
}
cameraMap.Add(name, bean);
}
/// <summary>
/// 当前相机是否打开
/// </summary>
public static bool IsOpen(string name)
{
BaslerCameraBean bean = GetCamera(name);
if (bean == null)
{ return false; }
else
{
return bean.cameraCur.IsOpen;
}
}
/// <summary>
/// 加载相机
/// </summary>
public static void Load()
{
try
{
cameraAll = CameraFinder.Enumerate();
cameraName = new List<string>();
foreach (ICameraInfo info in cameraAll)
cameraName.Add(info[CameraInfoKey.ModelName].ToString() + " (" + info[CameraInfoKey.SerialNumber].ToString() + ")");
}
catch (Exception ex)
{
HDLogUtil.error("Basler Load Error:" + ex.StackTrace);
}
}
/// <summary>
/// 打开指定相机
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public static bool Open(string name, GrabImageEvent grab=null)
{
int n = cameraName.FindIndex(s => s == name);
if (n == -1)
return false;
else
{
if (cameraMap.ContainsKey(name))
{
if (cameraMap[name].cameraCur != null)
{
cameraMap[name].cameraCur.Close();
}
cameraMap.Remove(name);
}
Camera cameraCur = null;
if (n < 0 || n >= cameraAll.Count) { return false ; }
try
{
cameraCur = new Camera(cameraAll[n]);
BaslerCameraBean bean = new BaslerCameraBean(cameraCur);
bean.Open( );
AddCamera(name, bean);
}
catch (Exception ex)
{
ErrInfo = ex.Message;
return false ;
}
return true;
}
}
/// <summary>
/// 关闭当前相机
/// </summary>
public static void Close(string name)
{
BaslerCameraBean bean = GetCamera(name);
if (bean != null && bean.cameraCur != null)
{
bean.Close();
}
}
public static void CloseAll()
{
foreach(string key in cameraMap.Keys)
{
Close(key);
}
}
/// <summary>
/// 停止抓取数据
/// </summary>
public static void Stop(string name)
{
BaslerCameraBean bean = GetCamera(name);
if (bean != null)
{
bean.Stop();
}
}
/// <summary>
/// 抓取一张图像
/// </summary>
public static Bitmap GrabOne(string name)
{
BaslerCameraBean bean = GetCamera(name);
if (bean != null && bean.cameraCur != null)
{
return bean.GrabOne();
}
return null;
}
}
}
using Basler.Pylon;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static CodeLibrary.BaslerCamera;
namespace CodeLibrary
{
public class BaslerCameraBean
{
public Camera cameraCur = null;
/// <summary>
/// 相机图像宽度
/// </summary>
public int Width { set; get; }
/// <summary>
/// 相机图像高度
/// </summary>
public int Height { set; get; }
/// <summary>
/// 相机32位缓存
/// </summary>
public byte[] Buffer { get; private set; }
/// <summary>
/// 相机32位图像
/// </summary>
public Bitmap Image { get; private set; }
/// <summary>
/// 获取连续图像事件,需要跨线程操作
/// </summary>
public event GrabImageEvent GrabImage;
/// <summary>
/// 错误信息
/// </summary>
public string ErrInfo { set; get; }
public BaslerCameraBean (Camera c)
{
this.cameraCur = c;
}
public BaslerCameraBean (Camera c ,int width,int height)
{
this.cameraCur = c;
this.Width = width;
this.Height = height;
}
public void Open()
{
cameraCur.StreamGrabber.ImageGrabbed += OnImageGrabbed;
//cameraCur.StreamGrabber.GrabStopped += OnGrabStopped;
cameraCur.Open();
int Width = Convert.ToInt32(cameraCur.Parameters[PLCamera.Width].GetValue());
int Height = Convert.ToInt32(cameraCur.Parameters[PLCamera.Height].GetValue());
cameraCur.Parameters[PLCamera.UserSetSelector].SetValue(PLCamera.UserSetSelector.UserSet1); //加载用户设置1
bool bln = cameraCur.Parameters[PLCamera.UserSetLoad].TryExecute(); //执行设置
}
/// <summary>
/// 关闭当前相机
/// </summary>
public void Close()
{
if (cameraCur != null)
{
cameraCur.Close();
cameraCur.Dispose();
cameraCur = null;
}
}
/// <summary>
/// 停止抓取数据
/// </summary>
public void Stop()
{
if (cameraCur != null)
cameraCur.StreamGrabber.Stop();
}
/// <summary>
/// 抓取一张图像
/// </summary>
public Bitmap GrabOne()
{
cameraCur.Parameters[PLCamera.AcquisitionMode].SetValue(PLCamera.AcquisitionMode.SingleFrame);
//cameraCur.StreamGrabber.Start();
//IGrabResult grabResult = cameraCur.StreamGrabber.RetrieveResult(5000, TimeoutHandling.ThrowException);
IGrabResult grabResult = cameraCur.StreamGrabber.GrabOne(5000);
if (!grabResult.IsValid) return null ;
Image = new Bitmap(grabResult.Width, grabResult.Height, PixelFormat.Format32bppRgb);
BitmapData bmpData = Image.LockBits(new Rectangle(0, 0, grabResult.Width, grabResult.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppRgb);
IntPtr ptrBmp = bmpData.Scan0;
int picSize = bmpData.Stride * grabResult.Height;
PixelDataConverter conv = new PixelDataConverter();
conv.OutputPixelFormat = PixelType.BGRA8packed;
conv.Convert(ptrBmp, picSize, grabResult);
Buffer = new byte[picSize];
System.Runtime.InteropServices.Marshal.Copy(ptrBmp, Buffer, 0, picSize);
Image.UnlockBits(bmpData);
return Image;
//cameraCur.StreamGrabber.Stop();
}
/// <summary>
/// 抓取连续图像,触发GrabImage事件
/// </summary>
public void GrabContinuous()
{
cameraCur.Parameters[PLCamera.AcquisitionMode].SetValue(PLCamera.AcquisitionMode.Continuous);
cameraCur.StreamGrabber.Start(GrabStrategy.OneByOne, GrabLoop.ProvidedByStreamGrabber);
}
private void OnImageGrabbed(object sender, ImageGrabbedEventArgs e)
{
try
{
IGrabResult grabResult = e.GrabResult;
if (!grabResult.IsValid) return;
Image = new Bitmap(grabResult.Width, grabResult.Height, PixelFormat.Format32bppRgb);
BitmapData bmpData = Image.LockBits(new Rectangle(0, 0, grabResult.Width, grabResult.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppRgb);
IntPtr ptrBmp = bmpData.Scan0;
int picSize = bmpData.Stride * grabResult.Height;
PixelDataConverter conv = new PixelDataConverter();
conv.OutputPixelFormat = PixelType.BGRA8packed;
conv.Convert(ptrBmp, picSize, grabResult);
Buffer = new byte[picSize];
System.Runtime.InteropServices.Marshal.Copy(ptrBmp, Buffer, 0, picSize);
Image.UnlockBits(bmpData);
GrabImage?.Invoke();
}
catch (Exception ex)
{
ErrInfo = ex.Message;
}
finally
{
e.DisposeGrabResultIfClone();
}
}
}
}
using System;
using Basler.Pylon;
using System.Drawing;
using System.Drawing.Imaging;
using System.Collections.Generic;
using HalconDotNet;
using System.Runtime.InteropServices;
namespace CodeLibrary
{
partial class Basler : ClsCamera
{
/// <summary>
/// 当前相机
/// </summary>
private global::Basler.Pylon.Camera[] cameraCurr;
/// <summary>
/// 所有相机列表
/// </summary>
private List<ICameraInfo> cameraAll;
///// <summary>
///// 所有相机的名称
///// </summary>
//private List<string> cameraName;
///// <summary>
///// 连续抓图事件
///// </summary>
//public event Continuous Continuous_Event;
public override void Close(string name)
{
int index = Array.FindIndex(_name, s => s == name);
if (index == -1)
return;
if (cameraCurr[index] != null)
{
_isOpen[index] = false;
cameraCurr[index].Close();
cameraCurr[index].Dispose();
cameraCurr[index] = null;
}
}
public override void Close(int index)
{
if (cameraCurr[index] != null)
{
_isOpen[index] = false;
cameraCurr[index].Close();
cameraCurr[index].Dispose();
cameraCurr[index] = null;
}
}
public override void CloseAll()
{
for (int i = 0; i < cameraCurr.Length; i++)
{
if (cameraCurr[i] != null)
{
_isOpen[i] = false;
cameraCurr[i].Close();
cameraCurr[i].Dispose();
cameraCurr[i] = null;
}
}
}
public override Bitmap GrabOne(int index)
{
if (cameraCurr[index] != null)
{
try
{
cameraCurr[index].Parameters[PLCamera.AcquisitionMode].SetValue(PLCamera.AcquisitionMode.SingleFrame);
//cameraCur.StreamGrabber.Start();
//IGrabResult grabResult = cameraCur.StreamGrabber.RetrieveResult(5000, TimeoutHandling.ThrowException);
IGrabResult grabResult = cameraCurr[index].StreamGrabber.GrabOne(5000);
if (!grabResult.IsValid)
{
_errInfo = grabResult.ErrorDescription;
return null;
}
Bitmap _image = new Bitmap(grabResult.Width, grabResult.Height, PixelFormat.Format24bppRgb);
BitmapData bmpData = _image.LockBits(new Rectangle(0, 0, grabResult.Width, grabResult.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
IntPtr ptrBmp = bmpData.Scan0;
int picSize = bmpData.Stride * grabResult.Height;
PixelDataConverter conv = new PixelDataConverter();
conv.OutputPixelFormat = PixelType.BGR8packed;
conv.Convert(ptrBmp, picSize, grabResult);
//_buffer = new byte[picSize];
//System.Runtime.InteropServices.Marshal.Copy(ptrBmp, _buffer, 0, picSize);
_image.UnlockBits(bmpData);
_errInfo = "OK";
return _image;
}
catch (Exception ex)
{
_errInfo = ex.Message;
return null;
}
}
return null;
}
public override Bitmap GrabOne(string name)
{
int idx = Array.FindIndex(_name, s => s == name);
if (idx == -1)
return null;
else
return GrabOne(idx);
}
//public override void GrabStop(int index)
//{
// if (cameraCurr[index] != null)
// cameraCurr[index].StreamGrabber.Stop();
//}
public override bool Load()
{
try
{
cameraAll = CameraFinder.Enumerate();
cameraName = new List<string>();
foreach (ICameraInfo info in cameraAll)
cameraName.Add(info[CameraInfoKey.ModelName].ToString() + " (" + info[CameraInfoKey.SerialNumber].ToString() + ")");
_name = cameraName.ToArray();
_count = cameraName.Count;
_isOpen = new bool[_count];
_width = new int[_count];
_height = new int[_count];
cameraCurr = new global::Basler.Pylon.Camera[_count];
_errInfo = "OK";
return true;
}
catch (Exception ex)
{
_errInfo = ex.Message;
return false;
}
}
public override bool Open(int index)
{
// _index = index;
if (index < 0 || index >= _count)
{
_errInfo = "Not find";
return false;
}
if (cameraCurr[index] != null) Close(index);
try
{
cameraCurr[index] = new global::Basler.Pylon.Camera(cameraAll[index]);
//cameraCur.ConnectionLost += OnConnectionLost;
//cameraCur.CameraOpened += OnCameraOpened;
//cameraCur.CameraClosed += OnCameraClosed;
//cameraCur.StreamGrabber.GrabStarted += OnGrabStarted;
// cameraCurr[index].StreamGrabber.ImageGrabbed += OnImageGrabbed;
//cameraCur.StreamGrabber.GrabStopped += OnGrabStopped;
cameraCurr[index].Open();
_width[index] = Convert.ToInt32(cameraCurr[index].Parameters[PLCamera.Width].GetValue());
_height[index] = Convert.ToInt32(cameraCurr[index].Parameters[PLCamera.Height].GetValue());
cameraCurr[index].Parameters[PLCamera.UserSetSelector].SetValue(PLCamera.UserSetSelector.UserSet1); //加载用户设置1
bool bln = cameraCurr[index].Parameters[PLCamera.UserSetLoad].TryExecute(); //执行设置
_isOpen[index] = true;
_errInfo = "OK";
return true;
}
catch (Exception ex)
{
_errInfo = ex.Message;
return false;
}
}
public override bool Open(string name)
{
int n = cameraName.FindIndex(s => s == name);
if (n == -1)
{
_errInfo = "Not find";
return false;
}
else
return Open(n);
}
public override bool OpenAll()
{
bool rtn = true;
for (int i = 0; i < cameraName.Count; i++)
{
rtn = Open(i);
if (!rtn) break;
}
return rtn;
}
public override Bitmap GrabOneImage(string name)
{
int n = cameraName.FindIndex(s => s == name);
if (n == -1)
{
_errInfo = "Not find";
return null;
}
if (cameraCurr[n] != null)
{
return GrabOne(name);
}
return null;
}
public override HObject CaptureOnImage(string name)
{
return CaptureOnImage(name, out _);
}
public override HObject CaptureOnImage(string name,out Bitmap bmp,bool nohalcon=false)
{
HObject hoImage = null;
bmp = null;
int index = cameraName.FindIndex(s => s == name);
if (index == -1)
{
_errInfo = name + "Not find";
return hoImage;
}
if (cameraCurr[index] != null)
{
}
else
{
Open(index);
}
try
{
if (cameraCurr[index] != null)
{
cameraCurr[index].Parameters[PLCamera.AcquisitionMode].SetValue(PLCamera.AcquisitionMode.SingleFrame);
//cameraCur.StreamGrabber.Start();
//IGrabResult grabResult = cameraCur.StreamGrabber.RetrieveResult(5000, TimeoutHandling.ThrowException);
IGrabResult grabResult = cameraCurr[index].StreamGrabber.GrabOne(5000);
if (!grabResult.IsValid || !grabResult.GrabSucceeded)
{
_errInfo = grabResult.ErrorDescription;
return hoImage;
}
//相机像素数据
byte[] buffer = grabResult.PixelData as byte[];
//锁定像素数据
GCHandle hand = GCHandle.Alloc(buffer, GCHandleType.Pinned);
//获取像素数据的指针
IntPtr pr = hand.AddrOfPinnedObject();
//HalconDotNet.HObject image;
//转成灰度图HOjbect
HalconDotNet.HOperatorSet.GenImage1(out hoImage, new HalconDotNet.HTuple("byte"), grabResult.Width, grabResult.Height, pr);
//释放内存
if (hand.IsAllocated) hand.Free();
_errInfo = "OK";
return hoImage;
}
}
catch (Exception ex)
{
_errInfo = ex.Message;
return hoImage;
}
finally
{
// cameraCurr[index].MV_CC_StopGrabbing_NET();
}
return hoImage;
}
}
}
\ No newline at end of file
using CodeLibrary.camera;
using HalconDotNet;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
namespace CodeLibrary
{
/// <summary>
/// 相机
/// </summary>
public class Camera
{
public static ClsCamera _cam;
private static CameraType _type;
/// <summary>
/// 相机
/// </summary>
private Camera()
{ }
/// <summary>
/// 相机类型
/// </summary>
public static CameraType Type
{
set
{
if (_cam != null)
{
return;
// _cam.CloseAll();
}
_type = value;
switch (_type)
{
case CameraType.HIK:
_cam = new HIK();
// ((HIK)_cam).Continuous_Event += Camera_Continuous_Event;
break;
//case CameraType.Basler:
// _cam = new Basler();
// ((Basler)_cam).Continuous_Event += Camera_Continuous_Event;
//break;
case CameraType.HIKIDMVS:
_cam = new HIKIDMVS();
//((HIKIDMVS)_cam).Continuous_Event += Camera_Continuous_Event;
break;
}
}
get
{
return _type;
}
}
}
/// <summary>
/// 相机类型
/// </summary>
public enum CameraType
{
/// <summary>
/// 海康
/// </summary>
HIK,
/// <summary>
/// 海IDMVS
/// </summary>
HIKIDMVS,
/// <summary>
/// Basle
/// </summary>
Basler
}
public abstract class ClsCamera
{
/// <summary>
/// 所有相机的名称
/// </summary>
protected List<string> cameraName;
protected string _errInfo;
protected bool[] _isOpen;
protected int _count;
protected string[] _name;
protected int[] _width;
protected int[] _height;
//protected byte[] _buffer;
// protected Bitmap _image;
// protected int _index;
public delegate void Continuous();
public virtual string ErrInfo => _errInfo;
public virtual bool[] IsOpen => _isOpen;
public virtual int Count => _count;
public virtual string[] Name => _name;
//public virtual int[] Width => _width;
//public virtual int[] Height => _height;
//public virtual byte[] Buffer => _buffer;
// public virtual Bitmap Image => _image;
public abstract bool Load();
public abstract bool OpenAll();
public abstract bool Open(int index);
public abstract bool Open(string name);
public abstract void CloseAll();
public abstract void Close(int index);
public abstract void Close(string name);
// public abstract bool GrabOne();
public abstract Bitmap GrabOne(int index, PixelType pt = PixelType.Default);
public abstract Bitmap GrabOne(string name, PixelType pt = PixelType.Default);
// public abstract bool GrabContinuous(int index);
// public abstract void GrabStop(int index);
public abstract Bitmap GrabOneImage(string name, PixelType pt= PixelType.Default);
public abstract HObject CaptureOnImage(string name,out List<CodeInfo> cc);
public abstract HObject CaptureOnImage(string name, out Bitmap bmp, out List<CodeInfo> codeInfos, bool nohalcon = false);
public abstract bool ProcessOnImage(string name, out object[] result, params Func<string,Bitmap, object>[] func);
//扫码相机专用
public abstract List<CodeInfo> GetImageAndIdentifyCode(out Bitmap bitmap);
}
public enum PixelType
{
MONO8,
RGB8,
Default = MONO8,
}
}
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Runtime.InteropServices;
using System.Runtime.Serialization.Formatters.Binary;
using System.Threading;
using System.Xml.Linq;
using HalconDotNet;
using MvCamCtrl.NET;
namespace CodeLibrary
{
partial class HIK : ClsCamera
{
/// <summary>
/// 当前相机
/// </summary>
private MyCamera[] cameraCurr;
/// <summary>
/// 所有相机列表
/// </summary>
private MyCamera.MV_CC_DEVICE_INFO_LIST cameraAll;
public override void Close(int index)
{
lock (cameraCurr)
{
if (cameraCurr[index] != null)
{
_isOpen[index] = false;
cameraCurr[index].MV_CC_CloseDevice_NET();
cameraCurr[index].MV_CC_DestroyDevice_NET();
cameraCurr[index] = null;
}
}
}
public override void Close(string name)
{
lock (cameraCurr)
{
int index = cameraName.FindIndex(s => s == name);
if (index == -1)
{
_errInfo = "Not find";
return;
}
if (cameraCurr[index] != null)
{
_isOpen[index] = false;
cameraCurr[index].MV_CC_CloseDevice_NET();
cameraCurr[index].MV_CC_DestroyDevice_NET();
cameraCurr[index] = null;
}
}
}
public override void CloseAll()
{
if (cameraCurr == null)
return;
lock (cameraCurr)
{
HDLogUtil.info(" cameraCurr.Length : " + cameraCurr.Length.ToString());
for (int i = 0; i < cameraCurr.Length; i++)
{
if (cameraCurr[i] != null)
{
HDLogUtil.info($" cameraCurr[{i}] ");
_isOpen[i] = false;
cameraCurr[i].MV_CC_CloseDevice_NET();
cameraCurr[i].MV_CC_DestroyDevice_NET();
cameraCurr[i] = null;
}
}
}
}
public override Bitmap GrabOne(int index, PixelType pt = PixelType.Default)
{
if (cameraCurr[index] == null)
{
_errInfo = "Camera null";
return null;
}
try
{
for (int i = 0; i < 2; i++)
{
if (i > 0)
{
Close(index);
Open(index);
}
if (pt == PixelType.RGB8)
{
var nRet = cameraCurr[index].MV_CC_SetPixelFormat_NET((uint)MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed);
if (MyCamera.MV_OK != nRet)
{
HDLogUtil.error("MV_CC_SetPixelFormat_NET PixelType_Gvsp_RGB8_Packed nRet: " + nRet);
continue;
}
nRet = cameraCurr[index].MV_CC_SetEnumValue_NET("BinningHorizontal", 2);
if (MyCamera.MV_OK != nRet)
{
HDLogUtil.error("MV_CC_SetEnumValue_NET BinningHorizontal nRet: " + nRet);
continue;
}
nRet = cameraCurr[index].MV_CC_SetEnumValue_NET("BinningVertical", 2);
if (MyCamera.MV_OK != nRet)
{
HDLogUtil.error("MV_CC_SetEnumValue_NET BinningVertical nRet: " + nRet);
continue;
}
return ImageCapture(index);
}
else
{
var nRet = cameraCurr[index].MV_CC_SetPixelFormat_NET((uint)MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8);
if (MyCamera.MV_OK != nRet)
{
HDLogUtil.error("MV_CC_SetPixelFormat_NET PixelType_Gvsp_Mono8 nRet: " + nRet);
continue;
}
nRet = cameraCurr[index].MV_CC_SetEnumValue_NET("BinningHorizontal", 1);
if (MyCamera.MV_OK != nRet)
{
HDLogUtil.error("MV_CC_SetEnumValue_NET BinningHorizontal nRet: " + nRet);
continue;
}
nRet = cameraCurr[index].MV_CC_SetEnumValue_NET("BinningVertical", 1);
if (MyCamera.MV_OK != nRet)
{
HDLogUtil.error("MV_CC_SetEnumValue_NET BinningVertical nRet: " + nRet);
continue;
}
return ImageCapture2(index);
}
}
_errInfo = "OK";
return null;
}
catch (Exception ex)
{
_errInfo = ex.Message;
return null;
}
finally
{
cameraCurr[index].MV_CC_StopGrabbing_NET();
}
}
public override Bitmap GrabOne(string name, PixelType pt = PixelType.Default)
{
int idx = Array.FindIndex(_name, s => s == name);
if (idx == -1)
return null;
else
return GrabOne(idx, pt);
}
public override bool Load()
{
try
{
cameraAll = new MyCamera.MV_CC_DEVICE_INFO_LIST();
int rtn = MyCamera.MV_CC_EnumDevices_NET(MyCamera.MV_GIGE_DEVICE | MyCamera.MV_USB_DEVICE, ref cameraAll);
if (rtn != MyCamera.MV_OK)
{
_errInfo = "Load failed";
HDLogUtil.error(" Load camera error : " + _errInfo);
return false;
}
cameraName = new List<string>();
List<IntPtr> list = new List<IntPtr>();
string s = "";
for (int i = 0; i < cameraAll.nDeviceNum; i++)
{
MyCamera.MV_CC_DEVICE_INFO device = (MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(cameraAll.pDeviceInfo[i], typeof(MyCamera.MV_CC_DEVICE_INFO));
if (device.nTLayerType == MyCamera.MV_GIGE_DEVICE)
{
IntPtr buffer = Marshal.UnsafeAddrOfPinnedArrayElement(device.SpecialInfo.stGigEInfo, 0);
MyCamera.MV_GIGE_DEVICE_INFO gigeInfo = (MyCamera.MV_GIGE_DEVICE_INFO)Marshal.PtrToStructure(buffer, typeof(MyCamera.MV_GIGE_DEVICE_INFO));
s = "GigE:" + gigeInfo.chModelName + " (" + gigeInfo.chSerialNumber + ")";
//Marshal.FreeHGlobal(buffer);
}
else if (device.nTLayerType == MyCamera.MV_USB_DEVICE)
{
IntPtr buffer = Marshal.UnsafeAddrOfPinnedArrayElement(device.SpecialInfo.stUsb3VInfo, 0);
MyCamera.MV_USB3_DEVICE_INFO usbInfo = (MyCamera.MV_USB3_DEVICE_INFO)Marshal.PtrToStructure(buffer, typeof(MyCamera.MV_USB3_DEVICE_INFO));
s = "USB:" + usbInfo.chModelName + " (" + usbInfo.chSerialNumber + ")";
//Marshal.FreeHGlobal(buffer);
}
if (!s.Contains("MV-ID"))
{
cameraName.Add(s);
list.Add(cameraAll.pDeviceInfo[i]);
}
}
cameraAll.pDeviceInfo= list.ToArray();
cameraAll.nDeviceNum = (uint)list.Count;
_name = cameraName.ToArray();
_count = cameraName.Count;
_isOpen = new bool[_count];
_width = new int[_count];
_height = new int[_count];
cameraCurr = new MyCamera[_count];
_errInfo = "OK";
return true;
}
catch (Exception ex)
{
_errInfo = ex.Message;
return false;
}
}
public override bool Open(int index)
{
lock (cameraCurr)
{
// _index = index;
if (index < 0 || index >= _count)
{
_errInfo = "Not find";
HDLogUtil.error("open camera " + index + " error : " + _errInfo);
return false;
}
if (cameraCurr[index] != null) Close(index);
try
{
MyCamera.MV_CC_DEVICE_INFO device = (MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(cameraAll.pDeviceInfo[index], typeof(MyCamera.MV_CC_DEVICE_INFO));
cameraCurr[index] = new MyCamera();
int nRet = cameraCurr[index].MV_CC_CreateDevice_NET(ref device);
if (nRet != MyCamera.MV_OK) return false;
nRet = cameraCurr[index].MV_CC_OpenDevice_NET();
if (nRet != MyCamera.MV_OK)
{
cameraCurr[index].MV_CC_DestroyDevice_NET();
_errInfo = "Can not open";
HDLogUtil.error("open camera " + index + " error : " + _errInfo);
return false;
}
if (device.nTLayerType == MyCamera.MV_GIGE_DEVICE)
{
int nPacketSize = cameraCurr[index].MV_CC_GetOptimalPacketSize_NET();
if (nPacketSize > 0) nRet = cameraCurr[index].MV_CC_SetIntValue_NET("GevSCPSPacketSize", (uint)nPacketSize);
}
//cameraCurr[index].MV_CC_SetEnumValue_NET("AcquisitionMode", 2); //工作在连续模式
cameraCurr[index].MV_CC_SetEnumValue_NET("TriggerMode", 0); //连续模式
MyCamera.MVCC_INTVALUE pstValue = new MyCamera.MVCC_INTVALUE();
nRet = cameraCurr[index].MV_CC_GetWidth_NET(ref pstValue);
_width[index] = (int)pstValue.nCurValue;
nRet = cameraCurr[index].MV_CC_GetHeight_NET(ref pstValue);
_height[index] = (int)pstValue.nCurValue;
/* C#
 设置心跳时间:一般推荐设置3s-6s,设置太小,网络环境不稳定的情况下,会出现
掉线
 在 MV_CC_Startgrab 接口调用前设置*/
//nRet = cameraCurr[index].MV_CC_SetIntValue_NET("GevHeartbeatTimeout", 3000);
nRet = cameraCurr[index].MV_CC_SetIntValueEx_NET("GevHeartbeatTimeout", 3000);
if (MyCamera.MV_OK != nRet)
{
HDLogUtil.info("Set GevHeartbeatTimeout failed:"+ nRet);
}
_isOpen[index] = true;
_errInfo = "OK";
HDLogUtil.info("open camera " + index + _errInfo);
return true;
}
catch (Exception ex)
{
HDLogUtil.error("打开相机出错:" + ex.ToString());
_errInfo = ex.Message;
return false;
}
}
}
public override bool Open(string name)
{
int n = cameraName.FindIndex(s => s == name);
if (n == -1)
{
_errInfo = name + " Not find";
return false;
}
else
return Open(n);
}
public override Bitmap GrabOneImage(string name, PixelType pt = PixelType.Default)
{
int n = cameraName.FindIndex(s => s == name);
if (n == -1)
{
_errInfo = name + " Not find";
HDLogUtil.error("GrabOneImage [" + name + "] error : " + _errInfo);
return null;
}
if (cameraCurr[n] != null)
{
}
else
{
Open(name);
}
return GrabOne(name, pt);
}
public override bool OpenAll()
{
lock (cameraCurr)
{
bool rtn = true;
for (int i = 0; i < cameraName.Count; i++)
{
rtn = Open(i);
if (!rtn) break;
}
return rtn;
}
}
private Bitmap _ImageCapture(int index)
{
int rtn = cameraCurr[index].MV_CC_StartGrabbing_NET();
if (rtn != MyCamera.MV_OK)
{
_errInfo = "Can not grab one : " + rtn;
return null;
}
MyCamera.MVCC_INTVALUE stParam = new MyCamera.MVCC_INTVALUE();
rtn = cameraCurr[index].MV_CC_GetIntValue_NET("PayloadSize", ref stParam);
if (rtn != MyCamera.MV_OK) return null;
uint dataSize = stParam.nCurValue;
byte[] dataArr = new byte[dataSize];
uint buffSize = dataSize * 3 + 2048;
byte[] buffArr = new byte[buffSize];
IntPtr pData = Marshal.UnsafeAddrOfPinnedArrayElement(dataArr, 0);
MyCamera.MV_FRAME_OUT_INFO_EX stFrameInfo = new MyCamera.MV_FRAME_OUT_INFO_EX();
rtn = cameraCurr[index].MV_CC_GetOneFrameTimeout_NET(pData, dataSize, ref stFrameInfo, 3000);
if (rtn != MyCamera.MV_OK) return null;
MyCamera.MvGvspPixelType enDstPixelType = stFrameInfo.enPixelType;
switch (stFrameInfo.enPixelType)
{
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono12_Packed:
enDstPixelType = stFrameInfo.enPixelType; break;
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR12_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG12_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB12_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG12_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_YUV422_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_YUV422_YUYV_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_YCBCR411_8_CBYYCRYY:
enDstPixelType = MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed; break;
}
IntPtr pImage = Marshal.UnsafeAddrOfPinnedArrayElement(buffArr, 0);
//MyCamera.MV_PIXEL_CONVERT_PARAM stConverPixelParam = new MyCamera.MV_PIXEL_CONVERT_PARAM();
//stConverPixelParam.nWidth = stFrameInfo.nWidth;
//stConverPixelParam.nHeight = stFrameInfo.nHeight;
//stConverPixelParam.pSrcData = pData;
//stConverPixelParam.nSrcDataLen = stFrameInfo.nFrameLen;
//stConverPixelParam.enSrcPixelType = stFrameInfo.enPixelType;
//stConverPixelParam.enDstPixelType = enDstPixelType;
//stConverPixelParam.pDstBuffer = pImage;
//stConverPixelParam.nDstBufferSize = buffSize;
//rtn = cameraCurr[index].MV_CC_ConvertPixelType_NET(ref stConverPixelParam);
//if (rtn != MyCamera.MV_OK) return null;
if (enDstPixelType == MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8)
{
Bitmap _image = new Bitmap(stFrameInfo.nWidth, stFrameInfo.nHeight, stFrameInfo.nWidth * 1, PixelFormat.Format8bppIndexed, pImage);
ColorPalette cp = _image.Palette;
for (int i = 0; i < 256; i++)
cp.Entries[i] = Color.FromArgb(i, i, i);
_image.Palette = cp;
//int picSize = _image.Width * _image.Height;
//byte[] _buffer = new byte[picSize];
//Array.Copy(buffArr, _buffer, picSize);
return _image;
}
else
{
for (int i = 0; i < stFrameInfo.nHeight; i++)
{
for (int j = 0; j < stFrameInfo.nWidth; j++)
{
byte chRed = buffArr[i * stFrameInfo.nWidth * 3 + j * 3];
buffArr[i * stFrameInfo.nWidth * 3 + j * 3] = buffArr[i * stFrameInfo.nWidth * 3 + j * 3 + 2];
buffArr[i * stFrameInfo.nWidth * 3 + j * 3 + 2] = chRed;
}
}
Bitmap _image = new Bitmap(stFrameInfo.nWidth, stFrameInfo.nHeight, stFrameInfo.nWidth * 3, PixelFormat.Format24bppRgb, pImage);
//int picSize = _image.Width * _image.Height * 3;
//byte[] _buffer = new byte[picSize];
//Array.Copy(buffArr, _buffer, picSize);
return DeepClone(_image);
}
}
private Bitmap ImageCapture(int index)
{
lock (cameraCurr[index])
{
MyCamera.MV_FRAME_OUT FrameInfo = new MyCamera.MV_FRAME_OUT();
try
{
int rtn = cameraCurr[index].MV_CC_StartGrabbing_NET();
if (rtn != MyCamera.MV_OK)
{
_errInfo = "Can not grab one : " + rtn;
HDLogUtil.error("CaptureOnImage [" + index + "] error : " + _errInfo);
return null;
}
int nRet = cameraCurr[index].MV_CC_GetImageBuffer_NET(ref FrameInfo, 5000);
var enDstPixelType = FrameInfo.stFrameInfo.enPixelType;
// ch:获取一帧图像 | en:Get one image
if (MyCamera.MV_OK != nRet)
{
return null;
}
if (enDstPixelType == MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8)
{
Bitmap _image = new Bitmap(FrameInfo.stFrameInfo.nWidth, FrameInfo.stFrameInfo.nHeight, FrameInfo.stFrameInfo.nWidth * 1, PixelFormat.Format8bppIndexed, FrameInfo.pBufAddr);
ColorPalette cp = _image.Palette;
for (int i = 0; i < 256; i++)
cp.Entries[i] = Color.FromArgb(i, i, i);
_image.Palette = cp;
//int picSize = _image.Width * _image.Height;
//byte[] _buffer = new byte[picSize];
//Array.Copy(buffArr, _buffer, picSize);
return _image;
}
else
{
var buffArr = new byte[FrameInfo.stFrameInfo.nWidth * FrameInfo.stFrameInfo.nHeight * 3];
Marshal.Copy(FrameInfo.pBufAddr, buffArr, 0, buffArr.Length);
for (int i = 0; i < FrameInfo.stFrameInfo.nHeight; i++)
{
for (int j = 0; j < FrameInfo.stFrameInfo.nWidth; j++)
{
byte chRed = buffArr[i * FrameInfo.stFrameInfo.nWidth * 3 + j * 3];
buffArr[i * FrameInfo.stFrameInfo.nWidth * 3 + j * 3] = buffArr[i * FrameInfo.stFrameInfo.nWidth * 3 + j * 3 + 2];
buffArr[i * FrameInfo.stFrameInfo.nWidth * 3 + j * 3 + 2] = chRed;
}
}
IntPtr pImage = Marshal.UnsafeAddrOfPinnedArrayElement(buffArr, 0);
Bitmap _image = new Bitmap(FrameInfo.stFrameInfo.nWidth, FrameInfo.stFrameInfo.nHeight, FrameInfo.stFrameInfo.nWidth * 3, PixelFormat.Format24bppRgb, pImage);
//int picSize = _image.Width * _image.Height * 3;
//byte[] _buffer = new byte[picSize];
//Array.Copy(buffArr, _buffer, picSize);
//return DeepClone(_image);
return DeepClone(_image);
}
}
catch
{
return null;
}
finally
{
cameraCurr[index].MV_CC_StopGrabbing_NET();
try
{
cameraCurr[index].MV_CC_FreeImageBuffer_NET(ref FrameInfo);
}
catch (Exception ex)
{
HDLogUtil.error(" [" + index + "] MV_CC_FreeImageBuffer_NET 出错:" + ex.ToString());
}
}
}
}
private Bitmap ImageCapture2(int index)
{
MyCamera.MV_FRAME_OUT FrameInfo = new MyCamera.MV_FRAME_OUT();
try
{
int rtn = cameraCurr[index].MV_CC_StartGrabbing_NET();
if (rtn != MyCamera.MV_OK)
{
_errInfo = "Can not grab one : " + rtn;
HDLogUtil.error("CaptureOnImage [" + index + "] error : " + _errInfo);
return null;
}
int nRet = cameraCurr[index].MV_CC_GetImageBuffer_NET(ref FrameInfo, 5000);
// ch:获取一帧图像 | en:Get one image
if (MyCamera.MV_OK == nRet)
{
HDLogUtil.debug("Get Image Buffer:" + "Width[" + Convert.ToString(FrameInfo.stFrameInfo.nWidth) + "] , Height[" + Convert.ToString(FrameInfo.stFrameInfo.nHeight)
+ "] , FrameNum[" + Convert.ToString(FrameInfo.stFrameInfo.nFrameNum) + "]");
Bitmap bmpcopy=null;
try
{
Bitmap bmp;
HDLogUtil.info(FrameInfo.stFrameInfo.enPixelType.ToString());
bmp = new Bitmap(FrameInfo.stFrameInfo.nWidth, FrameInfo.stFrameInfo.nHeight, FrameInfo.stFrameInfo.nWidth * 1, PixelFormat.Format8bppIndexed, FrameInfo.pBufAddr);
ColorPalette pal = bmp.Palette;
for (int i = 0; i <= 255; i++)
{
pal.Entries[i] = Color.FromArgb(i, i, i);
}
bmp.Palette = pal;
bmpcopy = DeepClone(bmp);
bmp.Dispose();
}
catch (Exception ex)
{
HDLogUtil.error(ex.ToString());
}
if (FrameInfo.pBufAddr != IntPtr.Zero)
{
nRet = cameraCurr[index].MV_CC_FreeImageBuffer_NET(ref FrameInfo);
if (nRet != MyCamera.MV_OK)
{
HDLogUtil.error(" [" + index + "] Free Image Buffer fail:" + nRet);
}
}
//return ho_Imagetemp;
return bmpcopy;
}
else
{
HDLogUtil.error(" [" + index + "] MV_CC_GetImageBuffer_NET No data: " + nRet);
}
}
catch (Exception ex)
{
_errInfo = ex.Message;
return null;
}
finally
{
try
{
cameraCurr[index].MV_CC_StopGrabbing_NET();
cameraCurr[index].MV_CC_FreeImageBuffer_NET(ref FrameInfo);
cameraCurr[index].MV_CC_CloseDevice_NET();
}
catch (Exception ex)
{
HDLogUtil.error(" [" + index + "] MV_CC_FreeImageBuffer_NET 出错:" + ex.ToString());
}
}
return null;
}
public static T DeepClone<T>(T _object)
{
try
{
T dstobject;
using (MemoryStream mStream = new MemoryStream())
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(mStream, _object);
mStream.Seek(0, SeekOrigin.Begin);//指定当前流的位置为流的开头。
dstobject = (T)bf.Deserialize(mStream);
mStream.Close();
}
return dstobject;
}
catch (Exception e)
{
HDLogUtil.error("DeepClone" + e.ToString());
return default;
}
}
public override HObject CaptureOnImage(string name, out List<CodeInfo> cc)
{
cc = null;
var r = CaptureOnImage(name, out Bitmap bmp,out List<CodeInfo> code);
bmp.Dispose();
return r;
}
public override HObject CaptureOnImage(string name, out Bitmap bmp,out List<CodeInfo> codeInfos, bool nohalcon=false)
{
codeInfos = null;
HObject hoImage = null;
bmp = null;
Bitmap bmpcopy;
int index = cameraName.FindIndex(s => s == name);
if (index == -1)
{
_errInfo = name + "Not find";
HDLogUtil.error("CaptureOnImage [" + name + "] error : " + _errInfo);
return hoImage;
}
if (cameraCurr[index] != null)
{
HDLogUtil.info("CaptureOnImage [" + name + "] 相机已打开 ");
}
else
{
HDLogUtil.info("CaptureOnImage [" + name + "] 先打开相机 ");
if (!Open(name)) {
CloseAll();
Thread.Sleep(100);
if (!Open(name))
{
HDLogUtil.info("CaptureOnImage [" + name + "] 第二次打开相机失败 ");
return null;
}
}
}
lock (cameraCurr[index])
{
int nRet = 0;
nRet = cameraCurr[index].MV_CC_SetPixelFormat_NET((uint)MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8);
if (MyCamera.MV_OK != nRet)
{
HDLogUtil.error("MV_CC_SetPixelFormat_NET nRet: " + nRet);
}
nRet = cameraCurr[index].MV_CC_SetEnumValue_NET("BinningHorizontal", 1);
if (MyCamera.MV_OK != nRet)
HDLogUtil.error("MV_CC_SetEnumValue_NET BinningHorizontal nRet: " + nRet);
nRet = cameraCurr[index].MV_CC_SetEnumValue_NET("BinningVertical", 1);
if (MyCamera.MV_OK != nRet)
HDLogUtil.error("MV_CC_SetEnumValue_NET BinningVertical nRet: " + nRet);
MyCamera.MV_FRAME_OUT FrameInfo = new MyCamera.MV_FRAME_OUT();
try
{
int rtn = cameraCurr[index].MV_CC_StartGrabbing_NET();
if (rtn != MyCamera.MV_OK)
{
_errInfo = "Can not grab one : " + rtn;
HDLogUtil.error("CaptureOnImage [" + name + "] error : " + _errInfo);
return hoImage;
}
//cameraCurr[index].MV_CC_ClearImageBuffer_NET();
var preLostFrameInfo = GetLostFrame(cameraCurr[index]);
HDLogUtil.info("prelost:" + preLostFrameInfo.ToString());
HDLogUtil.info("CaptureOnImage [" + name + "] MV_CC_StartGrabbing_NET ");
nRet = cameraCurr[index].MV_CC_GetImageBuffer_NET(ref FrameInfo, 6000);
HDLogUtil.info("CaptureOnImage [" + name + "] MV_CC_StartGrabbing_NET:" + nRet);
var pLostFrameInfo = GetLostFrame(cameraCurr[index]);
HDLogUtil.info("prelost:" + pLostFrameInfo.ToString());
// ch:获取一帧图像 | en:Get one image
if (MyCamera.MV_OK == nRet)
{
HDLogUtil.debug("Get Image Buffer:" + "Width[" + Convert.ToString(FrameInfo.stFrameInfo.nWidth) + "] , Height[" + Convert.ToString(FrameInfo.stFrameInfo.nHeight)
+ "] , FrameNum[" + Convert.ToString(FrameInfo.stFrameInfo.nFrameNum) + "]");
//HObject ho_Imagetemp;
if (!nohalcon)
HOperatorSet.GenImage1(out hoImage, "byte", FrameInfo.stFrameInfo.nWidth, FrameInfo.stFrameInfo.nHeight, FrameInfo.pBufAddr);
try
{
HDLogUtil.info(FrameInfo.stFrameInfo.enPixelType.ToString());
bmpcopy = new Bitmap(FrameInfo.stFrameInfo.nWidth, FrameInfo.stFrameInfo.nHeight, FrameInfo.stFrameInfo.nWidth * 1, PixelFormat.Format8bppIndexed, FrameInfo.pBufAddr);
ColorPalette pal = bmpcopy.Palette;
for (int i = 0; i <= 255; i++)
{
pal.Entries[i] = Color.FromArgb(i, i, i);
}
bmpcopy.Palette = pal;
bmp = DeepClone(bmpcopy);
bmpcopy.Dispose();
}
catch (Exception ex)
{
HDLogUtil.error(ex.ToString());
}
if (FrameInfo.pBufAddr != IntPtr.Zero)
{
nRet = cameraCurr[index].MV_CC_FreeImageBuffer_NET(ref FrameInfo);
if (nRet != MyCamera.MV_OK)
{
HDLogUtil.error(" [" + name + "] Free Image Buffer fail:" + nRet);
}
}
//return ho_Imagetemp;
return hoImage;
}
else
{
HDLogUtil.error(" [" + name + "] MV_CC_GetImageBuffer_NET No data: " + nRet);
}
}
catch (Exception ex)
{
_errInfo = ex.Message;
HDLogUtil.error(ex.ToString());
return hoImage;
}
finally
{
cameraCurr[index].MV_CC_StopGrabbing_NET();
try
{
cameraCurr[index].MV_CC_FreeImageBuffer_NET(ref FrameInfo);
}
catch (Exception ex)
{
HDLogUtil.error(" [" + name + "] MV_CC_FreeImageBuffer_NET 出错:" + ex.ToString());
}
}
}
return hoImage;
}
public override bool ProcessOnImage(string name, out object[] result, params Func<string,Bitmap, object>[] func)
{
result = new object[func.Length];
int index = cameraName.FindIndex(s => s == name);
if (index == -1)
{
_errInfo = name + "Not find";
HDLogUtil.error("ProcessOnImage [" + name + "] error : " + _errInfo);
return false;
}
if (cameraCurr[index] != null)
{
}
else
{
HDLogUtil.info("ProcessOnImage [" + name + "] 先打开相机 ");
Open(name);
}
MyCamera.MV_FRAME_OUT FrameInfo = new MyCamera.MV_FRAME_OUT();
try
{
int rtn = cameraCurr[index].MV_CC_StartGrabbing_NET();
if (rtn != MyCamera.MV_OK)
{
_errInfo = "Can not grab one : " + rtn;
HDLogUtil.error("ProcessOnImage [" + name + "] error : " + _errInfo);
return false;
}
//cameraCurr[index].MV_CC_ClearImageBuffer_NET();
var preLostFrameInfo = GetLostFrame(cameraCurr[index]);
HDLogUtil.info("prelost:"+preLostFrameInfo.ToString());
int nRet = cameraCurr[index].MV_CC_GetImageBuffer_NET(ref FrameInfo, 3000);
// ch:获取一帧图像 | en:Get one image
if (MyCamera.MV_OK == nRet)
{
var LostFrameInfo = GetLostFrame(cameraCurr[index]);
HDLogUtil.info("currentlost:" + LostFrameInfo.ToString());
HDLogUtil.debug("Get Image Buffer:" + "Width[" + Convert.ToString(FrameInfo.stFrameInfo.nWidth) + "] , Height[" + Convert.ToString(FrameInfo.stFrameInfo.nHeight)
+ "] , FrameNum[" + Convert.ToString(FrameInfo.stFrameInfo.nFrameNum) + "]");
try
{
//HDLogUtil.info(FrameInfo.stFrameInfo.enPixelType.ToString());
Bitmap bmp = new Bitmap(FrameInfo.stFrameInfo.nWidth, FrameInfo.stFrameInfo.nHeight, FrameInfo.stFrameInfo.nWidth * 1, PixelFormat.Format8bppIndexed, FrameInfo.pBufAddr);
ColorPalette pal = bmp.Palette;
for (int i = 0; i <= 255; i++)
{
pal.Entries[i] = Color.FromArgb(i, i, i);
}
bmp.Palette = pal;
for (int i = 0; i > func.Length; i++) {
try
{
HDLogUtil.info("$func:{i} process");
result[i] = func[i](name,bmp);
}
catch (Exception ex)
{
HDLogUtil.error("$func:{i},"+ex.ToString());
}
}
}
catch (Exception ex)
{
HDLogUtil.error(ex.ToString());
}
if (FrameInfo.pBufAddr != IntPtr.Zero)
{
nRet = cameraCurr[index].MV_CC_FreeImageBuffer_NET(ref FrameInfo);
if (nRet != MyCamera.MV_OK)
{
HDLogUtil.error(" [" + name + "] Free Image Buffer fail:" + nRet);
return false;
}
}
}
else
{
HDLogUtil.error(" [" + name + "] MV_CC_GetImageBuffer_NET No data: " + nRet);
return false;
}
}
catch (Exception ex)
{
_errInfo = ex.Message;
return false;
}
finally
{
cameraCurr[index].MV_CC_StopGrabbing_NET();
try
{
cameraCurr[index].MV_CC_FreeImageBuffer_NET(ref FrameInfo);
}
catch (Exception ex)
{
HDLogUtil.error(" [" + name + "] MV_CC_FreeImageBuffer_NET 出错:" + ex.ToString());
}
Close(index);
}
return true;
}
private LostFrameInfo GetLostFrame(MyCamera _myCamera)
{
MyCamera.MV_ALL_MATCH_INFO pstInfo = new MyCamera.MV_ALL_MATCH_INFO();
LostFrameInfo lostFrameInfo = new LostFrameInfo();
MyCamera.MV_MATCH_INFO_NET_DETECT MV_NetInfo = new MyCamera.MV_MATCH_INFO_NET_DETECT();
pstInfo.nInfoSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(MyCamera.MV_MATCH_INFO_NET_DETECT));
pstInfo.nType = MyCamera.MV_MATCH_TYPE_NET_DETECT;
int size = Marshal.SizeOf(MV_NetInfo);
try
{
pstInfo.pInfo = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(MV_NetInfo, pstInfo.pInfo, false);
_myCamera.MV_CC_GetAllMatchInfo_NET(ref pstInfo);
MV_NetInfo = (MyCamera.MV_MATCH_INFO_NET_DETECT)Marshal.PtrToStructure(pstInfo.pInfo, typeof(MyCamera.MV_MATCH_INFO_NET_DETECT));
lostFrameInfo.SetPara(MV_NetInfo);
}
catch (Exception ex)
{
HDLogUtil.error(ex.ToString());
}
finally
{
Marshal.FreeHGlobal(pstInfo.pInfo);
}
return lostFrameInfo;
}
class LostFrameInfo
{
/// <summary>
/// 已接收数据大小 [统计StartGrabbing和StopGrabbing之间的数据量]
/// </summary>
public long nReviceDataSize;
//Gige
/// <summary>
/// 丢失的包数量
/// </summary>
public long nLostPacketCount;
/// <summary>
/// 丢帧数量
/// </summary>
public uint nLostFrameCount;
public uint nNetRecvFrameCount;
/// <summary>
/// 请求重发包数
/// </summary>
public long nRequestResendPacketCount;
/// <summary>
/// 重发包数
/// </summary>
public long nResendPacketCount;
public override string ToString()
{
return $"nReviceDataSize:{nReviceDataSize}; nLostPacketCount:{nLostPacketCount}; nLostFrameCount:{nLostFrameCount}; nNetRecvFrameCount:{nNetRecvFrameCount}" +
$"; RequestResendPacketCount:{nRequestResendPacketCount}; nResendPacketCount:{nResendPacketCount}";
}
/// <summary>
/// 跟前一个LostFrameInfo做对比
/// </summary>
/// <param name="preLostFrameInfo"></param>
/// <returns></returns>
public bool IsLostFrame(LostFrameInfo preLostFrameInfo)
{
return this.nLostFrameCount > preLostFrameInfo.nLostFrameCount;
}
public bool IsLostFrame()
{
return this.nLostFrameCount > 0 || nLostPacketCount > 0;
}
/// <summary>
/// 跟前一个LostFrameInfo做对比,重影问题就是这个值突然变大
/// </summary>
/// <param name="preLostFrameInfo"></param>
/// <returns></returns>
public bool IsLostPacket(LostFrameInfo preLostFrameInfo)
{
return this.nLostPacketCount > preLostFrameInfo.nLostPacketCount;
}
public bool IsLostPacket()
{
return this.nLostPacketCount > 0 || nLostPacketCount > 0;
}
public void SetPara(MyCamera.MV_MATCH_INFO_NET_DETECT MV_NetInfo)
{
this.nReviceDataSize = MV_NetInfo.nReviceDataSize;
this.nLostPacketCount = MV_NetInfo.nLostPacketCount;
this.nLostFrameCount = MV_NetInfo.nLostFrameCount;
this.nNetRecvFrameCount = MV_NetInfo.nNetRecvFrameCount;
this.nRequestResendPacketCount = MV_NetInfo.nRequestResendPacketCount;
this.nResendPacketCount = MV_NetInfo.nResendPacketCount;
}
}
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern void OutputDebugString(string message);
HalconDotNet.HalconAPI.HClearProcCallBack callback = __OnFreeCallBack;
private static void __OnFreeCallBack(IntPtr pImg)
{
Marshal.FreeHGlobal(pImg);
}
public override List<CodeInfo> GetImageAndIdentifyCode(out Bitmap bitmap)
{
List<CodeInfo> codeInfos= new List<CodeInfo>();
bitmap = null;
HDLogUtil.error("获取图片相机名称:" + cameraName);
if (cameraName==null|| cameraName.Count==0)
{
return codeInfos;
}
bitmap = ImageCapture(0);
return codeInfos;
}
}
}
\ No newline at end of file
using HalconDotNet;
using IDHIKCamera;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Reflection;
namespace CodeLibrary.camera
{
public class HIKIDMVS : ClsCamera
{
static new string cameraName = null;
public override bool Load()
{
try
{
HDLogUtil.error("加载扫码相机:" );
IDHIK.Instance.Load();
List<string> names = IDHIK.Instance.cameraName;
_name = names.ToArray();
IDHIK.Instance.DrawLine = false;
HDLogUtil.error($"加载扫码相机:{string.Join(",", names)}");
if (names != null)
{
// hikNameList.AddRange(names);
//foreach (string name in names)
//{
// LogNet.log.Info("加载到IDHIK相机:" + name);
//}
cameraName = names.Find(s => s.Contains("ID"));
HDLogUtil.error("加载到扫码相机:" + cameraName);
}
}
catch (Exception ex)
{
HDLogUtil.error("解析IDHIK出错:" + ex.StackTrace);
return false;
}
return true;
}
public override bool Open(int index)
{
return IDHIK.Instance.Open(index);
}
public override bool Open(string name)
{
return IDHIK.Instance.Open(name);
}
public override bool OpenAll()
{
return IDHIK.Instance.OpenAll();
}
public override void Close(int index)
{
IDHIK.Instance.Close(index);
}
public override void Close(string name)
{
IDHIK.Instance.Close(name);
}
public override void CloseAll()
{
IDHIK.Instance.CloseAll();
}
public override HObject CaptureOnImage(string name, out List<CodeInfo> cc)
{
Bitmap bitmap = null;
cc = GetImageAndIdentifyCode(out bitmap);
return null;
}
public override HObject CaptureOnImage(string name, out Bitmap bmp,out List<CodeInfo> codeInfos, bool nohalcon = false)
{
codeInfos= GetImageAndIdentifyCode(out bmp);
return null;
}
public override Bitmap GrabOne(int index, PixelType pt = PixelType.MONO8)
{
Bitmap bitmap = null;
_ = GetImageAndIdentifyCode(out bitmap);
return bitmap;
}
public override Bitmap GrabOne(string name, PixelType pt = PixelType.MONO8)
{
Bitmap bitmap = null;
_ = GetImageAndIdentifyCode(out bitmap);
return bitmap;
}
public override Bitmap GrabOneImage(string name, PixelType pt = PixelType.MONO8)
{
Bitmap bitmap = null;
_ = GetImageAndIdentifyCode(out bitmap);
return bitmap;
}
public override bool ProcessOnImage(string name, out object[] result, params Func<string, Bitmap, object>[] func)
{
result = null;
return true;
}
static List<BarcodeInfo> grabOne(out Bitmap bitmap)
{
bitmap = null;
List<BarcodeInfo> barcodeInfos = new List<BarcodeInfo>();
if (string.IsNullOrEmpty(cameraName))
{
return barcodeInfos;
}
try
{
bitmap = (Bitmap)IDHIK.Instance.GrabOne(cameraName, out List<CodeInfo> cc);
if (cc != null)
{
cc.ForEach(c =>
{
barcodeInfos.Add(new BarcodeInfo()
{
Center = new PointF(c.X, c.Y),
Angle = (float)c.Orientation,
CodeType = c.CodeType,
Text = c.CodeStr
});
});
}
}
catch (Exception e)
{
HDLogUtil.error($"{cameraName}取图失败:{e}");
}
return barcodeInfos;
}
public override List<CodeInfo> GetImageAndIdentifyCode(out Bitmap bitmap)
{
bitmap = null;
List<CodeInfo> codeisc = new List<CodeInfo>();
HDLogUtil.error("获取图片相机名称:" + cameraName);
if (string.IsNullOrEmpty(cameraName))
{
return null;
}
try
{
List<CodeInfo> cod = new List<CodeInfo>();
bitmap = (Bitmap)IDHIK.Instance.GrabOne(cameraName, out cod);
cod.ForEach(c =>
{
codeisc.Add(new CodeInfo()
{
CodeStr=c.CodeStr,
CodeType=c.CodeType,
X = c.X,
Y = c.Y,
Orientation= c.Orientation,
});
});
}
catch (Exception e)
{
HDLogUtil.error($"{cameraName}取图失败:{e}");
}
return codeisc;
}
}
public class BarcodeInfo
{
//
// 摘要:
// 文本
public string Text { get; set; }
//
// 摘要:
// 条码类型
public string CodeType { get; set; }
//
// 摘要:
// 中心点
public PointF Center { get; set; }
//
// 摘要:
// 角度,3点钟方向0°,逆时针为正,顺时针为负。
public float Angle { get; set; }
//
// 摘要:
// 条码尺寸大小
public SizeF Size { get; set; }
//
// 摘要:
// 原点垂直于经过中心点的直线的距离
public float Distance { get; set; }
//
// 摘要:
// 副本,深拷贝
public BarcodeInfo Clone()
{
BarcodeInfo barcodeInfo = new BarcodeInfo();
PropertyInfo[] properties = barcodeInfo.GetType().GetProperties();
PropertyInfo[] properties2 = GetType().GetProperties();
for (int i = 0; i < properties.Length; i++)
{
properties[i].SetValue(barcodeInfo, properties2[i].GetValue(this));
}
return barcodeInfo;
}
}
}
using Microsoft.Win32.SafeHandles;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace CodeLibrary
{
public unsafe class EyemDecode
{
public static string codeType = "QR_CODE|DATA_MATRIX";
//public static List<CodeInfo> Decoder(ref Bitmap bmap, string file = null) {
// return Decoder(ref bmap, file);
//}
/// <summary>
/// 识别图像二维码
/// </summary>
/// <param name="bmap">需要手动释放这个bitmap</param>
/// <param name="file">如果传文件的话,bmp传null</param>
/// <returns></returns>
public static List<CodeInfo> Decoder(ref Bitmap bmap, string file = null, int iBlockSize=19, int iRangeC=5, int iSymbolMin=128, int iSymbolMax=215)
{
List<CodeInfo> codelist = new List<CodeInfo>();
try
{
//创建图像引用
EyemImage eyemImage;
BitmapData bitmapData = null;
if (file == null)
{
Rectangle rect = new Rectangle(0, 0, bmap.Width, bmap.Height);
bitmapData = bmap.LockBits(rect, ImageLockMode.ReadOnly, bmap.PixelFormat);
eyemImage = new EyemImage();
eyemImage.ucpImage = bitmapData.Scan0;
eyemImage.iWidth = rect.Width;
eyemImage.iHeight = rect.Height;
eyemImage.iChannels = 1;
eyemImage.iDepth = 0;
}
else
{
eyemImageRead(file, -1, out eyemImage);
}
//创建扫描区域
EyemRect eyemRect = new EyemRect();
eyemRect.iXs = 0;
eyemRect.iYs = 0;
eyemRect.iWidth = eyemImage.iWidth;
eyemRect.iHeight = eyemImage.iHeight;
//string codeType = "QR_CODE|DATA_MATRIX"; //QRCode
int ipNum;
EyemBarCode* tpResults;
DataCodeHandle hObject = null;
try
{
int result = eyemDetectAndDecode(eyemImage, eyemRect, "", codeType, out hObject, out tpResults, out ipNum, false, iBlockSize, iRangeC, iSymbolMin, iSymbolMax);
HDLogUtil.info($"eyemDetectAndDecode:{result},ipNum:{ipNum}");
if (result != 0 || ipNum == 0)
return codelist;
for (int i = 0; i < ipNum; i++)
{
CodeInfo ci = new CodeInfo(Marshal.PtrToStringAnsi(tpResults[i].hText), tpResults[i].iCenterX, tpResults[i].iCenterY);
ci.CodeType = Marshal.PtrToStringAnsi(tpResults[i].hType);
codelist.Add(ci);
}
}
catch (Exception ex) {
HDLogUtil.error($""+ ex.ToString());
}
finally
{
if (hObject != null)
hObject.Dispose();
if (bitmapData != null)
bmap.UnlockBits(bitmapData);
if (file != null)
eyemImageFree(ref eyemImage);
//bmap.Dispose();
}
}
catch (Exception ex)
{
HDLogUtil.error(ex.ToString());
}
//eyemImageFree(eyemImage.ucpImage);
return codelist;
}
//释放解码句柄
private class DataCodeHandle : SafeHandleZeroOrMinusOneIsInvalid
{
public DataCodeHandle() : base(true) { }
protected override bool ReleaseHandle()
{
return eyemDetectAndDecodeFree(handle);
}
}
[DllImport("eyemLib.dll", CharSet = CharSet.None, CallingConvention = CallingConvention.Cdecl)]
private static extern int eyemDetectAndDecode(EyemImage tpImage, EyemRect tpRoi, string fileName, string strCodeType, out DataCodeHandle hObject, out EyemBarCode* tpResults, out int ipNum, bool bUseNiBlack, int iBlockSize, int iRangeC, int iSymbolMin, int iSymbolMax, double dScaleUpAndDown = 1, double dToleErr = 0.5, double dMinorStep = 1.0);
/*
* 参数说明
tpImage 输入图像,可使用”eyemImageRead“接口读取图片(需与“eyemImageFree”配合使用),也可直接创建EyemImage对象。
tpRoi 感兴趣区域,尺寸不能小于iSymbolMax。
fileName 文件名,可不填。
strCodeType 所要识别条码类型,“QRCode|DataMatrix|CODE_128”等等。
hObject 结果释放句柄,配合eyemDetectAndDecodeFree使用
tpResults 识别结果
ipNum 结果数量
bUseNiBlack 使用NiBlack二值化,默认值 false。
iBlockSize 定位块大小(奇数),略大于最大定位块(只二维码),佳世达一般设置为11。
iRangeC 搜索范围,范围越大识别越好时间也相应越长,佳世达一般设置为5。
iSymbolMin 最小二维码尺寸,默认128。
iSymbolMax 最大二维码尺寸,佳世达一般设置为215。
dScaleUpAndDown 缩放,<1表示缩小,>1表示放大,=1表示不缩放
dToleErr 最大允许误差默认50%,越小越严格但可能会识别不到。
dMinorStep 步进,默认1.0。
//返回值
-3 图像不存在
-1 内存不足
0 正常
-100 未识别到条码或参数设置不正确
*/
/// <summary>
/// 读取图像
/// </summary>
/// <param name="filename"></param>
/// <param name="iFalgs"></param>
/// <param name="ucpImage"></param>
/// <returns></returns>
[DllImport("eyemLib.dll", CharSet = CharSet.None, CallingConvention = CallingConvention.Cdecl)]
private static extern int eyemImageRead(string filename, int iFalgs, out EyemImage ucpImage);
/// <summary>
/// 释放图像资源
/// </summary>
/// <param name="eyemImage"></param>
[DllImport("eyemLib.dll", CharSet = CharSet.None, CallingConvention = CallingConvention.Cdecl)]
public static extern void eyemImageFree(ref EyemImage eyemImage);
//释放工具
[DllImport("eyemLib.dll", CharSet = CharSet.None, CallingConvention = CallingConvention.Cdecl)]
private static extern bool eyemDetectAndDecodeFree(IntPtr hObject);
[StructLayout(LayoutKind.Sequential)]
public struct EyemImage
{
/// <summary>
/// 地址
/// </summary>
public IntPtr ucpImage;
/// <summary>
/// 图像内存 x 方向大小
/// </summary>
public int iWidth;
/// <summary>
/// 图像内存 y 方向大小
/// </summary>
public int iHeight;
/// <summary>
/// iDepth:
/// uint8_t 取值范围[0, 255], iDepth = 0(常用,解码图像一般为此种格式)
/// int8_t 取值范围[-128, 127], iDepth = 1
/// uint16_t 取值范围[0, 56635], iDepth = 2(常用,点料机图像一般为此种格式)
/// int16_t 取值范围[-32768, 32767], iDepth = 3
/// int32_t 取值范围[-2147483648, 2147483647], iDepth = 4
/// float_t 取值范围[-3.4028235E38, 3.4028235E38], iDepth = 5
/// double_t 取值范围[-1.7E-308, 1.7E+308], iDepth = 6
/// </summary>
public int iDepth;
/// <summary>
/// 彩色图 iChannels=3或4(比RGB多了Alpha通道),一般为3
/// 灰度图 iChannels = 1
/// </summary>
public int iChannels; // 图像通道数
}
[StructLayout(LayoutKind.Sequential)]
public struct EyemRect
{
public int iXs; // 起始点(左上角) x 坐标
public int iYs; // 起始点(左上角) y 坐标
public int iWidth; // x 方向大小(宽度)
public int iHeight; // y 方向大小(高度)
}
[StructLayout(LayoutKind.Sequential)]
public struct EyemBarCode
{
public double dAngle; // 角度
public int iCenterX; // y坐标
public int iCenterY; // y坐标
public IntPtr hType; // 码类型
public IntPtr hText; // 码内容
}
}
}
using Microsoft.Win32.SafeHandles;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace CodeLibrary
{
public unsafe class EyemDecode2
{
public static string codeType = "QR_CODE|DATA_MATRIX";
public static int Init()
{
if (!File.Exists(".\\darknet\\detect-tiny.cfg") || !File.Exists(".\\darknet\\detect-tiny.weights"))
{
throw new Exception("找不到darknet\\detect-tiny.cfg|detect-tiny.weights");
}
return eyemInitNNDataCodeModel(".\\darknet\\detect-tiny.cfg", ".\\darknet\\detect-tiny.weights", "", "");
}
static EyemDecode2()
{
Init();
}
//public static List<CodeInfo> Decoder(ref Bitmap bmap, string file = null) {
// return Decoder(ref bmap, file);
//}
/// <summary>
/// 识别图像二维码
/// </summary>
/// <param name="bmap">需要手动释放这个bitmap</param>
/// <param name="file">如果传文件的话,bmp传null</param>
/// <returns></returns>
public static List<CodeInfo> Decoder(ref Bitmap bmap, string file = null)
{
List<CodeInfo> codelist = new List<CodeInfo>();
try
{
//创建图像引用
EyemImage eyemImage;
BitmapData bitmapData = null;
if (file == null)
{
Rectangle rect = new Rectangle(0, 0, bmap.Width, bmap.Height);
bitmapData = bmap.LockBits(rect, ImageLockMode.ReadWrite, bmap.PixelFormat);
eyemImage = new EyemImage();
eyemImage.ucpImage = bitmapData.Scan0;
eyemImage.iWidth = rect.Width;
eyemImage.iHeight = rect.Height;
eyemImage.iChannels = 1;
eyemImage.iDepth = 0;
}
else
{
eyemImageRead(file, -1, out eyemImage);
}
//创建扫描区域
EyemRect eyemRect = new EyemRect();
eyemRect.iXs = 0;
eyemRect.iYs = 0;
eyemRect.iWidth = eyemImage.iWidth;
eyemRect.iHeight = eyemImage.iHeight;
//string codeType = "QR_CODE|DATA_MATRIX"; //QRCode
int ipNum;
EyemBarCode* tpResults;
DataCodeHandle hObject = null;
try
{
//EyemImage tpDstImg;
int result = eyemDetectAndDecodeUseNN(eyemImage, eyemRect, out hObject, out tpResults, out ipNum, out _);
// eyemImageFree(ref tpDstImg);
//hObject.Dispose();
//int result = eyemDetectAndDecode(eyemImage, eyemRect, "", codeType, out hObject, out tpResults, out ipNum, false, iBlockSize, iRangeC, iSymbolMin, iSymbolMax);
HDLogUtil.info($"eyemDetectAndDecode:{result},ipNum:{ipNum}");
if (result != 0 || ipNum == 0)
return codelist;
for (int i = 0; i < ipNum; i++)
{
CodeInfo ci = new CodeInfo(Marshal.PtrToStringAnsi(tpResults[i].hText), tpResults[i].iCenterX, tpResults[i].iCenterY);
ci.CodeType = Marshal.PtrToStringAnsi(tpResults[i].hType);
codelist.Add(ci);
}
}
catch (Exception ex) {
HDLogUtil.error($""+ ex.ToString());
}
finally
{
if (hObject != null)
hObject.Dispose();
if (bitmapData != null)
bmap.UnlockBits(bitmapData);
if (file != null)
eyemImageFree(ref eyemImage);
//bmap.Dispose();
}
}
catch (Exception ex)
{
HDLogUtil.error(ex.ToString());
}
//eyemImageFree(eyemImage.ucpImage);
return codelist;
}
//释放解码句柄
public class DataCodeHandle : SafeHandleZeroOrMinusOneIsInvalid
{
public DataCodeHandle() : base(true) { }
protected override bool ReleaseHandle()
{
return eyemDetectAndDecodeFree(handle);
}
}
[DllImport("eyemLib.dll", CharSet = CharSet.None, CallingConvention = CallingConvention.Cdecl)]
private static extern int eyemDetectAndDecode(EyemImage tpImage, EyemRect tpRoi, string fileName, string strCodeType, out DataCodeHandle hObject, out EyemBarCode* tpResults, out int ipNum, bool bUseNiBlack, int iBlockSize, int iRangeC, int iSymbolMin, int iSymbolMax, double dScaleUpAndDown = 1, double dToleErr = 0.5, double dMinorStep = 1.0);
/*
* 参数说明
tpImage 输入图像,可使用”eyemImageRead“接口读取图片(需与“eyemImageFree”配合使用),也可直接创建EyemImage对象。
tpRoi 感兴趣区域,尺寸不能小于iSymbolMax。
fileName 文件名,可不填。
strCodeType 所要识别条码类型,“QRCode|DataMatrix|CODE_128”等等。
hObject 结果释放句柄,配合eyemDetectAndDecodeFree使用
tpResults 识别结果
ipNum 结果数量
bUseNiBlack 使用NiBlack二值化,默认值 false。
iBlockSize 定位块大小(奇数),略大于最大定位块(只二维码),佳世达一般设置为11。
iRangeC 搜索范围,范围越大识别越好时间也相应越长,佳世达一般设置为5。
iSymbolMin 最小二维码尺寸,默认128。
iSymbolMax 最大二维码尺寸,佳世达一般设置为215。
dScaleUpAndDown 缩放,<1表示缩小,>1表示放大,=1表示不缩放
dToleErr 最大允许误差默认50%,越小越严格但可能会识别不到。
dMinorStep 步进,默认1.0。
//返回值
-3 图像不存在
-1 内存不足
0 正常
-100 未识别到条码或参数设置不正确
*/
/// <summary>
/// 读取图像
/// </summary>
/// <param name="filename"></param>
/// <param name="iFalgs"></param>
/// <param name="ucpImage"></param>
/// <returns></returns>
[DllImport("eyemLib.dll", CharSet = CharSet.None, CallingConvention = CallingConvention.Cdecl)]
private static extern int eyemImageRead(string filename, int iFalgs, out EyemImage ucpImage);
/// <summary>
/// 释放图像资源
/// </summary>
/// <param name="eyemImage"></param>
[DllImport("eyemLib.dll", CharSet = CharSet.None, CallingConvention = CallingConvention.Cdecl)]
public static extern void eyemImageFree(ref EyemImage eyemImage);
//释放解码句柄
[DllImport("eyemLib.dll", CharSet = CharSet.None, CallingConvention = CallingConvention.Cdecl)]
private static extern bool eyemDetectAndDecodeFree(IntPtr hObject);
//基于深度学习读码程序(仅支持QR、DataMatrix)
[DllImport("eyemLib.dll", CharSet = CharSet.None, CallingConvention = CallingConvention.Cdecl)]
private static extern int eyemDetectAndDecodeUseNN(EyemImage tpImage, EyemRect tpRoi, out DataCodeHandle hObject, out EyemBarCode* tpResults, out int ipNum, out EyemImage tpDstImg);
//加载模型配置文件
[DllImport("eyemLib.dll", CharSet = CharSet.None, CallingConvention = CallingConvention.Cdecl)]
private static extern int eyemInitNNDataCodeModel(string detectorConfigPath, string detectorModelPath, string superResolutionConfigPath, string superResolutionModelPath);
[StructLayout(LayoutKind.Sequential)]
public struct EyemImage
{
/// <summary>
/// 地址
/// </summary>
public IntPtr ucpImage;
/// <summary>
/// 图像内存 x 方向大小
/// </summary>
public int iWidth;
/// <summary>
/// 图像内存 y 方向大小
/// </summary>
public int iHeight;
/// <summary>
/// iDepth:
/// uint8_t 取值范围[0, 255], iDepth = 0(常用,解码图像一般为此种格式)
/// int8_t 取值范围[-128, 127], iDepth = 1
/// uint16_t 取值范围[0, 56635], iDepth = 2(常用,点料机图像一般为此种格式)
/// int16_t 取值范围[-32768, 32767], iDepth = 3
/// int32_t 取值范围[-2147483648, 2147483647], iDepth = 4
/// float_t 取值范围[-3.4028235E38, 3.4028235E38], iDepth = 5
/// double_t 取值范围[-1.7E-308, 1.7E+308], iDepth = 6
/// </summary>
public int iDepth;
/// <summary>
/// 彩色图 iChannels=3或4(比RGB多了Alpha通道),一般为3
/// 灰度图 iChannels = 1
/// </summary>
public int iChannels; // 图像通道数
}
[StructLayout(LayoutKind.Sequential)]
public struct EyemRect
{
public int iXs; // 起始点(左上角) x 坐标
public int iYs; // 起始点(左上角) y 坐标
public int iWidth; // x 方向大小(宽度)
public int iHeight; // y 方向大小(高度)
}
[StructLayout(LayoutKind.Sequential)]
public struct EyemBarCode
{
public double dAngle; // 角度
public int iCenterX; // y坐标
public int iCenterY; // y坐标
public IntPtr hType; // 码类型
public IntPtr hText; // 码内容
}
}
}
using MvCamCtrl.NET;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace CodeLibrary
{
public class HIKCManager
{ /// <summary>
/// 当前相机
/// </summary>
// private Camera cameraCur = null;
private static Dictionary<string, HIKCameraBean> cameraMap = new Dictionary<string, HIKCameraBean>();
/// <summary>
/// 当前相机
/// </summary>
// private MyCamera cameraCurr;
/// <summary>
/// 所有相机列表
/// </summary>
private static MyCamera.MV_CC_DEVICE_INFO_LIST cameraAll;
/// <summary>
/// 所有相机的名称
/// </summary>
private static List<string> cameraName = new List<string>();
/// <summary>
/// 海康相机
/// </summary>
public HIKCManager()
{
cameraAll = new MyCamera.MV_CC_DEVICE_INFO_LIST();
Load();
}
public static HIKCameraBean GetCamera(string cName)
{
if (cameraMap.ContainsKey(cName))
{
return cameraMap[cName];
}
return null;
}
public static void AddCamera(string name, HIKCameraBean bean)
{
if (cameraMap.ContainsKey(name))
{
cameraMap.Remove(name);
}
cameraMap.Add(name, bean);
}
/// <summary>
/// 错误信息
/// </summary>
public static string ErrInfo { set; get; }
/// <summary>
/// 相机总数
/// </summary>
public static int Count
{
get { return (int)cameraAll.nDeviceNum; }
}
/// <summary>
/// 相机名称,ModelName,SerialNumber
/// </summary>
public static string[] CameraName
{
get
{
if (cameraName == null)
{
cameraName = new List<string>();
}
return cameraName.ToArray();
}
}
/// <summary>
/// 当前相机是否打开
/// </summary>
public static bool IsOpen(string cName)
{
HIKCameraBean bean = GetCamera(cName);
if (bean == null || bean.cameraCur == null)
{
return false;
}
else
{
return true;
}
}
/// <summary>
/// 加载相机
/// </summary>
public static void Load()
{
try
{
int rtn = MyCamera.MV_CC_EnumDevices_NET(MyCamera.MV_GIGE_DEVICE | MyCamera.MV_USB_DEVICE, ref cameraAll);
if (rtn != MyCamera.MV_OK) return;
cameraName.Clear();
string s = "";
for (int i = 0; i < cameraAll.nDeviceNum; i++)
{
MyCamera.MV_CC_DEVICE_INFO device = (MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(cameraAll.pDeviceInfo[i], typeof(MyCamera.MV_CC_DEVICE_INFO));
if (device.nTLayerType == MyCamera.MV_GIGE_DEVICE)
{
IntPtr buffer = Marshal.UnsafeAddrOfPinnedArrayElement(device.SpecialInfo.stGigEInfo, 0);
MyCamera.MV_GIGE_DEVICE_INFO gigeInfo = (MyCamera.MV_GIGE_DEVICE_INFO)Marshal.PtrToStructure(buffer, typeof(MyCamera.MV_GIGE_DEVICE_INFO));
s = "GigE:" + gigeInfo.chModelName + " (" + gigeInfo.chSerialNumber + ")";
}
else if (device.nTLayerType == MyCamera.MV_USB_DEVICE)
{
IntPtr buffer = Marshal.UnsafeAddrOfPinnedArrayElement(device.SpecialInfo.stUsb3VInfo, 0);
MyCamera.MV_USB3_DEVICE_INFO usbInfo = (MyCamera.MV_USB3_DEVICE_INFO)Marshal.PtrToStructure(buffer, typeof(MyCamera.MV_USB3_DEVICE_INFO));
s = "USB:" + usbInfo.chModelName + " (" + usbInfo.chSerialNumber + ")";
}
cameraName.Add(s);
}
}
catch (Exception ex)
{
HDLogUtil.error("HIK Load Error:" + ex.StackTrace);
}
}
/// <summary>
/// 打开指定相机
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public static bool Open(string name)
{
int n = cameraName.FindIndex(s => s == name);
if (n == -1)
return false;
else
{
if (cameraMap.ContainsKey(name))
{
if (cameraMap[name].cameraCur != null)
{
cameraMap[name].Close();
}
cameraMap.Remove(name);
}
if (n < 0 || n >= cameraAll.pDeviceInfo.Length) { return false; }
try
{
MyCamera.MV_CC_DEVICE_INFO device = (MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(cameraAll.pDeviceInfo[n], typeof(MyCamera.MV_CC_DEVICE_INFO));
MyCamera cameraCur = new MyCamera();
HIKCameraBean bean = new HIKCameraBean(cameraCur);
bean.Open(device);
AddCamera(name, bean);
}
catch (Exception ex)
{
ErrInfo = ex.Message;
return false;
}
return true;
}
}
/// <summary>
/// 关闭当前相机
/// </summary>
public static void Close(string cName)
{
HIKCameraBean bean = GetCamera(cName);
if (bean != null && bean.cameraCur != null)
{
bean.cameraCur.MV_CC_CloseDevice_NET();
bean.cameraCur.MV_CC_DestroyDevice_NET();
bean.cameraCur = null;
}
}
public static void CloseAll()
{
foreach (string key in cameraMap.Keys)
{
Close(key);
}
}
/// <summary>
/// 停止抓取数据
/// </summary>
public static void Stop(string cName)
{
HIKCameraBean bean = GetCamera(cName);
if (bean == null || bean.cameraCur != null)
{ return; }
if (bean.cameraCur == null) return;
int rtn = bean.cameraCur.MV_CC_StopGrabbing_NET();
if (rtn != MyCamera.MV_OK) return;
}
/// <summary>
/// 抓取一张图像
/// </summary>
public static Bitmap GrabOne(string cName)
{
HIKCameraBean bean = GetCamera(cName);
if (bean == null || bean.cameraCur != null)
{ return null; }
return bean.GrabOne();
}
/// <summary>
/// 抓取连续图像,触发GrabImage事件
/// </summary>
/// <param name="hWnd"></param>
public static void GrabContinuous(string cName, IntPtr hWnd)
{
HIKCameraBean bean = GetCamera(cName);
if (bean == null || bean.cameraCur != null)
{ return ; }
int rtn = bean.cameraCur.MV_CC_StartGrabbing_NET();
if (rtn != MyCamera.MV_OK) return;
rtn = bean.cameraCur.MV_CC_Display_NET(hWnd);
if (rtn != MyCamera.MV_OK) return;
}
}
}
using MvCamCtrl.NET;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace CodeLibrary
{
public class HIKCameraBean
{
/// <summary>
/// 当前相机
/// </summary>
public MyCamera cameraCur;
/// <summary>
/// 海康相机
/// </summary>
internal HIKCameraBean(MyCamera cameraCur)
{
this.cameraCur = cameraCur;
}
/// <summary>
/// 错误信息
/// </summary>
public string ErrInfo { set; get; }
/// <summary>
/// 当前相机是否打开
/// </summary>
public bool IsOpen
{
get
{
if (cameraCur == null)
return false;
else
return true;
}
}
/// <summary>
/// 相机图像宽度
/// </summary>
public int Width { set; get; }
/// <summary>
/// 相机图像高度
/// </summary>
public int Height { set; get; }
/// <summary>
/// 相机32位缓存
/// </summary>
public byte[] Buffer { get; private set; }
/// <summary>
/// 相机32位图像
/// </summary>
public Bitmap Image { get; private set; }
/// <summary>
/// 打开指定相机
/// </summary>
/// <param name="idx">索引</param>
/// <returns></returns>
public bool Open(MyCamera.MV_CC_DEVICE_INFO device)
{
if (cameraCur == null) return false;
int nRet = cameraCur.MV_CC_CreateDevice_NET(ref device);
if (nRet != MyCamera.MV_OK) return false;
nRet = cameraCur.MV_CC_OpenDevice_NET();
if (nRet != MyCamera.MV_OK)
{
cameraCur.MV_CC_DestroyDevice_NET();
return false;
}
if (device.nTLayerType == MyCamera.MV_GIGE_DEVICE)
{
int nPacketSize = cameraCur.MV_CC_GetOptimalPacketSize_NET();
if (nPacketSize > 0) nRet = cameraCur.MV_CC_SetIntValue_NET("GevSCPSPacketSize", (uint)nPacketSize);
}
cameraCur.MV_CC_SetEnumValue_NET("AcquisitionMode", 2); //工作在连续模式
cameraCur.MV_CC_SetEnumValue_NET("TriggerMode", 0); //连续模式
MyCamera.MVCC_INTVALUE pstValue = new MyCamera.MVCC_INTVALUE();
nRet = cameraCur.MV_CC_GetWidth_NET(ref pstValue);
Width = (int)pstValue.nCurValue;
nRet = cameraCur.MV_CC_GetHeight_NET(ref pstValue);
Height = (int)pstValue.nCurValue;
return true;
}
/// <summary>
/// 关闭当前相机
/// </summary>
public void Close()
{
if (cameraCur != null)
{
cameraCur.MV_CC_CloseDevice_NET();
cameraCur.MV_CC_DestroyDevice_NET();
cameraCur = null;
}
}
/// <summary>
/// 停止抓取数据
/// </summary>
public void Stop()
{
if (cameraCur == null) return;
int rtn = cameraCur.MV_CC_StopGrabbing_NET();
if (rtn != MyCamera.MV_OK) return;
}
/// <summary>
/// 抓取一张图像
/// </summary>
public Bitmap GrabOne()
{
int rtn = cameraCur.MV_CC_StartGrabbing_NET();
if (rtn != MyCamera.MV_OK) return null;
MyCamera.MVCC_INTVALUE stParam = new MyCamera.MVCC_INTVALUE();
rtn = cameraCur.MV_CC_GetIntValue_NET("PayloadSize", ref stParam);
if (rtn != MyCamera.MV_OK) return null;
uint dataSize = stParam.nCurValue;
byte[] dataArr = new byte[dataSize];
uint buffSize = dataSize * 3 + 2048;
byte[] buffArr = new byte[buffSize];
IntPtr pData = Marshal.UnsafeAddrOfPinnedArrayElement(dataArr, 0);
MyCamera.MV_FRAME_OUT_INFO_EX stFrameInfo = new MyCamera.MV_FRAME_OUT_INFO_EX();
rtn = cameraCur.MV_CC_GetOneFrameTimeout_NET(pData, dataSize, ref stFrameInfo, 100000);
if (rtn != MyCamera.MV_OK) return null;
MyCamera.MvGvspPixelType enDstPixelType = stFrameInfo.enPixelType;
switch (stFrameInfo.enPixelType)
{
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono12_Packed:
enDstPixelType = stFrameInfo.enPixelType; break;
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR12_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG12_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB12_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG12_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_YUV422_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_YUV422_YUYV_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_YCBCR411_8_CBYYCRYY:
enDstPixelType = MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed; break;
}
IntPtr pImage = Marshal.UnsafeAddrOfPinnedArrayElement(buffArr, 0);
MyCamera.MV_PIXEL_CONVERT_PARAM stConverPixelParam = new MyCamera.MV_PIXEL_CONVERT_PARAM();
stConverPixelParam.nWidth = stFrameInfo.nWidth;
stConverPixelParam.nHeight = stFrameInfo.nHeight;
stConverPixelParam.pSrcData = pData;
stConverPixelParam.nSrcDataLen = stFrameInfo.nFrameLen;
stConverPixelParam.enSrcPixelType = stFrameInfo.enPixelType;
stConverPixelParam.enDstPixelType = enDstPixelType;
stConverPixelParam.pDstBuffer = pImage;
stConverPixelParam.nDstBufferSize = buffSize;
rtn = cameraCur.MV_CC_ConvertPixelType_NET(ref stConverPixelParam);
if (rtn != MyCamera.MV_OK) return null;
if (enDstPixelType == MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8)
{
Image = new Bitmap(stFrameInfo.nWidth, stFrameInfo.nHeight, stFrameInfo.nWidth * 1, PixelFormat.Format8bppIndexed, pImage);
ColorPalette cp = Image.Palette;
for (int i = 0; i < 256; i++)
cp.Entries[i] = Color.FromArgb(i, i, i);
Image.Palette = cp;
int picSize = Image.Width * Image.Height;
Buffer = new byte[picSize];
Array.Copy(buffArr, Buffer, picSize);
//Rectangle rect = new Rectangle(0, 0, Image.Width, Image.Height);
//BitmapData bmpData = Image.LockBits(rect, ImageLockMode.ReadWrite, Image.PixelFormat);
//IntPtr iPtr = bmpData.Scan0;
//int picSize = Image.Width * Image.Height;
//Buffer = new byte[picSize];
//Marshal.Copy(iPtr, Buffer, 0, picSize);
//Image.UnlockBits(bmpData);
}
else
{
for (int i = 0; i < stFrameInfo.nHeight; i++)
{
for (int j = 0; j < stFrameInfo.nWidth; j++)
{
byte chRed = buffArr[i * stFrameInfo.nWidth * 3 + j * 3];
buffArr[i * stFrameInfo.nWidth * 3 + j * 3] = buffArr[i * stFrameInfo.nWidth * 3 + j * 3 + 2];
buffArr[i * stFrameInfo.nWidth * 3 + j * 3 + 2] = chRed;
}
}
Image = new Bitmap(stFrameInfo.nWidth, stFrameInfo.nHeight, stFrameInfo.nWidth * 3, PixelFormat.Format24bppRgb, pImage);
int picSize = Image.Width * Image.Height * 3;
Buffer = new byte[picSize];
Array.Copy(buffArr, Buffer, picSize);
return Image;
}
rtn = cameraCur.MV_CC_StopGrabbing_NET();
if (rtn != MyCamera.MV_OK)
{
}
return null;
}
/// <summary>
/// 抓取连续图像,触发GrabImage事件
/// </summary>
/// <param name="hWnd"></param>
public void GrabContinuous(IntPtr hWnd)
{
int rtn = cameraCur.MV_CC_StartGrabbing_NET();
if (rtn != MyCamera.MV_OK) return;
rtn = cameraCur.MV_CC_Display_NET(hWnd);
if (rtn != MyCamera.MV_OK) return;
}
}
}
FrmCodeDecode_Text,二维码识别,Qr code recognition
FrmCodeDecode_label4_Text,参数路径,Parameters of the path
FrmCodeDecode_chbUseParam_Text,使用参数,operation parameter
FrmCodeDecode_btnAn_Text,变暗,darken
FrmCodeDecode_btnLight_Text,提亮,brighten
FrmCodeDecode_btnCopyN_Text,复制名称,Copy Name
FrmCodeDecode_label3_Text,条码类型:,Bar code type:
FrmCodeDecode_label2_Text,相机列表:,Camera list:
FrmCodeDecode_btnExit_Text,退出,Exit
FrmCodeDecode_btnCameraImage_Text,相机获取图片,camera image
FrmCodeDecode_lblCount_Text,条码数量:,Barcode number:
FrmCodeDecode_btnClearLog_Text,清理日志,Clear log
FrmCodeDecode_btnDCode_Text,二维码识别,Qr code recognition
FrmCodeDecode_btnLearn_Text,学习,learn
FrmCodeDecode_btnbarCode_Text,一维码识别,One dimensional code recognition
FrmCodeDecode_btnGray_Text,图像转灰,Turning grey
FrmCodeDecode_btnErZhi_Text,二值化,binaryzation 
FrmCodeDecode_btnSelImage_Text,打开本地图片,Open local image
FrmCodeDecode_label1_Text,图片路径,Image path
FrmCodeLearn_Text,条码参数学习,Bar code parameter learning
FrmCodeLearn_chbHalcon_Text,Halcon获取图片,Halcon Get photo
FrmCodeLearn_label4_Text,图片路径,Image path
FrmCodeLearn_btnDelOld_Text,删除旧参数,Delete old parameter
FrmCodeLearn_chbUseCamera_Text,相机获取实时图片,camera image
FrmCodeLearn_btnSelImage_Text,打开本地图片,Open local image
FrmCodeLearn_chbTest_Text,学习结束自动识别测试,Automatic identification test
FrmCodeLearn_btnClearLog_Text,清理日志,Clear log
FrmCodeLearn_lblCount_Text,条码数量:,Barcode number:
FrmCodeLearn_label3_Text,参数路径,Parameters of the path
FrmCodeLearn_label2_Text,类型:,Type:
FrmCodeLearn_label1_Text,相机:,camera:
FrmCodeLearn_btnExit_Text,退出,Exit
FrmCodeLearn_btnStop_Text,结束学习,End of learning
FrmCodeLearn_btnOpen_Text,开始学习,start to learn
selCamera,请先选择相机,Please select camera
selImage,请先选择图片,Please select picture
title,提示,Notice
imageIsNull,获取二维码图片为空,Get the two-dimensional code picture is empty
sureDelete,确定删除文件:,Make sure to delete the file:
FrmCodeDecode_label6_Text,图片识别结果,Image recognition results:
FrmCodeDecode_butt_cameracode_Text,获取相机图片及条码,Obtain camera images and barcodes
FrmCodeDecode_check_issaveimage_Text,是否保存图片,Is Image Save
FrmCodeDecode_button_optionfeil_Text,选择文件夹,Option Folder
\ No newline at end of file
20181123
增加相机本身获取图片的代码,后续扫码都直接从相机中获取图片,然后扫码
20190731
RC29西安三台料仓的二维码使用halcon无法识别,增加zxing的识别方式。
......@@ -152,7 +152,7 @@ namespace OnlineStore.Common
}
catch (Exception e)
{
LogUtil.error("HTTP GET ERROR:" + e.Message, 102);
LogUtil.error("HTTP GET ERROR:" + e, 102);
}
return "";
}
......
......@@ -72,11 +72,11 @@ namespace OnlineStore.Common
}
catch (SocketException se)
{
throw new Exception(se.Message);
throw new Exception(se.ToString());
}
catch (Exception ex)
{
throw new Exception(ex.Message);
throw new Exception(ex.ToString());
}
}
......@@ -93,7 +93,7 @@ namespace OnlineStore.Common
}
catch (Exception ex)
{
throw new Exception(ex.Message);
throw new Exception(ex.ToString());
}
}
......@@ -115,7 +115,7 @@ namespace OnlineStore.Common
}
catch (Exception ex)
{
LogUtil.error( "ReceiveAccept方法,客户端【"+client.AddStr+"】:" + ex.Message);
LogUtil.error( "ReceiveAccept方法,客户端【"+client.AddStr+"】:" + ex);
//throw new Exception(ex.Message);
}
}
......
......@@ -78,7 +78,7 @@ namespace OnlineStore.Common
}
catch (Exception ex)
{
throw new Exception(ex.Message);
throw new Exception(ex.ToString());
}
}
private StringBuilder sb = new StringBuilder(); //这个是用来保存:接收到了的,但是还没有结束的消息
......
......@@ -312,7 +312,7 @@ namespace OnlineStore.Common.util
}
catch (Exception ex)
{
Common.LogUtil.info($"上传smf图片失败,原因:{ex.Message}");
Common.LogUtil.info($"上传smf图片失败,原因:{ex.ToString()}");
}
}
}
......
......@@ -135,7 +135,7 @@ namespace WebApi.Controllers
catch (Exception ex)
{
result.code = 204;
result.status = $"parse error:{ex.Message}";
result.status = $"parse error:{ex}";
LogUtil.error("QueryStatus", ex);
}
......
......@@ -78,7 +78,7 @@ namespace WebApi.Controllers
catch (Exception ex)
{
result.code = 204;
result.status = $"parse error:{ex.Message}";
result.status = $"parse error:{ex}";
LogUtil.error("startRoller", ex);
}
......
......@@ -89,7 +89,7 @@ namespace WebApi.Controllers
catch (Exception ex)
{
result.code = 204;
result.status = $"parse error:{ex.Message}";
result.status = $"parse error:{ex}";
LogUtil.error("stopRoller", ex);
}
......
using CodeLibrary;
using ConfigHelper;
using DeviceLibrary.AutoScanAndLabel;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using OnlineStore.Common;
using System;
......@@ -837,6 +838,7 @@ namespace DeviceLibrary
{
try
{
LogUtil.info("labelParam:" + JsonConvert.SerializeObject(labelParam));
//标签位置
SolidBrush blue = new SolidBrush(Color.DarkBlue);
//料盘中心点
......@@ -858,7 +860,9 @@ namespace DeviceLibrary
g.FillEllipse(red, new Rectangle(centrality, pointsize));
int idnex = 0;
labelParam.NewXYAngle.TryGetValue("IsCodeUsed", out idnex);
Point CalPoint = new Point(labelParam.codeInfos[idnex].X, labelParam.codeInfos[idnex].Y);
Point CalPoint = new Point(point.X, point.Y);
if (idnex>=0)
CalPoint = new Point(labelParam.codeInfos[idnex].X, labelParam.codeInfos[idnex].Y);
g.FillEllipse(blue, new Rectangle(CalPoint, pointsize));
g.FillEllipse(yeelow, new Rectangle(point, pointsize));
g.Save();
......@@ -891,7 +895,7 @@ namespace DeviceLibrary
}
catch (Exception ex)
{
LogUtil.error($"保存新坐标图片失败{ex.Message}");
LogUtil.error($"保存新坐标图片失败{ex}");
}
}
public static Point Customlabeling(LabelParam labelParam, Point centrality, out int angle)
......
......@@ -296,13 +296,14 @@ namespace DeviceLibrary
//计算贴标角度的脉冲值
int labelAxisPos = Config.Label_R_360 / 350 * labelAngle;
LogUtil.info($"完整贴标脉冲{labelAxisPos}");
LogUtil.info($"贴标角度脉冲{labelAxisPos}");
//计算像素点位与中心点的差
Label_p3 = new Point(p.X - Right_Batch_Point.X, p.Y - Right_Batch_Point.Y);
//计算像素*脉冲像素比得到脉冲值+中心点基准脉冲
int xDiff = (int)(Label_p3.X * Config.Cam_Pixel_X_Ratio);
int yDiff = (int)(Label_p3.Y * Config.Cam_Pixel_Y_Ratio);
LogUtil.info($"贴标XY脉冲差:X:{xDiff}={Label_p3.X}*{Config.Cam_Pixel_X_Ratio}, Y:{yDiff}={Label_p3.Y}*{Config.Cam_Pixel_Y_Ratio},");
if (LabelMoveInfo.MoveParam.PlateW == 7)
{
LabelMoveInfo.log("当前盘为7寸");
......
......@@ -50,14 +50,14 @@ namespace DeviceLibrary
LeftShelfNoTray = false;
LeftMoveInfo.NextMoveStep(MoveStep.L03);
CylinderMove(null, IO_Type.LeftStopDown, IO_Type.LeftStopUP);
LeftBatchAxisToP2(true);
LeftBatchAxisToP2(Config.Left_Batch_P2, Config.Left_Batch_P1_speed, IO_VALUE.HIGH);
LeftMoveInfo.log($"批量轴上升到P2位置,第一次提升,LeftStartMovePosition={LeftStartMovePosition}");
step = 1;
break;
//没有这个步骤
case MoveStep.L02:
LeftMoveInfo.NextMoveStep(MoveStep.L03);
LeftBatchAxisToP2(false);
LeftBatchAxisToP2(Config.Left_Batch_P2, Config.Left_Batch_P2_speed, IO_VALUE.HIGH);
LeftMoveInfo.log($"批量轴上升到P2位置,二次提升,LeftStartMovePosition={LeftStartMovePosition}");
break;
//轴下降一点
......@@ -86,11 +86,12 @@ namespace DeviceLibrary
break;
//中间步骤给盘,下降一点,获取盘信息
case MoveStep.L11_ReelPutted:
if (step == 2)
if (step == 2 || RightMoveInfo.MoveStep== MoveStep.Wait)
{
LeftCount++;
LeftMoveInfo.NextMoveStep(MoveStep.L12);
LeftBatchAxisDown();
LeftBatchAxisToP2(Config.Left_Batch_P1, Config.Left_Batch_P1_speed, IO_VALUE.LOW);
//LeftBatchAxisDown();
LabelMoveInfo.MoveParam = LeftMoveInfo.MoveParam.clone();
LeftMoveInfo.log($"左侧料盘已放入,批量轴下降固定值");
}
......@@ -137,8 +138,9 @@ namespace DeviceLibrary
{
if (step == 2)
{
LeftMoveInfo.NextMoveStep(MoveStep.L04);
LeftBatchAxisDown();
LeftMoveInfo.NextMoveStep(MoveStep.L03);
LeftBatchAxisToP2(Config.Left_Batch_P1, Config.Left_Batch_P1_speed, IO_VALUE.LOW);
LeftMoveInfo.log($"贴标完成,批量轴下降固定值");
}
else
......@@ -276,24 +278,14 @@ namespace DeviceLibrary
}
int LeftStartMovePosition = 0;
void LeftBatchAxisToP2(bool isFirstMove = true)
{
int targetP2 = Config.Left_Batch_P2;
int targetSpeed = Config.Left_Batch_P2_speed;
if (!isFirstMove)
void LeftBatchAxisToP2(int target, int Speed, IO_VALUE ioValue)
{
int targetP2 = target;
int targetSpeed = Speed;
int currPosition = Left_Batch_Axis.GetAclPosition();
if (currPosition != -1)
{
//targetP2 = currPosition + Config.Left_Batch_ChangeValue * 80;
if (targetP2 > Config.Left_Batch_P2)
{
targetP2 = Config.Left_Batch_P2;
}
LeftMoveInfo.log("BatchAxisToP2 目标P2: " + targetP2 + "(" + currPosition + ")");
}
targetSpeed = (int)(Config.Left_Batch_P2_speed * 0.7);
}
LeftMoveInfo.TimeOutSeconds = 200;
LeftMoveInfo.CanWhileCount = 0;
// 需要增加定时器,获取验证信号并停止伺服
......@@ -302,7 +294,7 @@ namespace DeviceLibrary
Config.Left_Batch_Axis.TargetPosition = targetP2;
Left_Batch_Axis.AbsMove(null, targetP2, targetSpeed);
//开始检测信号
Left_Batch_Axis.BatchAxisStartCheck(IO_Type.LeftTop_Check, IO_VALUE.HIGH);
Left_Batch_Axis.BatchAxisStartCheck(IO_Type.LeftTop_Check, ioValue);
}
/// <summary>
/// 左批量轴下降到X23对射信号灭
......@@ -333,7 +325,7 @@ namespace DeviceLibrary
{
int currpoint = Left_Batch_Axis.GetAclPosition();
int countPleHight = PlwHight / Config.Right_Batch_ChangeValue * Config.Left_Batch_ChangeValue;
targetP1 = currpoint - countPleHight;
targetP1 = currpoint - countPleHight + 5000;
LeftMoveInfo.log($"出料提升机构,获取到料盘高度脉冲{PlwHight},当前位置{currpoint},计算盘高{countPleHight}");
}
int targetSpeed = Config.Left_Batch_P1_speed;
......
......@@ -9,6 +9,7 @@ using System.Text;
using System.Threading.Tasks;
using System.Threading;
using OnlineStore.Common.util;
using Newtonsoft.Json;
namespace DeviceLibrary
{
......@@ -31,8 +32,9 @@ namespace DeviceLibrary
clampTool.Release();
//复制右侧料盘信息
MiddleMoveInfo.MoveParam = RightMoveInfo.MoveParam.clone();
RightMoveInfo.MoveParam = new LabelParam();
MiddleMoveInfo.log("右侧可以取料,旋转轴/上下轴转到P2点");
MiddleMoveInfo.log($"右侧可以取料,旋转轴/上下轴转到P2点:{JsonConvert.SerializeObject(MiddleMoveInfo.MoveParam)}");
//MiddleMoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.RightArm_Check, IO_VALUE.HIGH));
}
else if (MiddleMoveInfo.IsTimeOut(60))
......@@ -138,8 +140,9 @@ namespace DeviceLibrary
MiddleMoveInfo.NextMoveStep(MoveStep.M08);
CurrentPrintInfo = MiddleMoveInfo.MoveParam.clone();
LabelMoveInfo.NextMoveStep(MoveStep.Lbl_PrintLabel);
LabelMoveInfo.MoveParam = MiddleMoveInfo.MoveParam.clone();
Take_Middle_Axis.AbsMove(MiddleMoveInfo, Config.Take_Middle_P3, Config.Take_Middle_P3_speed);
MiddleMoveInfo.log("左侧允许放料,旋转轴P3");
MiddleMoveInfo.log($"左侧允许放料,旋转轴P3");
}
else
{
......
using CodeLibrary;
using Newtonsoft.Json;
using OnlineStore;
using OnlineStore.Common;
using OnlineStore.Common.util;
......@@ -130,7 +131,7 @@ namespace DeviceLibrary
RightMoveInfo.MoveParam.IsNg = true;
}
else
RightMoveInfo.log($"已完成扫码,等待料盘被取走 Count={x.Count}");
RightMoveInfo.log($"已完成扫码,等待料盘被取走 Count={x.Count},{JsonConvert.SerializeObject(RightMoveInfo.MoveParam)}");
}
RightMoveInfo.NextMoveStep(MoveStep.R10_WaitReelLeave);
}
......
......@@ -38,7 +38,7 @@ namespace DeviceLibrary
Config = (Robot_Config)CSVConfigReader.LoadConfig(Config);
CodeManager.LoadConfig();
IDHIKCamera.LibLogUtil.LogEvent += LibLogUtil_LogEvent;
//IDHIKCamera.LibLogUtil.LogEvent += LibLogUtil_LogEvent;
clampTool = new ClampTool();
if (!clampTool.Open())
......@@ -69,21 +69,22 @@ namespace DeviceLibrary
}
catch (Exception ex)
{
LoadFinishEvent?.Invoke(false, ex.Message);
LoadFinishEvent?.Invoke(false, ex.ToString());
}
}
private static void LibLogUtil_LogEvent(IDHIKCamera.LibLogEventArg libLogEventArg)
{
if (libLogEventArg.Level <= IDHIKCamera.LibLogLevel.Warning)
{
LogUtil.info(libLogEventArg.Msg);
}
else
{
LogUtil.error(libLogEventArg.Msg);
}
}
//private static void LibLogUtil_LogEvent(IDHIKCamera.LibLogEventArg libLogEventArg)
//{
// if (libLogEventArg.Level <= IDHIKCamera.LibLogLevel.Warning)
// {
// LogUtil.info(libLogEventArg.Msg);
// }
// else
// {
// {
// LogUtil.error(libLogEventArg.Msg);
// }
//}
public static void LoadDebug()
{
......
......@@ -36,10 +36,6 @@
<SpecificVersion>False</SpecificVersion>
<HintPath>..\dll\Asa.PrintLabel.dll</HintPath>
</Reference>
<Reference Include="CodeLibrary, Version=1.0.8498.33726, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\dll\CodeLibrary.dll</HintPath>
</Reference>
<Reference Include="ConfigHelper">
<HintPath>..\dll\ConfigHelper.dll</HintPath>
</Reference>
......@@ -166,6 +162,10 @@
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\CodeLibrary\CodeLibrary.csproj">
<Project>{2e0d9598-cb37-46dc-9c9b-d36d4d344451}</Project>
<Name>CodeLibrary</Name>
</ProjectReference>
<ProjectReference Include="..\Common\Common.csproj">
<Project>{43cdd09e-fcf3-4960-a01d-3bbfe9933122}</Project>
<Name>Common</Name>
......
......@@ -193,7 +193,7 @@ namespace DeviceLibrary
}
LogUtil.info($"开始请求ns100服务:识别条码为:{string.Join("##", codes.Select(a=>a.CodeStr+$"@@x:{a.X};y:{a.Y};角度{a.Orientation}"))}");
webResult =NeoSacnRequest(bmp, codes, PlateW);
webResult =NeoSacnRequest(BitmapToBase64(bmp), codes, PlateW);
}
else
{
......
......@@ -2,6 +2,7 @@
using DeviceLibrary;
using HalconDotNet;
using IDHIKCamera;
using Microsoft.Win32;
using Newtonsoft.Json;
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
......@@ -27,7 +28,7 @@ public class RemoteDecodeHelper_mod
static bool IsIDCamera = ConfigHelper.Config.Get<bool>("isStartscanningcode");
static int webclienttimeout = 30 * 1000;
static Process p = new Process();
const string serverhost = "http://127.0.0.1:58137/";
static string serverhost = "http://127.0.0.1:58137/";
public static WebResultCode DecodeRequest(Bitmap bitmap, RemoteDecodeParam remoteDecodeParam)
{
CheckAndRunServer();
......@@ -93,7 +94,7 @@ public class RemoteDecodeHelper_mod
}
#region 扫码相机请求ns100方法
public static WebResultCode NeoSacnRequest(Bitmap bitmap, List<CodeLibrary.CodeInfo> codeInfos,int PlateW)
public static WebResultCode NeoSacnRequest(string bitmapBase64, List<CodeLibrary.CodeInfo> codeInfos,int PlateW)
{
WebResultCode resultCode = null;
try
......@@ -111,7 +112,6 @@ public class RemoteDecodeHelper_mod
CheckAndRunServer();
BitmapData bitmapData = new BitmapData();
string iamgestr = BitmapToBase64(bitmap);
List<BarcodeInfos> barcodeInfos = new List<BarcodeInfos>();
codeInfos.ForEach(c =>
{
......@@ -124,7 +124,7 @@ public class RemoteDecodeHelper_mod
X=c.X, Y=c.Y
});
});
bitmapData.ImageData = iamgestr;
bitmapData.ImageData = bitmapBase64;
bitmapData.BarCodeList = barcodeInfos;
bitmapData.X = RobotManage.Config.Right_Batch_X;
bitmapData.Y = RobotManage.Config.Right_Batch_Y;
......@@ -149,7 +149,7 @@ public class RemoteDecodeHelper_mod
}
catch (Exception ex)
{
LogUtil.error($"请求错误:{ex.Message}");
LogUtil.error($"请求错误:{ex.ToString()}");
}
return resultCode;
}
......@@ -175,7 +175,7 @@ public class RemoteDecodeHelper_mod
}
catch (Exception ex)
{
LogUtil.error($"请求错误:{ex.Message}");
LogUtil.error($"请求错误:{ex}");
}
return resultCode;
}
......@@ -246,7 +246,7 @@ public class RemoteDecodeHelper_mod
}
}
static string BitmapToBase64(Bitmap bitmap)
public static string BitmapToBase64(Bitmap bitmap)
{
using (MemoryStream memoryStream = new MemoryStream())
{
......@@ -298,13 +298,20 @@ public class RemoteDecodeHelper_mod
{
lock (p)
{
var port = (int)Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\NS100\\", "port", 58137);
serverhost = "http://127.0.0.1:" + port + "/";
Process proes = new Process();
var pss = Process.GetProcessesByName("Neo Scan");
if (pss.Length > 0)
try
{
if (pss.Length > 0 && !pss[0].HasExited)
{
LogUtil.info("ns100服务已启动;");
return;
}
}
catch { }
var f = ConfigHelper.Config.Get("Display_GetDataAppPath");
string path = Path.Combine(Application.StartupPath, f);
LogUtil.info("启动ns100服务:"+path);
......@@ -316,13 +323,15 @@ public class RemoteDecodeHelper_mod
p.StartInfo = new ProcessStartInfo(path);
p.StartInfo.Arguments = "hide";
p.Start();
int checkcount = 5;
int checkcount = 15;
while (checkcount > 0)
{
try
{
checkcount--;
Thread.Sleep(1000);
Thread.Sleep(500);
port = (int)Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\NS100\\", "port", 58137);
serverhost = "http://127.0.0.1:" + port + "/";
MyWebClient webClient = new MyWebClient(webclienttimeout);
var s = webClient.DownloadString(serverhost + "alive");
if (s.Trim() == "\"1\"")
......
......@@ -37,19 +37,19 @@ namespace DeviceLibrary
}
catch (ConnectionException e)
{
msg = "Connection Error:" + e.Message;
msg = "Connection Error:" + e;
}
catch (IOException e)
{
msg = "IO Error:" + e.Message;
msg = "IO Error:" + e;
}
catch (ZebraPrinterLanguageUnknownException e)
{
msg = "Connection Error:" + e.Message;
msg = "Connection Error:" + e;
}
catch (Exception e)
{
msg = "Error:" + e.Message;
msg = "Error:" + e;
}
}
else {
......
......@@ -13,6 +13,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DeviceLibrary", "DeviceLibr
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DL.StandardRobots", "DL.StandardRobots\DL.StandardRobots.csproj", "{F85A7412-B5B3-4291-A448-A10564602E1A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeLibrary", "CodeLibrary\CodeLibrary.csproj", "{2E0D9598-CB37-46DC-9C9B-D36D4D344451}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
......@@ -39,6 +41,10 @@ Global
{F85A7412-B5B3-4291-A448-A10564602E1A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F85A7412-B5B3-4291-A448-A10564602E1A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F85A7412-B5B3-4291-A448-A10564602E1A}.Release|Any CPU.Build.0 = Release|Any CPU
{2E0D9598-CB37-46DC-9C9B-D36D4D344451}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2E0D9598-CB37-46DC-9C9B-D36D4D344451}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2E0D9598-CB37-46DC-9C9B-D36D4D344451}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2E0D9598-CB37-46DC-9C9B-D36D4D344451}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
......
此文件类型无法预览
此文件类型无法预览
此文件类型无法预览
此文件类型无法预览
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!