From 993f7a5e7075b1e66d307e2b300b1f7054895e1f Mon Sep 17 00:00:00 2001
From: C3032 <C3032@BC3032>
Date: 星期六, 20 十二月 2025 15:36:20 +0800
Subject: [PATCH] 增强相机界面和图像处理逻辑
---
LB_VisionProcesses/Cameras/HRCamera.cs | 450 +++++++++++++++++++++++++++++++++++++++++--------------
1 files changed, 333 insertions(+), 117 deletions(-)
diff --git a/LB_VisionProcesses/Cameras/HRCamera.cs b/LB_VisionProcesses/Cameras/HRCamera.cs
index 239a4e4..f707aca 100644
--- a/LB_VisionProcesses/Cameras/HRCamera.cs
+++ b/LB_VisionProcesses/Cameras/HRCamera.cs
@@ -1,6 +1,7 @@
锘縰sing MVSDK_Net;
using System;
using System.Collections.Generic;
+using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
@@ -22,6 +23,7 @@
private Thread _grabThread; // 鍥惧儚閲囬泦绾跨▼
private bool _isGrabbing; // 閲囬泦鐘舵�佹爣蹇�
private bool _threadRunning; // 绾跨▼杩愯鏍囧織
+ private bool _handleCreated = false; // 鍙ユ焺鏄惁宸插垱寤�
private Thread _callbackThread; // 鍥炶皟澶勭悊绾跨▼
private List<IMVDefine.IMV_Frame> _frameList; // 鍥惧儚缂撳瓨鍒楄〃
private readonly object _frameLock = new object(); // 甯х紦瀛橀攣
@@ -84,13 +86,14 @@
typeof(IMVDefine.IMV_DeviceInfo));
string cameraInfo = $"{deviceInfo.cameraName}[{deviceInfo.serialNumber}]";
- cameraList.Add(cameraInfo);
+ cameraList.Add(cameraInfo);
}
}
else
{
// 璁板綍鏃ュ織鎴栨姏鍑哄紓甯�
- throw new Exception($"鏋氫妇璁惧澶辫触锛岄敊璇爜锛歿result}");
+ //throw new Exception($"鏋氫妇璁惧澶辫触锛岄敊璇爜锛歿result}");
+ Debug.WriteLine("鏋氫妇璁惧澶辫触锛�");
}
}
catch (Exception ex)
@@ -113,10 +116,19 @@
{
try
{
- // 濡傛灉鐩告満宸叉墦寮�锛屽厛鍏抽棴
- if (_camera != null && _camera.IMV_IsOpen())
+ // 纭繚褰诲簳鍏抽棴鍜屾竻鐞�
+ if (_camera != null)
{
- CloseDevice();
+ if (_camera.IMV_IsOpen())
+ {
+ _camera.IMV_Close();
+ }
+
+ if (_handleCreated)
+ {
+ _camera.IMV_DestroyHandle();
+ _handleCreated = false;
+ }
}
// 鏋氫妇璁惧骞跺尮閰峉N
@@ -143,6 +155,7 @@
{
throw new Exception($"鍒涘缓璁惧鍙ユ焺澶辫触锛岄敊璇爜锛歿result}");
}
+ _handleCreated = true;
// 鎵撳紑璁惧
result = _camera.IMV_Open();
@@ -152,7 +165,7 @@
}
// 璁剧疆璁惧灞炴��
- SN = SN;
+ this.SN = SN;
isGrabbing = false;
// 璁剧疆缂撳瓨涓暟涓�8
@@ -192,6 +205,13 @@
{
System.Diagnostics.Debug.WriteLine($"鍏抽棴鐩告満澶辫触锛岄敊璇爜锛歿result}");
}
+ }
+
+ // 閿�姣佸彞鏌�
+ if (_handleCreated)
+ {
+ _camera.IMV_DestroyHandle();
+ _handleCreated = false;
}
// 閲婃斁璧勬簮
@@ -519,27 +539,27 @@
throw new Exception("鐩告満鏈墦寮�");
}
+ string gainFeature = _camera.IMV_FeatureIsValid("Gain") ? "Gain" : "GainRaw";
+
// 楠岃瘉澧炵泭鑼冨洿
double minGain = 0, maxGain = 0;
- int result = _camera.IMV_GetDoubleFeatureMin("GainRaw", ref minGain);
+ int result = _camera.IMV_GetDoubleFeatureMin(gainFeature, ref minGain);
if (result != IMVDefine.IMV_OK)
{
throw new Exception($"鑾峰彇澧炵泭鏈�灏忓�煎け璐ワ紝閿欒鐮侊細{result}");
}
- result = _camera.IMV_GetDoubleFeatureMax("GainRaw", ref maxGain);
+ result = _camera.IMV_GetDoubleFeatureMax(gainFeature, ref maxGain);
if (result != IMVDefine.IMV_OK)
{
throw new Exception($"鑾峰彇澧炵泭鏈�澶у�煎け璐ワ紝閿欒鐮侊細{result}");
}
- if (gain < minGain || gain > maxGain)
- {
- throw new Exception($"澧炵泭鍊艰秴鍑鸿寖鍥达紝鏈夋晥鑼冨洿锛歿minGain} - {maxGain}");
- }
+ if (gain < minGain) gain = minGain;
+ if (gain > maxGain) gain = maxGain;
// 璁剧疆澧炵泭
- result = _camera.IMV_SetDoubleFeatureValue("GainRaw", gain);
+ result = _camera.IMV_SetDoubleFeatureValue(gainFeature, gain);
if (result != IMVDefine.IMV_OK)
{
throw new Exception($"璁剧疆澧炵泭澶辫触锛岄敊璇爜锛歿result}");
@@ -570,7 +590,8 @@
throw new Exception("鐩告満鏈墦寮�");
}
- int result = _camera.IMV_GetDoubleFeatureValue("GainRaw", ref gain);
+ string gainFeature = _camera.IMV_FeatureIsValid("Gain") ? "Gain" : "GainRaw";
+ int result = _camera.IMV_GetDoubleFeatureValue(gainFeature, ref gain);
return result == IMVDefine.IMV_OK;
}
catch (Exception ex)
@@ -580,46 +601,301 @@
}
}
- // 鍏朵粬鍙傛暟璁剧疆鏂规硶绫讳技锛岃繖閲岀渷鐣ラ儴鍒嗗疄鐜�...
-
+ /// <summary>
+ /// 璁剧疆瑙﹀彂鏋佹��
+ /// </summary>
+ /// <param name="polarity">瑙﹀彂鏋佹��</param>
+ /// <returns>鏄惁鎴愬姛</returns>
+ public override bool SetTriggerPolarity(TriggerPolarity polarity)
+ {
+ try
+ {
+ if (_camera == null || !_camera.IMV_IsOpen()) return false;
+
+ string activation = (polarity == TriggerPolarity.RisingEdge || polarity == TriggerPolarity.HighLevel)
+ ? "RisingEdge" : "FallingEdge";
+
+ int result = _camera.IMV_SetEnumFeatureSymbol("TriggerActivation", activation);
+ return result == IMVDefine.IMV_OK;
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine($"璁剧疆瑙﹀彂鏋佹�уけ璐ワ細{ex.Message}");
+ return false;
+ }
+ }
+
+ /// <summary>
+ /// 鑾峰彇瑙﹀彂鏋佹��
+ /// </summary>
+ /// <param name="polarity">瑙﹀彂鏋佹��</param>
+ /// <returns>鏄惁鎴愬姛</returns>
+ public override bool GetTriggerPolarity(out TriggerPolarity polarity)
+ {
+ polarity = TriggerPolarity.RisingEdge;
+ try
+ {
+ if (_camera == null || !_camera.IMV_IsOpen()) return false;
+
+ IMVDefine.IMV_String activation = new IMVDefine.IMV_String();
+ int result = _camera.IMV_GetEnumFeatureSymbol("TriggerActivation", ref activation);
+ if (result == IMVDefine.IMV_OK)
+ {
+ polarity = activation.str == "RisingEdge" ? TriggerPolarity.RisingEdge : TriggerPolarity.FallingEdge;
+ return true;
+ }
+ return false;
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine($"鑾峰彇瑙﹀彂鏋佹�уけ璐ワ細{ex.Message}");
+ return false;
+ }
+ }
+
+ /// <summary>
+ /// 璁剧疆瑙﹀彂婊ゆ尝鏃堕棿 (us)
+ /// </summary>
+ public override bool SetTriggerFliter(double flitertime)
+ {
+ try
+ {
+ if (_camera == null || !_camera.IMV_IsOpen()) return false;
+
+ // 鍗庣澘鐩告満閫氬父浣跨敤 LineDebouncerTime 鎺у埗婊ゆ尝
+ if (_camera.IMV_FeatureIsValid("LineDebouncerTime"))
+ {
+ int result = _camera.IMV_SetDoubleFeatureValue("LineDebouncerTime", flitertime);
+ return result == IMVDefine.IMV_OK;
+ }
+ return false;
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine($"璁剧疆瑙﹀彂婊ゆ尝澶辫触锛歿ex.Message}");
+ return false;
+ }
+ }
+
+ /// <summary>
+ /// 鑾峰彇瑙﹀彂婊ゆ尝鏃堕棿 (us)
+ /// </summary>
+ public override bool GetTriggerFliter(out double flitertime)
+ {
+ flitertime = 0;
+ try
+ {
+ if (_camera == null || !_camera.IMV_IsOpen()) return false;
+
+ if (_camera.IMV_FeatureIsValid("LineDebouncerTime"))
+ {
+ int result = _camera.IMV_GetDoubleFeatureValue("LineDebouncerTime", ref flitertime);
+ return result == IMVDefine.IMV_OK;
+ }
+ return false;
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine($"鑾峰彇瑙﹀彂婊ゆ尝澶辫触锛歿ex.Message}");
+ return false;
+ }
+ }
+
+ /// <summary>
+ /// 璁剧疆瑙﹀彂寤舵椂 (us)
+ /// </summary>
+ public override bool SetTriggerDelay(double delay)
+ {
+ try
+ {
+ if (_camera == null || !_camera.IMV_IsOpen()) return false;
+
+ if (_camera.IMV_FeatureIsValid("TriggerDelay"))
+ {
+ int result = _camera.IMV_SetDoubleFeatureValue("TriggerDelay", delay);
+ return result == IMVDefine.IMV_OK;
+ }
+ return false;
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine($"璁剧疆瑙﹀彂寤舵椂澶辫触锛歿ex.Message}");
+ return false;
+ }
+ }
+
+ /// <summary>
+ /// 鑾峰彇瑙﹀彂寤舵椂 (us)
+ /// </summary>
+ public override bool GetTriggerDelay(out double delay)
+ {
+ delay = 0;
+ try
+ {
+ if (_camera == null || !_camera.IMV_IsOpen()) return false;
+
+ if (_camera.IMV_FeatureIsValid("TriggerDelay"))
+ {
+ int result = _camera.IMV_GetDoubleFeatureValue("TriggerDelay", ref delay);
+ return result == IMVDefine.IMV_OK;
+ }
+ return false;
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine($"鑾峰彇瑙﹀彂寤舵椂澶辫触锛歿ex.Message}");
+ return false;
+ }
+ }
+
+ /// <summary>
+ /// 璁剧疆淇″彿绾挎ā寮�
+ /// </summary>
+ public override bool SetLineMode(IOLines line, LineMode mode)
+ {
+ try
+ {
+ if (_camera == null || !_camera.IMV_IsOpen()) return false;
+
+ // 閫夋嫨绾胯矾
+ int result = _camera.IMV_SetEnumFeatureSymbol("LineSelector", line.ToString());
+ if (result != IMVDefine.IMV_OK) return false;
+
+ // 璁剧疆妯″紡
+ string lineMode = mode == LineMode.Input ? "Input" : "Output";
+ result = _camera.IMV_SetEnumFeatureSymbol("LineMode", lineMode);
+ return result == IMVDefine.IMV_OK;
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine($"璁剧疆淇″彿绾挎ā寮忓け璐ワ細{ex.Message}");
+ return false;
+ }
+ }
+
+ /// <summary>
+ /// 璁剧疆淇″彿绾跨數骞崇姸鎬�
+ /// </summary>
+ public override bool SetLineStatus(IOLines line, LineStatus linestatus)
+ {
+ try
+ {
+ if (_camera == null || !_camera.IMV_IsOpen()) return false;
+
+ // 浠呭杈撳嚭绾胯矾鏈夋晥
+ int result = _camera.IMV_SetEnumFeatureSymbol("LineSelector", line.ToString());
+ if (result != IMVDefine.IMV_OK) return false;
+
+ bool status = linestatus == LineStatus.Hight;
+ result = _camera.IMV_SetBoolFeatureValue("UserOutputValue", status);
+ return result == IMVDefine.IMV_OK;
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine($"璁剧疆淇″彿绾跨姸鎬佸け璐ワ細{ex.Message}");
+ return false;
+ }
+ }
+
+ /// <summary>
+ /// 鑾峰彇淇″彿绾跨數骞崇姸鎬�
+ /// </summary>
+ public override bool GetLineStatus(IOLines line, out LineStatus lineStatus)
+ {
+ lineStatus = LineStatus.Low;
+ try
+ {
+ if (_camera == null || !_camera.IMV_IsOpen()) return false;
+
+ int result = _camera.IMV_SetEnumFeatureSymbol("LineSelector", line.ToString());
+ if (result != IMVDefine.IMV_OK) return false;
+
+ bool status = false;
+ result = _camera.IMV_GetBoolFeatureValue("LineStatus", ref status);
+ if (result == IMVDefine.IMV_OK)
+ {
+ lineStatus = status ? LineStatus.Hight : LineStatus.Low;
+ return true;
+ }
+ return false;
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine($"鑾峰彇淇″彿绾跨姸鎬佸け璐ワ細{ex.Message}");
+ return false;
+ }
+ }
+
+ /// <summary>
+ /// 鑷姩鐧藉钩琛�
+ /// </summary>
+ public override bool AutoBalanceWhite()
+ {
+ try
+ {
+ if (_camera == null || !_camera.IMV_IsOpen()) return false;
+
+ if (_camera.IMV_FeatureIsValid("BalanceWhiteAuto"))
+ {
+ int result = _camera.IMV_SetEnumFeatureSymbol("BalanceWhiteAuto", "Once");
+ return result == IMVDefine.IMV_OK;
+ }
+ return false;
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine($"鑷姩鐧藉钩琛″け璐ワ細{ex.Message}");
+ return false;
+ }
+ }
+
#endregion
- #region 杈呭姪鏂规硶
-
+ #region 閲囬泦鍜岃浆鎹㈣緟鍔╂柟娉�
+
/// <summary>
/// 鍥惧儚閲囬泦绾跨▼澶勭悊鍑芥暟
/// </summary>
private void GrabThreadProc()
{
- IMVDefine.IMV_Frame frame = new IMVDefine.IMV_Frame();
-
while (_threadRunning)
{
+ IMVDefine.IMV_Frame frame = new IMVDefine.IMV_Frame();
try
{
// 鑾峰彇鍥惧儚甯�
- int result = _camera.IMV_GetFrame(ref frame, 100);
-
+ int result = _camera.IMV_GetFrame(ref frame, 1000);
+
if (result == IMVDefine.IMV_OK)
{
// 澶勭悊鍥惧儚甯�
ProcessFrame(frame);
}
- else if (result != 0x80000001) // 瓒呮椂閿欒浠g爜锛堝父瑙佸�硷級
+ else
{
- // 闈炶秴鏃堕敊璇�
- System.Diagnostics.Debug.WriteLine($"鑾峰彇鍥惧儚甯уけ璐ワ紝閿欒鐮侊細{result}");
+ // 鍗充娇鑾峰彇澶辫触锛屼篃灏濊瘯閲婃斁甯э紝闃叉SDK鍐呴儴缂撳瓨娉勯湶
+ // 娉ㄦ剰锛歠rame鏄瘡娆℃柊寤虹殑锛屽鏋淕etFrame娌″~鍏咃紝杩欓噷閲婃斁搴旇鏄畨鍏ㄧ殑锛堣SDK瀹炵幇鑰屽畾锛�
+ var tempFrame = frame;
+ _camera.IMV_ReleaseFrame(ref tempFrame);
+
+ if ((uint)result != 0x80000001 && result != -119 && result != -102) // 瓒呮椂閿欒浠g爜
+ {
+ // 闈炶秴鏃堕敊璇�
+ System.Diagnostics.Debug.WriteLine($"鑾峰彇鍥惧儚甯уけ璐ワ紝閿欒鐮侊細{result}");
+ Thread.Sleep(10); // 鍑洪敊鏃剁◢浣滅瓑寰�
+ }
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"閲囬泦绾跨▼寮傚父锛歿ex.Message}");
+ Thread.Sleep(10);
}
-
+
Thread.Sleep(1);
}
}
-
+
/// <summary>
/// 澶勭悊鍥惧儚甯�
/// </summary>
@@ -630,26 +906,29 @@
{
// 灏嗗浘鍍忔暟鎹浆鎹负Bitmap
Bitmap bitmap = ConvertFrameToBitmap(frame);
-
+
if (bitmap != null)
{
// 瑙﹀彂鍥惧儚閲囬泦浜嬩欢
CameraEventArgs args = new CameraEventArgs(SN, bitmap);
ImageGrabbed?.Invoke(this, args);
-
+
// 鏇存柊鍥炶皟鍥惧儚
CallBackImg = bitmap;
}
-
- // 閲婃斁甯�
- _camera.IMV_ReleaseFrame(ref frame);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"澶勭悊鍥惧儚甯уけ璐ワ細{ex.Message}");
}
+ finally
+ {
+ // 纭繚鏃犺濡備綍閮介噴鏀惧抚锛岄槻姝㈢紦瀛樺崰婊�
+ var tempFrame = frame;
+ _camera.IMV_ReleaseFrame(ref tempFrame);
+ }
}
-
+
/// <summary>
/// 灏嗗浘鍍忓抚杞崲涓築itmap
/// </summary>
@@ -660,7 +939,7 @@
try
{
Bitmap bitmap = null;
-
+
switch (frame.frameInfo.pixelFormat)
{
case IMVDefine.IMV_EPixelType.gvspPixelMono8:
@@ -674,7 +953,7 @@
bitmap = ConvertToBGR8(frame);
break;
}
-
+
return bitmap;
}
catch (Exception ex)
@@ -683,14 +962,14 @@
return null;
}
}
-
+
/// <summary>
/// 鍒涘缓Mono8鏍煎紡Bitmap
/// </summary>
private Bitmap CreateMono8Bitmap(IMVDefine.IMV_Frame frame)
{
Bitmap bitmap = new Bitmap((int)frame.frameInfo.width, (int)frame.frameInfo.height, PixelFormat.Format8bppIndexed);
-
+
// 璁剧疆鐏板害璋冭壊鏉�
ColorPalette palette = bitmap.Palette;
for (int i = 0; i < 256; i++)
@@ -698,39 +977,39 @@
palette.Entries[i] = Color.FromArgb(i, i, i);
}
bitmap.Palette = palette;
-
+
// 澶嶅埗鍥惧儚鏁版嵁
BitmapData bmpData = bitmap.LockBits(
new Rectangle(0, 0, bitmap.Width, bitmap.Height),
ImageLockMode.WriteOnly,
bitmap.PixelFormat);
-
+
// 浣跨敤CopyMemory API杩涜鍐呭瓨澶嶅埗
CopyMemory(bmpData.Scan0, frame.pData, (uint)Math.Min(frame.frameInfo.size, (uint)(bmpData.Stride * bitmap.Height)));
-
+
bitmap.UnlockBits(bmpData);
return bitmap;
}
-
+
/// <summary>
/// 鍒涘缓BGR8鏍煎紡Bitmap
/// </summary>
private Bitmap CreateBgr8Bitmap(IMVDefine.IMV_Frame frame)
{
Bitmap bitmap = new Bitmap((int)frame.frameInfo.width, (int)frame.frameInfo.height, PixelFormat.Format24bppRgb);
-
+
BitmapData bmpData = bitmap.LockBits(
new Rectangle(0, 0, bitmap.Width, bitmap.Height),
ImageLockMode.WriteOnly,
bitmap.PixelFormat);
-
+
// 浣跨敤CopyMemory API杩涜鍐呭瓨澶嶅埗
CopyMemory(bmpData.Scan0, frame.pData, (uint)Math.Min(frame.frameInfo.size, (uint)(bmpData.Stride * bitmap.Height)));
-
+
bitmap.UnlockBits(bmpData);
return bitmap;
}
-
+
/// <summary>
/// 杞崲涓築GR8鏍煎紡
/// </summary>
@@ -749,10 +1028,10 @@
eDstPixelFormat = IMVDefine.IMV_EPixelType.gvspPixelBGR8,
nDstBufSize = frame.frameInfo.width * frame.frameInfo.height * 3
};
-
+
IntPtr dstBuffer = Marshal.AllocHGlobal((int)convertParam.nDstBufSize);
convertParam.pDstBuf = dstBuffer;
-
+
try
{
int result = _camera.IMV_PixelConvert(ref convertParam);
@@ -767,26 +1046,26 @@
Marshal.FreeHGlobal(dstBuffer);
}
}
-
+
/// <summary>
/// 浠庣紦鍐插尯鍒涘缓BGR8 Bitmap
/// </summary>
private Bitmap CreateBgr8BitmapFromBuffer(IntPtr buffer, uint width, uint height)
{
Bitmap bitmap = new Bitmap((int)width, (int)height, PixelFormat.Format24bppRgb);
-
+
BitmapData bmpData = bitmap.LockBits(
new Rectangle(0, 0, bitmap.Width, bitmap.Height),
ImageLockMode.WriteOnly,
bitmap.PixelFormat);
-
+
// 浣跨敤CopyMemory API杩涜瀹夊叏鐨勫唴瀛樺鍒�
CopyMemory(bmpData.Scan0, buffer, (uint)(width * height * 3));
-
+
bitmap.UnlockBits(bmpData);
return bitmap;
}
-
+
/// <summary>
/// 灏嗚Е鍙戞簮鏋氫妇杞崲涓哄瓧绗︿覆
/// </summary>
@@ -804,7 +1083,7 @@
_ => "Software"
};
}
-
+
/// <summary>
/// 灏嗗瓧绗︿覆杞崲涓鸿Е鍙戞簮鏋氫妇
/// </summary>
@@ -822,72 +1101,9 @@
_ => TriggerSource.Software
};
}
-
+
#endregion
- #region 鏈疄鐜扮殑鎶借薄鏂规硶锛堢畝鍖栫増瀹炵幇锛�
-
- public override bool SetTriggerPolarity(TriggerPolarity polarity)
- {
- // 鍗庣澘鐩告満鍙兘涓嶆敮鎸佽鍔熻兘锛岃繑鍥炴垚鍔�
- return true;
- }
-
- public override bool GetTriggerPolarity(out TriggerPolarity polarity)
- {
- polarity = TriggerPolarity.RisingEdge;
- return true;
- }
-
- public override bool SetTriggerFliter(double flitertime)
- {
- // 鏆備笉鏀寔
- return true;
- }
-
- public override bool GetTriggerFliter(out double flitertime)
- {
- flitertime = 0;
- return true;
- }
-
- public override bool SetTriggerDelay(double delay)
- {
- // 鏆備笉鏀寔
- return true;
- }
-
- public override bool GetTriggerDelay(out double delay)
- {
- delay = 0;
- return true;
- }
-
- public override bool SetLineMode(IOLines line, LineMode mode)
- {
- // 鏆備笉鏀寔
- return true;
- }
-
- public override bool SetLineStatus(IOLines line, LineStatus linestatus)
- {
- // 鏆備笉鏀寔
- return true;
- }
-
- public override bool GetLineStatus(IOLines line, out LineStatus lineStatus)
- {
- lineStatus = LineStatus.Low;
- return true;
- }
-
- public override bool AutoBalanceWhite()
- {
- // 鏆備笉鏀寔鑷姩鐧藉钩琛�
- return true;
- }
-
- #endregion
#region IDisposable瀹炵幇
--
Gitblit v1.9.3