优化代码

This commit is contained in:
2025-09-13 14:21:07 +08:00
parent c54d140107
commit 9ea58bfdad
3 changed files with 13 additions and 129 deletions
+3 -28
View File
@@ -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;
}
}
+10 -93
View File
@@ -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;
}
}
@@ -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;
}