using System; using System.Collections.Generic; using System.IO; using System.Drawing.Imaging; using System.Runtime.InteropServices; using System.Drawing; namespace SRCSharpDemo { public class SRCSharpTools { private Dictionary> translations = new Dictionary>(); public string currentDir; private string translateCountry; public SRCSharpTools() { } #region language public void IniLanguageLoader(int translateMode) { SetTranslateMode(translateMode); LoadTranslateIni(); } public void SetTranslateMode(int translateMode) { if (translateMode == 0) { translateCountry = "CHINESE"; } else if (translateMode == 2) { translateCountry = "KOREAN"; } else { translateCountry = "ENGLISH"; } } private void LoadTranslateIni() { currentDir = Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName); string translateIniPath = currentDir + "//Language.ini"; if (!File.Exists(translateIniPath)) { Console.WriteLine("Error: INI file not found!"); return; } string currentLanguage = null; foreach (var line in File.ReadAllLines(translateIniPath)) { string trimmed = line.Trim(); if (string.IsNullOrEmpty(trimmed) || trimmed.StartsWith(";")) continue; if (trimmed.StartsWith("[") && trimmed.EndsWith("]")) { currentLanguage = trimmed.Trim('[', ']'); if (!translations.ContainsKey(currentLanguage)) { translations[currentLanguage] = new Dictionary(); } } else if (currentLanguage != null && trimmed.Contains("=")) { int index = trimmed.IndexOf('='); if (index > 0) //Make sure '=' exists { string key = trimmed.Substring(0, index).Trim(); string value = trimmed.Substring(index + 1).Trim(); translations[currentLanguage][key] = value; } } } } public string GetTranslationF(string key, string language = "ENGLISH", string defaultValue = "Translation not found") { if (translations.ContainsKey(language) && translations[language].ContainsKey(key)) { return translations[language][key]; } return defaultValue; } public string GetTranslation(string key, string defaultValue = "Translation not found") { //if (translations.ContainsKey(translateCountry) && translations[translateCountry].ContainsKey(key)) //{ // return translations[translateCountry][key]; //} return defaultValue; } #endregion #region show image public Bitmap CreateBitmapFromChannels(byte[] pR, byte[] pG, byte[] pB, int width, int height) { int nTotalPoints = width * height; byte[] pRGBData = new byte[width * height * 3]; // 24-bit RGB // Merge R, G, B into RGB array for (int i = 0; i < nTotalPoints; i++) { pRGBData[i * 3 + 0] = pB[i]; // Blue pRGBData[i * 3 + 1] = pG[i]; // Green pRGBData[i * 3 + 2] = pR[i]; // Red } Bitmap bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb); BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb); // Copy data to Bitmap Marshal.Copy(pRGBData, 0, bmpData.Scan0, pRGBData.Length); bmp.UnlockBits(bmpData); return bmp; } public Bitmap ByteArrayToGrayBitmap(byte[] imageData, int width, int height) { Bitmap bmp = new Bitmap(width, height, PixelFormat.Format8bppIndexed); // 获取 Bitmap 数据 BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed); // 复制数据 IntPtr ptr = bmpData.Scan0; int stride = bmpData.Stride; byte[] newData = new byte[stride * height]; // 把数据按行复制到新数组 for (int y = 0; y < height; y++) { Array.Copy(imageData, y * width, newData, y * stride, width); } Marshal.Copy(newData, 0, ptr, newData.Length); bmp.UnlockBits(bmpData); // 调整颜色表,确保正确显示灰度图 ColorPalette palette = bmp.Palette; for (int i = 0; i < 256; i++) { palette.Entries[i] = Color.FromArgb(i, i, i); } bmp.Palette = palette; return bmp; } #endregion #region SetSetting item public List GetSettingParams() { List veParams = new List(); //veParams.Add(GetTranslation("SETTING_TRIG_MODE")); //veParams.Add(GetTranslation("SETTING_SAMPLED_CYCLE")); //veParams.Add(GetTranslation("SETTING_BATCH_ON_OFF")); //veParams.Add(GetTranslation("SETTING_ENCODER_TYPE")); //veParams.Add(GetTranslation("SETTING_ENCODER_INPUTMODE")); //veParams.Add(GetTranslation("SETTING_REFINING_POINTS")); //veParams.Add(GetTranslation("SETTING_BATCH_POINT")); //veParams.Add(GetTranslation("SETTING_CYCLICAL_PATTERN")); //veParams.Add(GetTranslation("SETTING_BATCH_OUTPUT")); //veParams.Add(GetTranslation("SETTING_Z_MEASURING_RANGE")); //veParams.Add(GetTranslation("SETTING_SENSITIVITY")); //veParams.Add(GetTranslation("SETTING_EXP_TIME")); //veParams.Add(GetTranslation("SETTING_LIGHT_CONTROL")); //veParams.Add(GetTranslation("SETTING_LIGHT_MAX")); //veParams.Add(GetTranslation("SETTING_LIGHT_MIN")); //veParams.Add(GetTranslation("SETTING_PEAK_SENSITIVITY")); //veParams.Add(GetTranslation("SETTING_PEAK_SELECT")); //veParams.Add(GetTranslation("SETTING_X_SAMPLING")); //veParams.Add(GetTranslation("SETTING_FILTER_X_MEDIAN")); //veParams.Add(GetTranslation("SETTING_FILTER_X_SMOOTH")); //veParams.Add(GetTranslation("SETTING_FILTER_Y_MEDIAN")); //veParams.Add(GetTranslation("SETTING_FILTER_Y_SMOOTH")); //veParams.Add(GetTranslation("SETTING_CHANGE_3D_25D")); //veParams.Add(GetTranslation("SETTING_X_PIXEL")); //veParams.Add(GetTranslation("SETTING_X_PITCH")); return veParams; } #endregion } }