Проблема с чернилами в потоке памяти - PullRequest
1 голос
/ 12 апреля 2011

Я пытался преобразовать чернила из пространства имен Microsoft.Ink в поток памяти, чтобы преобразовать их в изображение, но я не понимаю, почему возникает ошибка в потоке памяти. Я вроде чувствовал, что это была ошибка от Convert.FromBase64String ()

Но я не знаю, какие еще варианты я могу преобразовать в изображение.

Пожалуйста, помогите мне

Вот мой код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using Microsoft.Ink;

namespace testPaint
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        InkCollector ink;

        private void Form1_Load(object sender, EventArgs e)
        {
            ink = new InkCollector(pictureBox1);
            ink.Enabled = true;
            ink.AutoRedraw = true;
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            UTF8Encoding utf8 = new UTF8Encoding();
            ink.Enabled = false;

            string strInk = Convert.ToBase64String(ink.Ink.Save(PersistenceFormat.Base64InkSerializedFormat, CompressionMode.Maximum));
            textBox1.Text = strInk;
            ink.Enabled = true;
        }

        private void btnClr_Click(object sender, EventArgs e)
        {
            ink.Enabled = false;
            ink.Ink = new Microsoft.Ink.Ink();
            ink.Enabled = true;
            pictureBox1.Invalidate();
        }

        private void btnExport_Click(object sender, EventArgs e)
        {
            byte[] byImage = Convert.FromBase64String(textBox1.Text);
            MemoryStream ms = new MemoryStream();
            ms.Write(byImage, 0, byImage.Length);
            Image img = Image.FromStream(ms);
            img.Save("test.gif", System.Drawing.Imaging.ImageFormat.Gif);
            ink.Enabled = true;


        }
    }
}

1 Ответ

1 голос
/ 12 апреля 2011

Документация очень предварительная, но я думаю, что вы, вероятно, используете неправильный тег PersistenceFormat: вы используете Base64 в качестве формата вывода, но вам явно нужно PersistenceFormat.Gif.

Кроме того, ваше преобразование в строку и обратно не имеет никакого значения. Просто используйте личную переменную byte[] для хранения данных о чернилах. Кроме того, ваш обход через MemoryStream и System.Graphics.Image также не имеет смысла.

// using System.IO;

private byte[] inkData;

private void btnSave_Click(object sender, EventArgs e)
{
    inkData = ink.Ink.Save(PersistenceFormat.Gif, CompressionMode.Maximum);
}

private void btnExport_Click(object sender, EventArgs e)
{
    // Data is already in GIF format, write directly to file!
    using (var stream = new FileStream("filename", FileMode.Create, FileAccess.Write))
         stream.Write(inkData, 0, inkData.Length);
}
...