Skip to content

Commit 91c2fa4

Browse files
authored
Revert "feat: 选区截图时保留屏幕笔迹 (#406)" (#418)
This reverts commit f7aa107.
1 parent 837311b commit 91c2fa4

4 files changed

Lines changed: 17 additions & 280 deletions

File tree

Ink Canvas/MainWindow_cs/MW_ImageInsert.cs

Lines changed: 6 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
using System.Windows;
1010
using System.Windows.Controls;
1111
using System.Windows.Forms;
12-
using System.Windows.Ink;
1312
using System.Windows.Media;
1413
using System.Windows.Media.Imaging;
1514
using System.Windows.Threading;
@@ -31,17 +30,15 @@ public struct ScreenshotResult
3130
public Bitmap CameraImage;
3231
public BitmapSource CameraBitmapSource;
3332
public bool AddToWhiteboard;
34-
public bool IncludeInk;
3533

3634
public ScreenshotResult(Rectangle area, List<Point> path = null, Bitmap cameraImage = null,
37-
BitmapSource cameraBitmapSource = null, bool addToWhiteboard = false, bool includeInk = true)
35+
BitmapSource cameraBitmapSource = null, bool addToWhiteboard = false)
3836
{
3937
Area = area;
4038
Path = path;
4139
CameraImage = cameraImage;
4240
CameraBitmapSource = cameraBitmapSource;
4341
AddToWhiteboard = addToWhiteboard;
44-
IncludeInk = includeInk;
4542
}
4643
}
4744

