From 3e87ed4f9b715c8e400f2a6009bbabb78027613b Mon Sep 17 00:00:00 2001 From: unknown <2564608840@qq.com> Date: Wed, 16 Jul 2025 09:49:41 +0800 Subject: [PATCH] =?UTF-8?q?add:=E5=A2=A8=E8=BF=B9=E5=85=A8=E5=B1=8F?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=20#79?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/MainWindow.xaml | 11 +++ .../MainWindow_cs/MW_Save&OpenStrokes.cs | 76 ++++++++++++++++++- Ink Canvas/MainWindow_cs/MW_Settings.cs | 6 ++ Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs | 2 + Ink Canvas/Resources/Settings.cs | 3 + 5 files changed, 96 insertions(+), 2 deletions(-) diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml index 197d77a4..7f9a583c 100644 --- a/Ink Canvas/MainWindow.xaml +++ b/Ink Canvas/MainWindow.xaml @@ -2335,6 +2335,17 @@ FontFamily="Microsoft YaHei UI" FontWeight="Bold" Toggled="ToggleSwitchAutoSaveStrokesAtScreenshot_Toggled" /> + + + + + + + diff --git a/Ink Canvas/MainWindow_cs/MW_Save&OpenStrokes.cs b/Ink Canvas/MainWindow_cs/MW_Save&OpenStrokes.cs index abada6e0..17d5356e 100644 --- a/Ink Canvas/MainWindow_cs/MW_Save&OpenStrokes.cs +++ b/Ink Canvas/MainWindow_cs/MW_Save&OpenStrokes.cs @@ -6,6 +6,10 @@ using System.Windows; using System.Windows.Ink; using System.Windows.Input; using File = System.IO.File; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Forms; +using OpenFileDialog = Microsoft.Win32.OpenFileDialog; namespace Ink_Canvas { public partial class MainWindow : Window { @@ -33,9 +37,77 @@ namespace Ink_Canvas { else //savePathWithName = savePath + @"\" + DateTime.Now.ToString("u").Replace(':', '-') + ".icstk"; savePathWithName = savePath + @"\" + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss-fff") + ".icstk"; + var fs = new FileStream(savePathWithName, FileMode.Create); - inkCanvas.Strokes.Save(fs); - if (newNotice) ShowNotification("墨迹成功保存至 " + savePathWithName); + + if (Settings.Automation.IsSaveFullPageStrokes) + { + // 全页面保存模式 - 保存整个墨迹页面的图像 + var bitmap = new System.Drawing.Bitmap( + (int)System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width, + (int)System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height); + + using (var g = System.Drawing.Graphics.FromImage(bitmap)) + { + // 创建黑色或透明背景 + System.Drawing.Color bgColor = Settings.Canvas.UsingWhiteboard + ? System.Drawing.Color.White + : System.Drawing.Color.FromArgb(22, 41, 36); // 黑板背景色 + g.Clear(bgColor); + + // 将InkCanvas墨迹渲染到Visual + var visual = new DrawingVisual(); + using (var dc = visual.RenderOpen()) + { + // 创建一个VisualBrush,使用inkCanvas作为源 + var visualBrush = new VisualBrush(inkCanvas); + // 绘制矩形并填充为inkCanvas的内容 + dc.DrawRectangle(visualBrush, null, new Rect(0, 0, inkCanvas.ActualWidth, inkCanvas.ActualHeight)); + } + + // 创建适合墨迹画布尺寸的渲染位图 + var rtb = new RenderTargetBitmap( + (int)inkCanvas.ActualWidth, (int)inkCanvas.ActualHeight, + 96, 96, + PixelFormats.Pbgra32); + rtb.Render(visual); + + // 转换为GDI+ Bitmap并保存 + var encoder = new PngBitmapEncoder(); + encoder.Frames.Add(BitmapFrame.Create(rtb)); + + using (var ms = new MemoryStream()) + { + encoder.Save(ms); + ms.Seek(0, SeekOrigin.Begin); + var imgBitmap = new System.Drawing.Bitmap(ms); + + // 将生成的墨迹图像绘制到屏幕截图上 + // 居中绘制,确保墨迹位于屏幕中央 + int x = (bitmap.Width - imgBitmap.Width) / 2; + int y = (bitmap.Height - imgBitmap.Height) / 2; + g.DrawImage(imgBitmap, x, y); + + // 保存为PNG + string imagePathWithName = Path.ChangeExtension(savePathWithName, "png"); + bitmap.Save(imagePathWithName, System.Drawing.Imaging.ImageFormat.Png); + + // 仍然保存墨迹文件以兼容旧版本 + inkCanvas.Strokes.Save(fs); + } + } + + // 显示提示 + if (newNotice) ShowNotification("墨迹成功全页面保存至 " + Path.ChangeExtension(savePathWithName, "png")); + } + else + { + // 常规保存模式 - 仅保存墨迹对象 + inkCanvas.Strokes.Save(fs); + if (newNotice) ShowNotification("墨迹成功保存至 " + savePathWithName); + } + + fs.Close(); } catch (Exception ex) { ShowNotification("墨迹保存失败"); diff --git a/Ink Canvas/MainWindow_cs/MW_Settings.cs b/Ink Canvas/MainWindow_cs/MW_Settings.cs index 05c07f1b..3e30aa63 100644 --- a/Ink Canvas/MainWindow_cs/MW_Settings.cs +++ b/Ink Canvas/MainWindow_cs/MW_Settings.cs @@ -1356,6 +1356,12 @@ namespace Ink_Canvas { ToggleSwitchAutoSaveScreenShotInPowerPoint.IsOn; SaveSettingsToFile(); } + + private void ToggleSwitchSaveFullPageStrokes_Toggled(object sender, RoutedEventArgs e) { + if (!isLoaded) return; + Settings.Automation.IsSaveFullPageStrokes = ToggleSwitchSaveFullPageStrokes.IsOn; + SaveSettingsToFile(); + } #endregion diff --git a/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs b/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs index 886c538d..3b182cbb 100644 --- a/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs +++ b/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs @@ -699,6 +699,8 @@ namespace Ink_Canvas { ToggleSwitchSaveScreenshotsInDateFolders.IsOn = Settings.Automation.IsSaveScreenshotsInDateFolders; ToggleSwitchAutoSaveStrokesAtScreenshot.IsOn = Settings.Automation.IsAutoSaveStrokesAtScreenshot; + + ToggleSwitchSaveFullPageStrokes.IsOn = Settings.Automation.IsSaveFullPageStrokes; SideControlMinimumAutomationSlider.Value = Settings.Automation.MinimumAutomationStrokeNumber; diff --git a/Ink Canvas/Resources/Settings.cs b/Ink Canvas/Resources/Settings.cs index 33ea477d..7abe8f82 100644 --- a/Ink Canvas/Resources/Settings.cs +++ b/Ink Canvas/Resources/Settings.cs @@ -364,6 +364,9 @@ namespace Ink_Canvas [JsonProperty("autoDelSavedFilesDaysThreshold")] public int AutoDelSavedFilesDaysThreshold = 15; + + [JsonProperty("isSaveFullPageStrokes")] + public bool IsSaveFullPageStrokes = false; } public class Advanced