From 9ea58bfdad789c892fc7521e6ed543735bd5bf9e Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sat, 13 Sep 2025 14:21:07 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/Helpers/CameraService.cs | 31 +----- Ink Canvas/MainWindow_cs/MW_ImageInsert.cs | 103 ++---------------- .../Windows/ScreenshotSelectorWindow.xaml.cs | 8 -- 3 files changed, 13 insertions(+), 129 deletions(-) diff --git a/Ink Canvas/Helpers/CameraService.cs b/Ink Canvas/Helpers/CameraService.cs index 894fe496..0dfc7f15 100644 --- a/Ink Canvas/Helpers/CameraService.cs +++ b/Ink Canvas/Helpers/CameraService.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; -using System.IO; using System.Linq; using System.Windows.Media.Imaging; using System.Windows.Threading; @@ -161,31 +160,17 @@ namespace Ink_Canvas.Helpers lock (_frameLock) { if (_currentFrame == null) - { - LogHelper.WriteLogToFile("GetCurrentFrameAsBitmapSource: _currentFrame为null"); return null; - } try { - LogHelper.WriteLogToFile($"GetCurrentFrameAsBitmapSource: 开始处理帧,类型={_currentFrame.GetType().FullName}"); - LogHelper.WriteLogToFile($"GetCurrentFrameAsBitmapSource: 帧HashCode={_currentFrame.GetHashCode()}"); - - // 验证当前帧的有效性 - var width = _currentFrame.Width; - var height = _currentFrame.Height; - LogHelper.WriteLogToFile($"GetCurrentFrameAsBitmapSource: 当前帧尺寸={width}x{height}"); - // 验证位图有效性 - if (width <= 0 || height <= 0) - { - LogHelper.WriteLogToFile("当前帧无效: 尺寸为0", LogHelper.LogType.Warning); + if (_currentFrame.Width <= 0 || _currentFrame.Height <= 0) return null; - } // 使用更安全的方法转换位图 var bitmapData = _currentFrame.LockBits( - new Rectangle(0, 0, width, height), + new Rectangle(0, 0, _currentFrame.Width, _currentFrame.Height), ImageLockMode.ReadOnly, _currentFrame.PixelFormat); @@ -221,7 +206,6 @@ namespace Ink_Canvas.Helpers bitmapData.Stride); bitmapSource.Freeze(); - LogHelper.WriteLogToFile($"GetCurrentFrameAsBitmapSource: 成功创建BitmapSource"); return bitmapSource; } finally @@ -232,7 +216,6 @@ namespace Ink_Canvas.Helpers catch (Exception ex) { LogHelper.WriteLogToFile($"转换帧为BitmapSource失败: {ex.Message}", LogHelper.LogType.Error); - LogHelper.WriteLogToFile($"异常详情: {ex}", LogHelper.LogType.Error); return null; } } @@ -246,8 +229,6 @@ namespace Ink_Canvas.Helpers { try { - LogHelper.WriteLogToFile($"VideoSource_NewFrame: 接收到新帧"); - lock (_frameLock) { // 释放之前的帧 @@ -255,8 +236,6 @@ namespace Ink_Canvas.Helpers // 创建新的位图,避免Clone的问题 var sourceFrame = eventArgs.Frame; - LogHelper.WriteLogToFile($"VideoSource_NewFrame: 源帧类型={sourceFrame?.GetType().FullName}"); - LogHelper.WriteLogToFile($"VideoSource_NewFrame: 源帧HashCode={sourceFrame?.GetHashCode()}"); if (sourceFrame != null) { @@ -264,7 +243,6 @@ namespace Ink_Canvas.Helpers { var width = sourceFrame.Width; var height = sourceFrame.Height; - LogHelper.WriteLogToFile($"VideoSource_NewFrame: 源帧尺寸={width}x{height}"); if (width > 0 && height > 0) { @@ -273,23 +251,20 @@ namespace Ink_Canvas.Helpers { graphics.DrawImage(sourceFrame, 0, 0); } - LogHelper.WriteLogToFile($"VideoSource_NewFrame: 成功创建新帧,HashCode={_currentFrame.GetHashCode()}"); } else { - LogHelper.WriteLogToFile($"VideoSource_NewFrame: 源帧尺寸无效"); _currentFrame = null; } } catch (Exception frameEx) { - LogHelper.WriteLogToFile($"VideoSource_NewFrame: 处理源帧失败: {frameEx.Message}", LogHelper.LogType.Error); + LogHelper.WriteLogToFile($"处理源帧失败: {frameEx.Message}", LogHelper.LogType.Error); _currentFrame = null; } } else { - LogHelper.WriteLogToFile($"VideoSource_NewFrame: 源帧为null"); _currentFrame = null; } } diff --git a/Ink Canvas/MainWindow_cs/MW_ImageInsert.cs b/Ink Canvas/MainWindow_cs/MW_ImageInsert.cs index b7352fa1..2fe3c83f 100644 --- a/Ink Canvas/MainWindow_cs/MW_ImageInsert.cs +++ b/Ink Canvas/MainWindow_cs/MW_ImageInsert.cs @@ -253,28 +253,9 @@ namespace Ink_Canvas try { // 验证位图有效性 - if (bitmap == null) + if (bitmap == null || bitmap.Width <= 0 || bitmap.Height <= 0) { - ShowNotification("截图数据无效"); - return; - } - - // 添加详细的位图调试信息 - LogHelper.WriteLogToFile($"InsertScreenshotToCanvas: 开始处理位图"); - LogHelper.WriteLogToFile($"位图对象类型: {bitmap.GetType().FullName}"); - LogHelper.WriteLogToFile($"位图对象HashCode: {bitmap.GetHashCode()}"); - - // 检查位图是否已被释放 - try - { - var testWidth = bitmap.Width; - var testHeight = bitmap.Height; - LogHelper.WriteLogToFile($"位图尺寸验证成功: {testWidth}x{testHeight}"); - } - catch (Exception ex) - { - LogHelper.WriteLogToFile($"位图验证失败: {ex.Message}", LogHelper.LogType.Error); - ShowNotification("截图数据已损坏"); + ShowNotification("无效的截图"); return; } @@ -339,6 +320,10 @@ namespace Ink_Canvas ShowNotification($"插入截图失败: {ex.Message}"); LogHelper.WriteLogToFile($"插入截图失败: {ex.Message}", LogHelper.LogType.Error); } + finally + { + bitmap?.Dispose(); + } } // 将BitmapSource插入到画布(用于摄像头截图) @@ -346,8 +331,6 @@ namespace Ink_Canvas { try { - LogHelper.WriteLogToFile($"InsertBitmapSourceToCanvas: 开始处理BitmapSource"); - // 创建WPF Image控件 var image = new Image { @@ -612,31 +595,11 @@ namespace Ink_Canvas { // 验证位图有效性 if (bitmap == null) - { - LogHelper.WriteLogToFile("位图无效: 位图为null", LogHelper.LogType.Warning); return null; - } - // 尝试访问位图属性,如果失败说明位图已损坏 - int width, height; - try - { - width = bitmap.Width; - height = bitmap.Height; - } - catch (Exception ex) - { - LogHelper.WriteLogToFile($"位图已损坏,无法访问属性: {ex.Message}", LogHelper.LogType.Error); + // 验证位图尺寸 + if (bitmap.Width <= 0 || bitmap.Height <= 0) return null; - } - - if (width <= 0 || height <= 0) - { - LogHelper.WriteLogToFile($"位图无效: 尺寸为{width}x{height}", LogHelper.LogType.Warning); - return null; - } - - LogHelper.WriteLogToFile($"开始转换位图: 尺寸={width}x{height}, 格式={bitmap.PixelFormat}, DPI={bitmap.HorizontalResolution}x{bitmap.VerticalResolution}"); // 使用更安全的方法转换位图 var bitmapData = bitmap.LockBits( @@ -646,28 +609,21 @@ namespace Ink_Canvas try { - LogHelper.WriteLogToFile($"LockBits成功: Stride={bitmapData.Stride}, Scan0={bitmapData.Scan0}"); - // 根据像素格式选择合适的WPF像素格式 System.Windows.Media.PixelFormat wpfPixelFormat; switch (bitmap.PixelFormat) { case PixelFormat.Format24bppRgb: wpfPixelFormat = System.Windows.Media.PixelFormats.Bgr24; - LogHelper.WriteLogToFile("使用Bgr24像素格式"); break; case PixelFormat.Format32bppArgb: wpfPixelFormat = System.Windows.Media.PixelFormats.Bgra32; - LogHelper.WriteLogToFile("使用Bgra32像素格式"); break; case PixelFormat.Format32bppRgb: wpfPixelFormat = System.Windows.Media.PixelFormats.Bgr32; - LogHelper.WriteLogToFile("使用Bgr32像素格式"); break; default: - // 默认使用Bgr24,如果格式不匹配则转换 wpfPixelFormat = System.Windows.Media.PixelFormats.Bgr24; - LogHelper.WriteLogToFile($"未知像素格式{bitmap.PixelFormat},使用默认Bgr24"); break; } @@ -683,7 +639,6 @@ namespace Ink_Canvas bitmapData.Stride); bitmapSource.Freeze(); - LogHelper.WriteLogToFile("位图转换成功"); return bitmapSource; } finally @@ -693,24 +648,20 @@ namespace Ink_Canvas } catch (Exception ex) { - LogHelper.WriteLogToFile($"直接转换位图失败: {ex.Message}", LogHelper.LogType.Error); - LogHelper.WriteLogToFile($"异常详情: {ex}", LogHelper.LogType.Error); + LogHelper.WriteLogToFile($"转换位图失败: {ex.Message}", LogHelper.LogType.Error); // 尝试使用备用方法:内存流转换 try { - LogHelper.WriteLogToFile("尝试使用内存流方式转换位图", LogHelper.LogType.Info); return ConvertBitmapToBitmapSourceFallback(bitmap); } catch (Exception fallbackEx) { LogHelper.WriteLogToFile($"备用转换方法也失败: {fallbackEx.Message}", LogHelper.LogType.Error); - LogHelper.WriteLogToFile($"备用方法异常详情: {fallbackEx}", LogHelper.LogType.Error); // 最后尝试:使用最简单的转换方法 try { - LogHelper.WriteLogToFile("尝试最简单的转换方法", LogHelper.LogType.Info); return ConvertBitmapToBitmapSourceSimple(bitmap); } catch (Exception simpleEx) @@ -727,41 +678,21 @@ namespace Ink_Canvas { try { - LogHelper.WriteLogToFile("开始备用转换方法"); - // 验证位图有效性 - if (bitmap == null) - { - LogHelper.WriteLogToFile("备用方法:位图为null", LogHelper.LogType.Warning); + if (bitmap == null || bitmap.Width <= 0 || bitmap.Height <= 0) return null; - } - - if (bitmap.Width <= 0 || bitmap.Height <= 0) - { - LogHelper.WriteLogToFile($"备用方法:位图尺寸无效 {bitmap.Width}x{bitmap.Height}", LogHelper.LogType.Warning); - return null; - } - - LogHelper.WriteLogToFile($"备用方法:位图尺寸={bitmap.Width}x{bitmap.Height}, 格式={bitmap.PixelFormat}"); // 创建一个新的位图,确保格式正确 using (var convertedBitmap = new Bitmap(bitmap.Width, bitmap.Height, PixelFormat.Format24bppRgb)) { - LogHelper.WriteLogToFile("创建转换位图成功"); - using (var graphics = Graphics.FromImage(convertedBitmap)) { - LogHelper.WriteLogToFile("开始绘制到转换位图"); graphics.DrawImage(bitmap, 0, 0); - LogHelper.WriteLogToFile("绘制完成"); } using (var memory = new MemoryStream()) { - LogHelper.WriteLogToFile("开始保存到内存流"); convertedBitmap.Save(memory, ImageFormat.Png); - LogHelper.WriteLogToFile($"保存完成,内存流大小={memory.Length}"); - memory.Position = 0; var bitmapImage = new BitmapImage(); @@ -771,7 +702,6 @@ namespace Ink_Canvas bitmapImage.EndInit(); bitmapImage.Freeze(); - LogHelper.WriteLogToFile("备用转换方法成功"); return bitmapImage; } } @@ -779,7 +709,6 @@ namespace Ink_Canvas catch (Exception ex) { LogHelper.WriteLogToFile($"备用转换方法失败: {ex.Message}", LogHelper.LogType.Error); - LogHelper.WriteLogToFile($"备用方法异常详情: {ex}", LogHelper.LogType.Error); throw; } } @@ -789,25 +718,16 @@ namespace Ink_Canvas { try { - LogHelper.WriteLogToFile("开始简单转换方法"); - if (bitmap == null) - { - LogHelper.WriteLogToFile("简单方法:位图为null", LogHelper.LogType.Warning); return null; - } - - LogHelper.WriteLogToFile($"简单方法:位图尺寸={bitmap.Width}x{bitmap.Height}"); // 使用最基础的方法:直接保存为PNG然后加载 var tempFile = System.IO.Path.GetTempFileName() + ".png"; try { - LogHelper.WriteLogToFile($"保存临时文件到: {tempFile}"); bitmap.Save(tempFile, ImageFormat.Png); - LogHelper.WriteLogToFile("开始加载临时文件"); var bitmapImage = new BitmapImage(); bitmapImage.BeginInit(); bitmapImage.UriSource = new Uri(tempFile); @@ -815,7 +735,6 @@ namespace Ink_Canvas bitmapImage.EndInit(); bitmapImage.Freeze(); - LogHelper.WriteLogToFile("简单转换方法成功"); return bitmapImage; } finally @@ -826,7 +745,6 @@ namespace Ink_Canvas if (System.IO.File.Exists(tempFile)) { System.IO.File.Delete(tempFile); - LogHelper.WriteLogToFile("临时文件已删除"); } } catch (Exception deleteEx) @@ -838,7 +756,6 @@ namespace Ink_Canvas catch (Exception ex) { LogHelper.WriteLogToFile($"简单转换方法失败: {ex.Message}", LogHelper.LogType.Error); - LogHelper.WriteLogToFile($"简单方法异常详情: {ex}", LogHelper.LogType.Error); throw; } } diff --git a/Ink Canvas/Windows/ScreenshotSelectorWindow.xaml.cs b/Ink Canvas/Windows/ScreenshotSelectorWindow.xaml.cs index 7f2f6c72..5a93c484 100644 --- a/Ink Canvas/Windows/ScreenshotSelectorWindow.xaml.cs +++ b/Ink Canvas/Windows/ScreenshotSelectorWindow.xaml.cs @@ -12,7 +12,6 @@ using Ink_Canvas.Helpers; using Brushes = System.Windows.Media.Brushes; using Color = System.Windows.Media.Color; using DrawingRectangle = System.Drawing.Rectangle; -using DrawingPoint = System.Drawing.Point; using WpfPoint = System.Windows.Point; using KeyEventArgs = System.Windows.Input.KeyEventArgs; using MouseEventArgs = System.Windows.Input.MouseEventArgs; @@ -161,10 +160,7 @@ namespace Ink_Canvas { // 验证帧的有效性 if (frame.Width <= 0 || frame.Height <= 0) - { - LogHelper.WriteLogToFile($"无效的摄像头帧: {frame.Width}x{frame.Height}", LogHelper.LogType.Warning); return; - } // 创建新的位图,避免Clone的问题 var clonedFrame = new Bitmap(frame.Width, frame.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb); @@ -217,10 +213,7 @@ namespace Ink_Canvas { // 验证位图有效性 if (bitmap == null || bitmap.Width <= 0 || bitmap.Height <= 0) - { - LogHelper.WriteLogToFile("位图无效: 空位图或尺寸为0", LogHelper.LogType.Warning); return null; - } // 使用更安全的方法转换位图 var bitmapData = bitmap.LockBits( @@ -244,7 +237,6 @@ namespace Ink_Canvas wpfPixelFormat = System.Windows.Media.PixelFormats.Bgr32; break; default: - // 默认使用Bgr24,如果格式不匹配则转换 wpfPixelFormat = System.Windows.Media.PixelFormats.Bgr24; break; }