【问题标题】:Saving image from inkCanvas as png or jpeg file将 inkCanvas 中的图像保存为 png 或 jpeg 文件
【发布时间】:2017-04-16 06:20:10
【问题描述】:

这是我的 wpf 代码 <InkCanvas x:Name="inkCanvas" Margin="9,325,210,193" Background="Azure"></InkCanvas> 还有一个按钮 按下按钮时,我想将绘制的图像保存到文件中。这是我的代码

  private void button1_Click(object sender, RoutedEventArgs e)
    {
        int margin = (int)inkCanvas.Margin.Left;
        int width = (int)inkCanvas.ActualWidth - margin;
        int height = (int)inkCanvas.ActualHeight - margin;
        RenderTargetBitmap rtb = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Default);
        rtb.Render(inkCanvas);


        using (FileStream fs = new FileStream("path", FileMode.Create))
        {
            BitmapEncoder encoder = new PngBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(rtb));
            encoder.Save(fs);
        }
    }

但显示的图像全是黑色(从探险家那里得到的)或完全白色,如果在油漆中打开的话。 我该怎么做才能得到与绘制完全一致的图像?太棒了。

【问题讨论】:

  • 看看:stackoverflow.com/questions/4067448/… 我也遇到了类似的问题,但使用的是 winForms
  • @Alex 似乎与您尝试在不支持它的编码器中保存具有透明度的位图相似,该编码器确实支持它,但它可能是默认像素格式'不包括 Alpha 通道,或者可能是渲染器没有正确渲染背景和矢量

标签: c# wpf save png inkcanvas


【解决方案1】:

问题是你试图将矢量图形保存为位图,这是不可能的,所以首先你需要做的是绘制矢量,然后你可以保存绘图

这个类会将 Ink 绘制到现有位图上

public class InkImage
{
    public static BitmapFrame MergeInk(StrokeCollection ink, BitmapSource background)
    {
        DrawingVisual drawingVisual = new DrawingVisual();
        using (DrawingContext drawingContext = drawingVisual.RenderOpen())
        {
            drawingContext.DrawImage(background, new Rect(0, 0, background.Width, background.Height));

            foreach (var item in ink)
            {
                item.Draw(drawingContext);
            }
            drawingContext.Close();
            var bitmap = new RenderTargetBitmap((int)background.Width, (int)background.Height, background.DpiX, background.DpiY, PixelFormats.Pbgra32);
            bitmap.Render(drawingVisual);
            return BitmapFrame.Create(bitmap);
        }
    }
}

然后您可以使用 JPEG 或 PNG 编码器保存位图

【讨论】:

  • 我建议不要遍历所有笔划并单独绘制它们,而是使用 StrokeCollection 的 Draw 方法:ink.Draw(drawingContext);这样也能正确绘制荧光笔笔划。
猜你喜欢
  • 2016-01-28
  • 1970-01-01
  • 2017-07-23
  • 1970-01-01
  • 2017-08-12
  • 1970-01-01
  • 2016-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多