@@ -98,7 +95,7 @@ private async Task CaptureScreenshotAndInsert()
9895
else if (screenshotResult.Value.Area.Width > 0 && screenshotResult.Value.Area.Height > 0)
9996
{
10097
// 屏幕截图
101-
using (var originalBitmap = CaptureScreenAreaWithOptionalInk(screenshotResult.Value.Area, screenshotResult.Value.IncludeInk))
98+
using (var originalBitmap = CaptureScreenArea(screenshotResult.Value.Area))
10299
{
103100
if (originalBitmap != null)
104101
{
@@ -210,16 +207,7 @@ private async Task CaptureFullScreenAndInsert()
210207
{
211208
await Application.Current.Dispatcher.InvokeAsync(() =>
212209
{
213-
var selectorWindow = new ScreenshotSelectorWindow(shouldIncludeInk =>
214-
{
215-
if (inkCanvas == null)
216-
{
217-
return;
218-
}
219-
220-
inkCanvas.Visibility = shouldIncludeInk ? Visibility.Visible : Visibility.Collapsed;
221-
Dispatcher.Invoke(() => { }, DispatcherPriority.Render);
222-
});
210+
var selectorWindow = new ScreenshotSelectorWindow();
223211
if (selectorWindow.ShowDialog() == true)
224212
{
225213
// 检查是否是摄像头截图
@@ -230,8 +218,7 @@ await Application.Current.Dispatcher.InvokeAsync(() =>
230218
null, // 摄像头截图不需要路径
231219
null, // 不再使用Bitmap
232220
selectorWindow.CameraBitmapSource, // 摄像头BitmapSource
233-
selectorWindow.ShouldAddToWhiteboard,
234-
selectorWindow.ShouldIncludeInk
221+
selectorWindow.ShouldAddToWhiteboard
235222
);
236223
}
237224
else if (selectorWindow.CameraImage != null)
@@ -241,8 +228,7 @@ await Application.Current.Dispatcher.InvokeAsync(() =>
241228
null, // 摄像头截图不需要路径
242229
selectorWindow.CameraImage, // 摄像头图像
243230
null,
244-
selectorWindow.ShouldAddToWhiteboard,
245-
selectorWindow.ShouldIncludeInk
231+
selectorWindow.ShouldAddToWhiteboard
246232
);
247233
}
248234
else
@@ -252,8 +238,7 @@ await Application.Current.Dispatcher.InvokeAsync(() =>
252238
selectorWindow.SelectedPath,
253239
null,
254240
null,
255-
selectorWindow.ShouldAddToWhiteboard,
256-
selectorWindow.ShouldIncludeInk
241+
selectorWindow.ShouldAddToWhiteboard
257242
);
258243
}
259244
}
@@ -319,108 +304,6 @@ private Bitmap CaptureScreenArea(Rectangle area)
319304
}
320305
}
321306

322-
private Bitmap CaptureScreenAreaWithOptionalInk(Rectangle area, bool includeInk)
323-
{
324-
Bitmap bitmap = null;
325-
StrokeCollection strokesForOverlay = null;
326-
Point? inkCanvasTopLeftOnScreen = null;
327-
System.Windows.Media.Matrix? dpiTransform = null;
328-
var originalWindowVisibility = Visibility;
329-
330-
try
331-
{
332-
if (includeInk && inkCanvas != null && inkCanvas.Strokes.Count > 0)
333-
{
334-
strokesForOverlay = inkCanvas.Strokes.Clone();
335-
336-
var source = PresentationSource.FromVisual(inkCanvas);
337-
if (source?.CompositionTarget != null)
338-
{
339-
dpiTransform = source.CompositionTarget.TransformToDevice;
340-
}
341-
342-
inkCanvasTopLeftOnScreen = inkCanvas.PointToScreen(new Point(0, 0));
343-
}
344-
345-
// 先隐藏主窗口再截取屏幕,确保基础截图不包含主线程 UI(含墨迹层)。
346-
Visibility = Visibility.Hidden;
347-
Dispatcher.Invoke(() => { }, DispatcherPriority.Render);
348-
349-
bitmap = CaptureScreenArea(area);
350-
}
351-
catch (Exception ex)
352-
{
353-
LogHelper.WriteLogToFile($"准备截图时处理墨迹失败: {ex.Message}", LogHelper.LogType.Error);
354-
bitmap?.Dispose();
355-
return null;
356-
}
357-
finally
358-
{
359-
Visibility = originalWindowVisibility;
360-
Dispatcher.Invoke(() => { }, DispatcherPriority.Render);
361-
}
362-
363-
if (bitmap == null || !includeInk || strokesForOverlay == null || strokesForOverlay.Count == 0)
364-
{
365-
return bitmap;
366-
}
367-
368-
try
369-
{
370-
OverlayInkStrokesOnBitmap(bitmap, area, strokesForOverlay, inkCanvasTopLeftOnScreen, dpiTransform);
371-
}
372-
catch (Exception ex)
373-
{
374-
LogHelper.WriteLogToFile($"叠加墨迹到截图失败: {ex.Message}", LogHelper.LogType.Error);
375-
}
376-
377-
return bitmap;
378-
}
379-
380-
private void OverlayInkStrokesOnBitmap(
381-
Bitmap bitmap,
382-
Rectangle area,
383-
StrokeCollection strokes,
384-
Point? inkCanvasTopLeftOnScreen = null,
385-
System.Windows.Media.Matrix? dpiTransform = null)
386-
{
387-
if (bitmap == null || strokes == null || strokes.Count == 0)
388-
{
389-
return;
390-
}
391-
392-
var transform = dpiTransform ?? new System.Windows.Media.Matrix(1, 0, 0, 1, 0, 0);
393-
var topLeft = inkCanvasTopLeftOnScreen ?? new Point(area.X, area.Y);
394-
var offsetX = topLeft.X * transform.M11 - area.X;
395-
var offsetY = topLeft.Y * transform.M22 - area.Y;
396-
397-
var drawingVisual = new DrawingVisual();
398-
using (var drawingContext = drawingVisual.RenderOpen())
399-
{
400-
drawingContext.PushTransform(new TranslateTransform(offsetX, offsetY));
401-
strokes.Draw(drawingContext);
402-
drawingContext.Pop();
403-
}
404-
405-
var renderBitmap = new RenderTargetBitmap(bitmap.Width, bitmap.Height, 96, 96, PixelFormats.Pbgra32);
406-
renderBitmap.Render(drawingVisual);
407-
408-
var encoder = new PngBitmapEncoder();
409-
encoder.Frames.Add(BitmapFrame.Create(renderBitmap));
410-
411-
using (var memoryStream = new MemoryStream())
412-
{
413-
encoder.Save(memoryStream);
414-
memoryStream.Position = 0;
415-
using (var overlayBitmap = new Bitmap(memoryStream))
416-
using (var graphics = Graphics.FromImage(bitmap))
417-
{
418-
graphics.CompositingMode = CompositingMode.SourceOver;
419-
graphics.DrawImage(overlayBitmap, 0, 0, bitmap.Width, bitmap.Height);
420-
}
421-
}
422-
}
423-
424307
/// <summary>
425308
/// 将截图插入到画布
426309
/// </summary>

Ink Canvas/MainWindow_cs/MW_Screenshot.cs

Lines changed: 11 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ namespace Ink_Canvas
1414
{
1515
public partial class MainWindow : Window
1616
{
17-
private bool _isAreaScreenshotInProgress;
18-
1917
/// <summary>
2018
/// 在切页/加页场景下使用:先捕获当前画面到内存并克隆墨迹,然后立即返回;截图与墨迹保存在后台异步执行,不阻塞切页。
2119
/// 调用方应在调用本方法后立即执行 SaveStrokes、ClearStrokes、切页、RestoreStrokes 等逻辑。
@@ -159,98 +157,13 @@ internal void SaveScreenShotToDesktop()
159157
SaveInkCanvasStrokes(false);
160158
}
161159

162-
private struct AnnotationSuspendState
163-
{
164-
public bool WasInAnnotationMode;
165-
public int OriginalMode;
166-
public System.Windows.Media.Brush OriginalFakeBackground;
167-
public double OriginalFakeBackgroundOpacity;
168-
public Visibility OriginalBackgroundCoverHolderVisibility;
169-
public Visibility OriginalCanvasControlsVisibility;
170-
public object OriginalHideInkCanvasContent;
171-
}
172-
173-
private AnnotationSuspendState SuspendAnnotationForAreaScreenshotIfNeeded()
174-
{
175-
var state = new AnnotationSuspendState
176-
{
177-
WasInAnnotationMode = GridTransparencyFakeBackground.Background != System.Windows.Media.Brushes.Transparent,
178-
OriginalMode = currentMode,
179-
OriginalFakeBackground = GridTransparencyFakeBackground.Background,
180-
OriginalFakeBackgroundOpacity = GridTransparencyFakeBackground.Opacity,
181-
OriginalBackgroundCoverHolderVisibility = GridBackgroundCoverHolder.Visibility,
182-
OriginalCanvasControlsVisibility = StackPanelCanvasControls.Visibility,
183-
OriginalHideInkCanvasContent = BtnHideInkCanvas.Content
184-
};
185-
186-
if (!state.WasInAnnotationMode)
187-
{
188-
return state;
189-
}
190-
191-
// 仅暂停批注视觉态,避免调用 BtnHideInkCanvas_Click 触发自动截图/上传及白板状态读写。
192-
GridTransparencyFakeBackground.Opacity = 0;
193-
GridTransparencyFakeBackground.Background = System.Windows.Media.Brushes.Transparent;
194-
GridBackgroundCoverHolder.Visibility = Visibility.Collapsed;
195-
StackPanelCanvasControls.Visibility = Visibility.Collapsed;
196-
CheckEnableTwoFingerGestureBtnVisibility(false);
197-
HideSubPanels("cursor");
198-
BtnHideInkCanvas.Content = "显示\n画板";
199-
200-
return state;
201-
}
202-
203-
private void RestoreAnnotationAfterAreaScreenshot(AnnotationSuspendState state)
204-
{
205-
if (!state.WasInAnnotationMode || currentMode != state.OriginalMode)
206-
{
207-
return;
208-
}
209-
210-
GridTransparencyFakeBackground.Opacity = state.OriginalFakeBackgroundOpacity;
211-
GridTransparencyFakeBackground.Background = state.OriginalFakeBackground;
212-
GridBackgroundCoverHolder.Visibility = state.OriginalBackgroundCoverHolderVisibility;
213-
StackPanelCanvasControls.Visibility = state.OriginalCanvasControlsVisibility;
214-
CheckEnableTwoFingerGestureBtnVisibility(state.OriginalCanvasControlsVisibility == Visibility.Visible);
215-
BtnHideInkCanvas.Content = state.OriginalHideInkCanvasContent;
216-
}
217-
218160
internal async Task SaveAreaScreenShotToDesktop()
219161
{
220-
if (_isAreaScreenshotInProgress)
221-
{
222-
ShowNotification("截图进行中,请先完成当前截图");
223-
return;
224-
}
225-
226-
_isAreaScreenshotInProgress = true;
227-
228-
var annotationState = SuspendAnnotationForAreaScreenshotIfNeeded();
229-
var originalFloatingBarVisibility = ViewboxFloatingBar.Visibility;
230-
var shouldRestoreFloatingBarVisibility = true;
162+
var originalVisibility = Visibility;
231163
try
232164
{
233-
if (annotationState.WasInAnnotationMode)
234-
{
235-
// 等待一次 UI 刷新,确保批注暂停状态已完成。
236-
await System.Windows.Threading.Dispatcher.Yield(System.Windows.Threading.DispatcherPriority.Render);
237-
}
238-
239-
// 从浮动栏触发选区截图时,临时隐藏浮动栏,避免遮挡选区与误入截图。
240-
if (originalFloatingBarVisibility == Visibility.Visible)
241-
{
242-
ViewboxFloatingBar.Visibility = Visibility.Collapsed;
243-
await System.Windows.Threading.Dispatcher.Yield(System.Windows.Threading.DispatcherPriority.Render);
244-
}
245-
246-
// 选区截图时确保墨迹层可见,避免从浮动栏触发时出现“先隐藏再截图”。
247-
if (inkCanvas.Visibility != Visibility.Visible)
248-
{
249-
inkCanvas.Visibility = Visibility.Visible;
250-
}
251-
252-
// 等待一次 UI 刷新,确保可见性状态已生效。
253-
await System.Windows.Threading.Dispatcher.Yield(System.Windows.Threading.DispatcherPriority.Render);
165+
Visibility = Visibility.Hidden;
166+
await Task.Delay(200);
254167

255168
var screenshotResult = await ShowScreenshotSelector();
256169

@@ -262,12 +175,7 @@ internal async Task SaveAreaScreenShotToDesktop()
262175

263176
if (screenshotResult.Value.AddToWhiteboard)
264177
{
265-
// 仅在白板接管流程已确认完成时,才跳过本方法对浮动栏可见性的恢复。
266-
var whiteboardHandoffCompleted = await AddScreenshotToNewWhiteboardPage(screenshotResult.Value);
267-
if (whiteboardHandoffCompleted)
268-
{
269-
shouldRestoreFloatingBarVisibility = false;
270-
}
178+
await AddScreenshotToNewWhiteboardPage(screenshotResult.Value);
271179
return;
272180
}
273181

@@ -281,7 +189,7 @@ internal async Task SaveAreaScreenShotToDesktop()
281189
Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory),
282190
$"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}.png");
283191

284-
using (var originalBitmap = CaptureScreenAreaWithOptionalInk(screenshotResult.Value.Area, screenshotResult.Value.IncludeInk))
192+
using (var originalBitmap = CaptureScreenArea(screenshotResult.Value.Area))
285193
{
286194
if (originalBitmap == null)
287195
{
@@ -327,16 +235,11 @@ internal async Task SaveAreaScreenShotToDesktop()
327235
}
328236
finally
329237
{
330-
_isAreaScreenshotInProgress = false;
331-
if (shouldRestoreFloatingBarVisibility)
332-
{
333-
ViewboxFloatingBar.Visibility = originalFloatingBarVisibility;
334-
}
335-
RestoreAnnotationAfterAreaScreenshot(annotationState);
238+
Visibility = originalVisibility;
336239
}
337240
}
338241

339-
private async Task<bool> AddScreenshotToNewWhiteboardPage(ScreenshotResult screenshotResult)
242+
private async Task AddScreenshotToNewWhiteboardPage(ScreenshotResult screenshotResult)
340243
{
341244
// 先在当前场景准备截图数据,再进白板,避免误截到白板页面
342245
BitmapSource bitmapSourceForClipboard = null;
@@ -356,15 +259,15 @@ private async Task<bool> AddScreenshotToNewWhiteboardPage(ScreenshotResult scree
356259
if (screenshotResult.Area.Width <= 0 || screenshotResult.Area.Height <= 0)
357260
{
358261
ShowNotification("未选择有效截图区域");
359-
return false;
262+
return;
360263
}
361264

362-
using (var originalBitmap = CaptureScreenAreaWithOptionalInk(screenshotResult.Area, screenshotResult.IncludeInk))
265+
using (var originalBitmap = CaptureScreenArea(screenshotResult.Area))
363266
{
364267
if (originalBitmap == null)
365268
{
366269
ShowNotification("截图失败");
367-
return false;
270+
return;
368271
}
369272

370273
Bitmap finalBitmap = originalBitmap;
@@ -393,7 +296,7 @@ private async Task<bool> AddScreenshotToNewWhiteboardPage(ScreenshotResult scree
393296
if (bitmapSourceForClipboard == null)
394297
{
395298
ShowNotification("截图转换失败");
396-
return false;
299+
return;
397300
}
398301

399302
// 图像已拷贝到内存后再进入白板
@@ -408,7 +311,6 @@ private async Task<bool> AddScreenshotToNewWhiteboardPage(ScreenshotResult scree
408311
BtnWhiteBoardAdd_Click(null, EventArgs.Empty);
409312

410313
await InsertBitmapSourceToCanvas(bitmapSourceForClipboard);
411-
return true;
412314
}
413315

414316
/// <summary>

Ink Canvas/Windows/ScreenshotSelectorWindow.xaml

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -139,17 +139,6 @@
139139
<Separator Style="{StaticResource {x:Static ToolBar.SeparatorStyleKey}}"
140140
Margin="8,0"
141141
Background="#404040" />
142-
143-
<!-- 选项开关 -->
144-
<CheckBox Name="IncludeInkCheckBox"
145-
Content="包含墨迹"
146-
IsChecked="True"
147-
Margin="8,0"
148-
VerticalAlignment="Center"
149-
Foreground="White"
150-
FontWeight="Medium"
151-
Checked="IncludeInkCheckBox_Checked"
152-
Unchecked="IncludeInkCheckBox_Unchecked" />
153142

154143
<!-- 操作按钮 -->
155144
<Button Name="ConfirmButton"

0 commit comments

Comments
 (0)