diff --git a/src/ElectronBot.Braincase/ElectronBot.Braincase.csproj b/src/ElectronBot.Braincase/ElectronBot.Braincase.csproj index 0a9c6c4..2328cde 100644 --- a/src/ElectronBot.Braincase/ElectronBot.Braincase.csproj +++ b/src/ElectronBot.Braincase/ElectronBot.Braincase.csproj @@ -261,8 +261,6 @@ - - diff --git a/src/ElectronBot.Braincase/Helpers/EbHelper.cs b/src/ElectronBot.Braincase/Helpers/EbHelper.cs index 2731da7..4248cf4 100644 --- a/src/ElectronBot.Braincase/Helpers/EbHelper.cs +++ b/src/ElectronBot.Braincase/Helpers/EbHelper.cs @@ -1,20 +1,16 @@ using System.Diagnostics; -using System.Drawing; using System.Runtime.InteropServices; using System.Runtime.InteropServices.WindowsRuntime; using System.Text.Json; -using ElectronBot.Braincase.Contracts.Services; using ElectronBot.Braincase.Models; -using Microsoft.Graphics.Canvas; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Media.Imaging; using Services; +using SixLabors.ImageSharp.Processing; using Verdure.ElectronBot.Core.Models; using Windows.Devices.Enumeration; using Windows.Graphics.Imaging; -using Windows.Media.Core; using Windows.Media.Devices; -using Windows.Media.Playback; using Windows.Storage; using Windows.Storage.Streams; @@ -221,7 +217,7 @@ public class EbHelper { var base64Text = action.ImageData; - var data = new byte[240 * 240 * 3]; + var rgbData = new byte[240 * 240 * 3]; if (base64Text != null) { @@ -233,22 +229,35 @@ public class EbHelper var bytes = Convert.FromBase64String(base64Text); - var imageStream = bytes.AsBuffer().AsStream(); + //使用ImageSharp处理帧数据 + using var image = SixLabors.ImageSharp.Image + .Load(bytes); - var image = new Bitmap(imageStream); + image.Mutate(x => + { + x.Resize(240, 240); + }); - var mat = OpenCvSharp.Extensions.BitmapConverter.ToMat(image); + // 获取转换后的数据 + //var rgbData = new byte[image.Width * image.Height * 3]; - var mat1 = mat.Resize(new OpenCvSharp.Size(240, 240), 0, 0, OpenCvSharp.InterpolationFlags.Area); + // 遍历每个像素,将Rgba32转换为Bgr24 + for (var y = 0; y < image.Height; y++) + { + for (var x = 0; x < image.Width; x++) + { + var rgbaPixel = image[x, y]; + var rgbIndex = (y * image.Width + x) * 3; + rgbData[rgbIndex] = rgbaPixel.B; + rgbData[rgbIndex + 1] = rgbaPixel.G; + rgbData[rgbIndex + 2] = rgbaPixel.R; + } + } - var mat2 = mat1.CvtColor(OpenCvSharp.ColorConversionCodes.RGBA2BGR); - var dataMeta = mat2.Data; - - Marshal.Copy(dataMeta, data, 0, 240 * 240 * 3); } var frame = new EmoticonActionFrame( - data, true, action.J1, action.J2, action.J3, action.J4, action.J5, action.J6); + rgbData, true, action.J1, action.J2, action.J3, action.J4, action.J5, action.J6); _ = await service.SendToUsbDeviceAsync(frame); } @@ -279,27 +288,50 @@ public class EbHelper await encoder.FlushAsync(); - using var image = new Bitmap(stream.AsStream()); + byte[] pixelBytes; - var mat = OpenCvSharp.Extensions.BitmapConverter.ToMat(image); + using (DataReader dataReader = new DataReader(stream.GetInputStreamAt(0))) + { + var streamSize = (uint)stream.Size; + await dataReader.LoadAsync(streamSize); + pixelBytes = new byte[streamSize]; + dataReader.ReadBytes(pixelBytes); + } - var mat1 = mat.Resize(new OpenCvSharp.Size(240, 240), 0, 0, OpenCvSharp.InterpolationFlags.Area); + //使用ImageSharp处理帧数据 + using var image = SixLabors.ImageSharp.Image + .LoadPixelData(pixelBytes, + (int)softwareBitmap.PixelWidth, (int)softwareBitmap.PixelHeight); - var mat2 = mat1.CvtColor(OpenCvSharp.ColorConversionCodes.RGBA2BGR); + image.Mutate(x => + { + x.Resize(240, 240); + }); - var dataMeta = mat2.Data; + // 获取转换后的数据 + var rgbData = new byte[image.Width * image.Height * 3]; - var data = new byte[240 * 240 * 3]; + // 遍历每个像素,将Rgba32转换为Bgr24 + for (var y = 0; y < image.Height; y++) + { + for (var x = 0; x < image.Width; x++) + { + var rgbaPixel = image[x, y]; + var rgbIndex = (y * image.Width + x) * 3; + rgbData[rgbIndex] = rgbaPixel.B; + rgbData[rgbIndex + 1] = rgbaPixel.G; + rgbData[rgbIndex + 2] = rgbaPixel.R; + } + } - Marshal.Copy(dataMeta, data, 0, 240 * 240 * 3); - var frame = new EmoticonActionFrame(data, frameData.Enable, + var frame = new EmoticonActionFrame(rgbData, frameData.Enable, frameData.J1, frameData.J2, frameData.J3, frameData.J4, frameData.J5, frameData.J6); var service = Ioc.Default.GetRequiredService(); ElectronBotHelper.Instance.ModelActionInvoke( - new ModelActionFrame(mat2.ToMemoryStream(), + new ModelActionFrame(stream.AsStream(), false, frameData.J1, frameData.J2, frameData.J3, frameData.J4, frameData.J5, frameData.J6)); await service.SendToUsbDeviceAsync(frame); @@ -332,25 +364,47 @@ public class EbHelper await encoder.FlushAsync(); - var image = new Bitmap(stream.AsStream()); + byte[] pixelBytes; - var mat = OpenCvSharp.Extensions.BitmapConverter.ToMat(image); + using (DataReader dataReader = new DataReader(stream.GetInputStreamAt(0))) + { + var streamSize = (uint)stream.Size; + await dataReader.LoadAsync(streamSize); + pixelBytes = new byte[streamSize]; + dataReader.ReadBytes(pixelBytes); + } - var mat1 = mat.Resize(new OpenCvSharp.Size(240, 240), 0, 0, OpenCvSharp.InterpolationFlags.Area); + //使用ImageSharp处理帧数据 + using var image = SixLabors.ImageSharp.Image + .LoadPixelData(pixelBytes, + (int)softwareBitmap.PixelWidth, (int)softwareBitmap.PixelHeight); - var mat2 = mat1.CvtColor(OpenCvSharp.ColorConversionCodes.RGBA2BGR); + image.Mutate(x => + { + x.Resize(240, 240); + }); - var dataMeta = mat2.Data; + // 获取转换后的数据 + var rgbData = new byte[image.Width * image.Height * 3]; - var data = new byte[240 * 240 * 3]; + // 遍历每个像素,将Rgba32转换为Bgr24 + for (var y = 0; y < image.Height; y++) + { + for (var x = 0; x < image.Width; x++) + { + var rgbaPixel = image[x, y]; + var rgbIndex = (y * image.Width + x) * 3; + rgbData[rgbIndex] = rgbaPixel.B; + rgbData[rgbIndex + 1] = rgbaPixel.G; + rgbData[rgbIndex + 2] = rgbaPixel.R; + } + } - Marshal.Copy(dataMeta, data, 0, 240 * 240 * 3); - - var frame = new EmoticonActionFrame(data); + var frame = new EmoticonActionFrame(rgbData); var service = Ioc.Default.GetRequiredService(); - ElectronBotHelper.Instance.ModelActionInvoke(new ModelActionFrame(mat2.ToMemoryStream())); + ElectronBotHelper.Instance.ModelActionInvoke(new ModelActionFrame(stream.AsStream())); await service.SendToUsbDeviceAsync(frame); } @@ -442,7 +496,6 @@ public class EbHelper /// private static async Task SetClockUiToFrameAsync(UIElement element) { - var data = new byte[240 * 240 * 3]; try { var bitmap = new RenderTargetBitmap(); @@ -451,36 +504,41 @@ public class EbHelper var pixels = await bitmap.GetPixelsAsync(); - //var canvasDevice = Ioc.Default.GetRequiredService(); - // Transfer the pixel data from XAML to Win2D for further processing. - using var canvasDevice = new CanvasDevice(); + var pixelBytes = pixels.ToArray(); - using var canvasBitmap = CanvasBitmap.CreateFromBytes( - canvasDevice, pixels.ToArray(), bitmap.PixelWidth, bitmap.PixelHeight, - Windows.Graphics.DirectX.DirectXPixelFormat.B8G8R8A8UIntNormalized); + //使用ImageSharp处理帧数据 + using var image = SixLabors.ImageSharp.Image + .LoadPixelData(pixelBytes, + (int)bitmap.PixelWidth, (int)bitmap.PixelHeight); - using IRandomAccessStream stream = new InMemoryRandomAccessStream(); + image.Mutate(x => + { + x.Resize(240, 240); + }); - await canvasBitmap.SaveAsync(stream, CanvasBitmapFileFormat.Png); + // 获取转换后的数据 + var rgbData = new byte[image.Width * image.Height * 3]; - var image = new Bitmap(stream.AsStream()); - - var mat = OpenCvSharp.Extensions.BitmapConverter.ToMat(image); - - var mat1 = mat.Resize(new OpenCvSharp.Size(240, 240), 0, 0, OpenCvSharp.InterpolationFlags.Area); - - var mat2 = mat1.CvtColor(OpenCvSharp.ColorConversionCodes.RGBA2BGR); - - var dataMeta = mat2.Data; - - Marshal.Copy(dataMeta, data, 0, 240 * 240 * 3); + // 遍历每个像素,将Rgba32转换为Bgr24 + for (var y = 0; y < image.Height; y++) + { + for (var x = 0; x < image.Width; x++) + { + var rgbaPixel = image[x, y]; + var rgbIndex = (y * image.Width + x) * 3; + rgbData[rgbIndex] = rgbaPixel.B; + rgbData[rgbIndex + 1] = rgbaPixel.G; + rgbData[rgbIndex + 2] = rgbaPixel.R; + } + } + return new EmoticonActionFrame(rgbData); } catch (Exception) { - + var data = new byte[240 * 240 * 3]; + return new EmoticonActionFrame(data); } - return new EmoticonActionFrame(data); } /// @@ -531,12 +589,12 @@ public class EbHelper /// public static bool IsVoiceEnabled() { - // 检测Space + E是否被按下 - if ((GetAsyncKeyState(0x20) & 0x8000) != 0 && (GetAsyncKeyState((int)'E') & 0x8000) != 0) - { - return true; - } - return false; + // 检测Space + E是否被按下 + if ((GetAsyncKeyState(0x20) & 0x8000) != 0 && (GetAsyncKeyState((int)'E') & 0x8000) != 0) + { + return true; + } + return false; } /* GitHub Copilot: 键盘虚拟键码是一个0到255之间的整数,用于表示键盘上的每个按键。以下是一些常见按键的虚拟键码: diff --git a/src/ElectronBot.Braincase/Helpers/ElectronBotHelper.cs b/src/ElectronBot.Braincase/Helpers/ElectronBotHelper.cs index 1144005..7f3760a 100644 --- a/src/ElectronBot.Braincase/Helpers/ElectronBotHelper.cs +++ b/src/ElectronBot.Braincase/Helpers/ElectronBotHelper.cs @@ -394,8 +394,8 @@ public class ElectronBotHelper { videoPath = emojis.EmojisVideoPath; } - _ = ElectronBotHelper.Instance.MediaPlayerPlaySoundAsync(videoPath); - await Ioc.Default.GetRequiredService().PlayActionExpressionAsync(emojis, actions); + _ = ElectronBotHelper.Instance.MediaPlayerPlaySoundAsync(videoPath, actions); + //await Ioc.Default.GetRequiredService().PlayActionExpressionAsync(emojis, actions); } catch (Exception) { @@ -466,8 +466,8 @@ public class ElectronBotHelper { videoPath = emojis.EmojisVideoPath; } - _ = ElectronBotHelper.Instance.MediaPlayerPlaySoundAsync(videoPath); - await Ioc.Default.GetRequiredService().PlayActionExpressionAsync(emojis, actions); + _ = ElectronBotHelper.Instance.MediaPlayerPlaySoundAsync(videoPath, actions); + //await Ioc.Default.GetRequiredService().PlayActionExpressionAsync(emojis, actions); } catch (Exception) { diff --git a/src/ElectronBot.Braincase/ViewModels/MainViewModel.cs b/src/ElectronBot.Braincase/ViewModels/MainViewModel.cs index aa9a818..f6a223d 100644 --- a/src/ElectronBot.Braincase/ViewModels/MainViewModel.cs +++ b/src/ElectronBot.Braincase/ViewModels/MainViewModel.cs @@ -703,7 +703,7 @@ public partial class MainViewModel : ObservableRecipient, INavigationAware if (clockName == "GooeyFooter" || clockName == "CustomView" || clockName == "GrooveView") { - _dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 40); + _dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 30); } else { diff --git a/src/ElectronBot.Braincase/Views/ImageCropperPage.xaml.cs b/src/ElectronBot.Braincase/Views/ImageCropperPage.xaml.cs index 540101c..ec746c1 100644 --- a/src/ElectronBot.Braincase/Views/ImageCropperPage.xaml.cs +++ b/src/ElectronBot.Braincase/Views/ImageCropperPage.xaml.cs @@ -1,10 +1,8 @@ using System.Runtime.InteropServices.WindowsRuntime; -using ElectronBot.Braincase.Helpers; using ElectronBot.Braincase.ViewModels; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Media.Imaging; -using Windows.Foundation; using Windows.Graphics.Imaging; using Windows.Storage.Streams;