使用MVVM将笔画保存为图像

时间:2018-03-12 09:27:52

标签: c# wpf mvvm bitmap png

我的代码后面有一个函数可以实现我想要的功能。我喜欢这个是无论用户如何从InkCanvas边界扩展他的绘图,图像将在保存时调整大小。

private void exportCanvasToBitmap(object sender, EventArgs e) {

RenderTargetBitmap rtb = new 
RenderTargetBitmap((int)signatureCanvas.ActualWidth, 
(int)signatureCanvas.ActualHeight, 96, 96, PixelFormats.Default);
        rtb.Render(signatureCanvas);

        BmpBitmapEncoder encoder = new BmpBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(rtb));
        FileStream fs = File.Open(@".\images\"+ signatureFileName + ".jpg", FileMode.Create);
        encoder.Save(fs);
        fs.Close();
        (sourceWindow as MainWindow).updateSignatureImage(signatureType, signatureFileName);
    }

我想把它移到ViewModel,我不知道如何使它与我之前的相同。我不想在ViewModel中使用rtb.Render(inkCanvas)。经过一些搜索后,我将一个StrokeCollection绑定到了我的视图并使用了这个函数。

  public void convertStrokestoImage() {

        StrokeCollection sc = strokes;

        byte[] inkData = null;

        using (MemoryStream inkMemStream = new MemoryStream())

        {

            sc.Save(inkMemStream);

            inkData = inkMemStream.ToArray();

        }

        byte[] gifData = null;


        using (Microsoft.Ink.Ink ink2 = new Microsoft.Ink.Ink())
          {

            ink2.Load(inkData);

            gifData = ink2.Save(Microsoft.Ink.PersistenceFormat.Gif); 

        }

        File.WriteAllBytes("./Src/strokes.png", gifData);

    }

问题在于,如果用户从InkCanvas的边界中抽出,图像会缩放“我不想要的”。我不确定如何做到这一点,因为我在网上找到的这两个功能都是其他问题的解决方案。

我最初的想法是,我必须做一些类似于之前的东西,我有一个RenderTargetBitmap,它具有我的InkCanvas的实际宽度和高度。问题是我不知道如何在不使用InkCanvas对象的情况下获得它。

任何提示?

1 个答案:

答案 0 :(得分:0)

我解决了这个问题。

首先我将byte []转换为Image,然后使用辅助函数调整图像大小。

 public void convertStrokestoImage()
    {

        StrokeCollection sc = strokes;

        byte[] inkData = null;

        using (MemoryStream inkMemStream = new MemoryStream())

        {

            sc.Save(inkMemStream);

            inkData = inkMemStream.ToArray();

        }

        byte[] gifData = null;


        using (Microsoft.Ink.Ink ink2 = new Microsoft.Ink.Ink())
        {

            ink2.Load(inkData);

            gifData = ink2.Save(Microsoft.Ink.PersistenceFormat.Gif);

        }

        MemoryStream ms = new MemoryStream(gifData);
        Image image = Image.FromStream(ms);
        image = resizeImage(image, 100, 150);
        image.Save("./Src/strokes.png");

    }

您可以在以下问题中找到很多用于调整图像大小的功能。 Resize an Image C#

我不喜欢这个是图像文件大小变大了! 例如,5kb变为30kb。