fix: keep include-ink available for image-only canvas and tighten bitmap disposal
This commit is contained in:
@@ -342,7 +342,12 @@ namespace Ink_Canvas
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (inkCanvas == null || inkCanvas.Strokes == null || inkCanvas.Strokes.Count == 0)
|
if (inkCanvas == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((inkCanvas.Strokes?.Count ?? 0) == 0 && inkCanvas.Children.Count == 0)
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -361,19 +366,18 @@ namespace Ink_Canvas
|
|||||||
var inkTopLeftPx = transformToDevice.Transform(inkTopLeftDip);
|
var inkTopLeftPx = transformToDevice.Transform(inkTopLeftDip);
|
||||||
var offsetX = inkTopLeftPx.X - virtualScreen.Left;
|
var offsetX = inkTopLeftPx.X - virtualScreen.Left;
|
||||||
var offsetY = inkTopLeftPx.Y - virtualScreen.Top;
|
var offsetY = inkTopLeftPx.Y - virtualScreen.Top;
|
||||||
var strokes = inkCanvas.Strokes.Clone();
|
var widthPx = inkCanvas.ActualWidth * transformToDevice.M11;
|
||||||
|
var heightPx = inkCanvas.ActualHeight * transformToDevice.M22;
|
||||||
|
|
||||||
var drawingVisual = new DrawingVisual();
|
var drawingVisual = new DrawingVisual();
|
||||||
using (var dc = drawingVisual.RenderOpen())
|
using (var dc = drawingVisual.RenderOpen())
|
||||||
{
|
{
|
||||||
// 直接绘制墨迹,避免 VisualBrush 在不同 DPI/布局下产生轻微偏移
|
// 使用完整 InkCanvas 视觉树,确保包含图片等子元素
|
||||||
var matrix = new System.Windows.Media.Matrix(
|
var visualBrush = new VisualBrush(inkCanvas)
|
||||||
transformToDevice.M11, 0,
|
{
|
||||||
0, transformToDevice.M22,
|
Stretch = Stretch.Fill
|
||||||
offsetX, offsetY);
|
};
|
||||||
dc.PushTransform(new MatrixTransform(matrix));
|
dc.DrawRectangle(visualBrush, null, new Rect(offsetX, offsetY, widthPx, heightPx));
|
||||||
strokes.Draw(dc);
|
|
||||||
dc.Pop();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var rtb = new RenderTargetBitmap(
|
var rtb = new RenderTargetBitmap(
|
||||||
@@ -422,16 +426,25 @@ namespace Ink_Canvas
|
|||||||
return capturedBitmap;
|
return capturedBitmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
var resultBitmap = new Bitmap(capturedBitmap.Width, capturedBitmap.Height, PixelFormat.Format32bppArgb);
|
Bitmap resultBitmap = null;
|
||||||
using (var g = Graphics.FromImage(resultBitmap))
|
try
|
||||||
{
|
{
|
||||||
g.DrawImage(capturedBitmap, 0, 0, capturedBitmap.Width, capturedBitmap.Height);
|
resultBitmap = new Bitmap(capturedBitmap.Width, capturedBitmap.Height, PixelFormat.Format32bppArgb);
|
||||||
|
using (var g = Graphics.FromImage(resultBitmap))
|
||||||
|
{
|
||||||
|
g.DrawImage(capturedBitmap, 0, 0, capturedBitmap.Width, capturedBitmap.Height);
|
||||||
|
|
||||||
var targetRect = new Rectangle(0, 0, Math.Min(sourceRect.Width, capturedBitmap.Width), Math.Min(sourceRect.Height, capturedBitmap.Height));
|
var targetRect = new Rectangle(0, 0, Math.Min(sourceRect.Width, capturedBitmap.Width), Math.Min(sourceRect.Height, capturedBitmap.Height));
|
||||||
g.DrawImage(inkOverlayBitmap, targetRect, sourceRect, GraphicsUnit.Pixel);
|
g.DrawImage(inkOverlayBitmap, targetRect, sourceRect, GraphicsUnit.Pixel);
|
||||||
|
}
|
||||||
|
|
||||||
|
return resultBitmap;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
resultBitmap?.Dispose();
|
||||||
|
throw;
|
||||||
}
|
}
|
||||||
|
|
||||||
return resultBitmap;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|||||||
Reference in New Issue
Block a user