From 444c62efe4b2cf4894187c1b1f4b86098a0a795a Mon Sep 17 00:00:00 2001 From: zqm Date: Thu, 30 Oct 2025 15:01:57 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=9B=BE=E5=83=8F=E8=B5=84?= =?UTF-8?q?=E6=BA=90=E7=AE=A1=E7=90=86=EF=BC=9A1.=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=E6=97=B6=E5=88=9B=E5=BB=BA512x384=E9=80=8F=E6=98=8Ebi?= =?UTF-8?q?tmap=202.=E4=B8=AD=E9=80=94=E4=B8=8D=E8=BF=9B=E8=A1=8CDispose?= =?UTF-8?q?=E5=92=8C=E8=AE=BE=E7=BD=AE=E4=B8=BAnull=203.=E4=BB=85=E5=9C=A8?= =?UTF-8?q?=E6=8E=A7=E4=BB=B6Dispose=E6=97=B6=E9=87=8A=E6=94=BE=E8=B5=84?= =?UTF-8?q?=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CS/Framework4.0/Toprie/Toprie/Camera.cs | 69 +++++++++++++++---- 1 file changed, 55 insertions(+), 14 deletions(-) diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs b/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs index c008239..43ec5fe 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs @@ -353,27 +353,61 @@ namespace JoyD.Windows.CS.Toprie } /// - /// 初始化图像缓冲区 + /// 初始化图像缓冲区和相关图像资源 /// private void InitializeImageBuffer() { try { - // 创建512*384大小的bitmap作为图像缓冲区 + // 创建512*384大小的透明bitmap作为图像缓冲区 _imageBuffer = new Bitmap(BUFFER_WIDTH, BUFFER_HEIGHT); Console.WriteLine($"图像缓冲区已初始化: {BUFFER_WIDTH}x{BUFFER_HEIGHT}"); - // 初始化缓冲区为黑色背景 + // 初始化缓冲区为透明背景 using (Graphics g = Graphics.FromImage(_imageBuffer)) { - g.Clear(Color.Black); + g.Clear(Color.Transparent); + } + + // 初始化InfoImage为透明bitmap + lock (_infoImageLock) + { + _infoImage = new Bitmap(BUFFER_WIDTH, BUFFER_HEIGHT); + using (Graphics g = Graphics.FromImage(_infoImage)) + { + g.Clear(Color.Transparent); + } + Console.WriteLine("InfoImage已初始化为透明bitmap"); + } + + // 初始化图像框的bitmap为透明 + if (imageBox != null && !imageBox.IsDisposed) + { + imageBox.Image = new Bitmap(BUFFER_WIDTH, BUFFER_HEIGHT); + using (Graphics g = Graphics.FromImage(imageBox.Image)) + { + g.Clear(Color.Transparent); + } + Console.WriteLine("图像框bitmap已初始化为透明"); } } catch (Exception ex) { - Console.WriteLine($"初始化图像缓冲区失败: {ex.Message}"); - // 如果初始化失败,确保_imageBuffer为null - _imageBuffer = null; + Console.WriteLine($"初始化图像资源失败: {ex.Message}"); + // 发生异常时释放已创建的资源 + if (_imageBuffer != null) + { + _imageBuffer.Dispose(); + _imageBuffer = null; + } + lock (_infoImageLock) + { + if (_infoImage != null) + { + _infoImage.Dispose(); + _infoImage = null; + } + } } } @@ -581,15 +615,22 @@ namespace JoyD.Windows.CS.Toprie } // 按照用户要求:收到图像数据后,将图像保存到LastImage中 + // 不释放旧的LastImage,仅在控件Dispose时释放 lock (_lastImageLock) { - // 释放旧的LastImage资源 - if (_lastImage != null) + // 如果是第一次设置LastImage,直接赋值 + if (_lastImage == null) { - try { _lastImage.Dispose(); } catch {} + _lastImage = newImage; + } + else + { + // 后续更新时,使用临时变量保存新图像,然后替换引用 + Image temp = newImage; + newImage = _lastImage; + _lastImage = temp; + // 注意:这里不Dispose旧图像,只在控件Dispose时统一释放 } - // 设置新的LastImage - _lastImage = newImage; } // 按照用户要求:调用更新到UI @@ -697,8 +738,8 @@ namespace JoyD.Windows.CS.Toprie { using (Graphics g = Graphics.FromImage(_imageBuffer)) { - // 清除缓冲区背景为黑色 - g.Clear(Color.Black); + // 清除缓冲区背景为透明色 + g.Clear(Color.Transparent); // 步骤1:先将LastImage绘制到全局缓冲 if (lastImage != null)