Преобразование штрихов InkCanvas в массив байтов и обратно

Я работаю над программой, которая преобразует штрихи inkcanvas в массив байтов для шифрования, а затем сохраняет его в текстовом файле. По сути, мне нужно преобразовать массив байтов в штрихи inkcanvas. У меня есть первая половина кода (который преобразует штрихи inkcanvas в массив байтов):

    private byte[] InkCanvasToByte()
    {
        using (MemoryStream ms = new MemoryStream())
        {
            if(myInkCanvas.Strokes.Count > 0)
            {
                myInkCanvas.Strokes.Save(ms, true);
                byte[] unencryptedSignature = ms.ToArray();
                return unencryptedSignature;
            }
            else
            {
                return null;
            }
        }
    }

Но мне нужна помощь в написании метода для преобразования массива байтов в штрихи inkcanvas, чтобы преобразовать штрихи inkcanvas в jpg.


До сих пор я создал метод, который открывает файл массива байтов и записывает его в переменную массива байтов:

    private void ReadByteArrayFromFile()
    {
        string Chosen_File = "";
        Microsoft.Win32.OpenFileDialog ofd = new Microsoft.Win32.OpenFileDialog();
        ofd.Filter = "All Files (*.*)|*.*";
        ofd.FilterIndex = 1;
        ofd.Multiselect = false;
        bool? userClickedOK = ofd.ShowDialog();
        if (userClickedOK == true)
        {
            Chosen_File = ofd.FileName;
        }
        byte[] bytesFromFile = File.ReadAllBytes(Chosen_File);

    }

Теперь все, что мне нужно сделать, это преобразовать этот массив байтов обратно в изображение, либо с помощью штрихов inkcanvas. Я обновлю этот пост решением, если найду его!

EDIT: Хм. Я использую код из этой ссылки и получаю: «Входной поток не является допустимым двоичным форматом. Начальное содержимое (в byes): 00-FB-03-03-06-48-11-45-35 -46-35-11-00-00-80-3Ф-1Ф..."

Код, который я использую:

    private void ReadByteArrayFromFile(string Chosen_File)
    {

        byte[] bytesFromFile = File.ReadAllBytes(Chosen_File);
        try
        {
            BinaryFormatter bf = new BinaryFormatter();
            MemoryStream ms = new MemoryStream(bytesFromFile);
            MyCustomStrokes customStrokes = bf.Deserialize(ms) as MyCustomStrokes;
            for(int i = 0; i < customStrokes.StrokeCollection.Length; i++)
            {
                if(customStrokes.StrokeCollection[i] != null)
                {
                    StylusPointCollection stylusCollection = new
                      StylusPointCollection(customStrokes.StrokeCollection[i]);
                    Stroke stroke = new Stroke(stylusCollection);
                    StrokeCollection strokes = new StrokeCollection();
                    strokes.Add(stroke);
                    this.MyInkPresenter.Strokes.Add(strokes);
                }
            }

        }
        catch (Exception ex)
        {
            System.Windows.MessageBox.Show(ex.Message);
        }
    }

    private void DecryptByteArray(byte[] encryptedArray)
    {
    }


}
[Serializable]
public sealed class MyCustomStrokes
{
    public MyCustomStrokes() { }
    /// <SUMMARY>
    /// The first index is for the stroke no.
    /// The second index is for the keep the 2D point of the Stroke.
    /// </SUMMARY>
    public Point[][] StrokeCollection;
}

}


person gtnewhouse    schedule 17.06.2015    source источник
comment
Попробуйте взглянуть на это: Сохранение-восстановление штрихов InkCanvas . Похоже, это может помочь.   -  person Jashaszun    schedule 17.06.2015
comment
Яшасун, спасибо! Я увидел это и решил проверить это до обеда. Я обновлю сообщение и отвечу на свой вопрос, если это сработает.   -  person gtnewhouse    schedule 17.06.2015
comment
Это не то, как работает WPF. Единственный способ получить растровое изображение — начать с отображаемого объекта WPF (в данном случае холст, презентер и т. д.) и отобразить его, например, в RenderTargetBitmap. Другими словами, вопрос о том, как сохранить/загрузить штрихи, полностью отделен от вопроса о том, как преобразовать штрихи в растровое изображение. Пожалуйста, выясните, по какому вопросу вам нужна помощь, и отредактируйте/опубликуйте вопрос, включив хороший, минимальный, полный пример кода, который четко показывает, что вы пробовали и с чем у вас возникли проблемы.   -  person Peter Duniho    schedule 17.06.2015
comment
Хорошо, Питер, я ограничил свой вопрос только преобразованием файла массива байтов в штрихи.   -  person gtnewhouse    schedule 17.06.2015


Ответы (1)


Моя проблема заключалась в том, что я не сериализовал вывод в сохраненный файл, и поэтому, когда я загрузил этот файл, десериализовав его, произошла ошибка. Вот правильный код:

    private void SaveByteArrayToFile(byte[] byteArray)
    {
        var dialog = new System.Windows.Forms.FolderBrowserDialog();
        string filepath = "";
        if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            filepath += dialog.SelectedPath;
            System.Windows.MessageBox.Show(filepath);
        }
        filepath += "Signature.txt";
        MyCustomStrokes customStrokes = new MyCustomStrokes();
        customStrokes.StrokeCollection = new Point[myInkCanvas.Strokes.Count][];
        for (int i = 0; i < myInkCanvas.Strokes.Count; i++)
        {
            customStrokes.StrokeCollection[i] = 
            new Point[this.myInkCanvas.Strokes[i].StylusPoints.Count];
            for (int j = 0; j < myInkCanvas.Strokes[i].StylusPoints.Count; j++)
            {
                customStrokes.StrokeCollection[i][j] = new Point();
                customStrokes.StrokeCollection[i][j].X = 
                                  myInkCanvas.Strokes[i].StylusPoints[j].X;
                customStrokes.StrokeCollection[i][j].Y = 
                                  myInkCanvas.Strokes[i].StylusPoints[j].Y;
            }
        }
        MemoryStream ms = new MemoryStream();
        BinaryFormatter bf = new BinaryFormatter();
        bf.Serialize(ms, customStrokes);
        File.WriteAllBytes(filepath, Encrypt(ms.GetBuffer()));
    }
   private void ReadByteArrayFromFile(string Chosen_File)
    {

        byte[] bytesFromFile = File.ReadAllBytes(Chosen_File);
        byte[] decryptedBytes = Decrypt(bytesFromFile);
        try
        {
            BinaryFormatter bf = new BinaryFormatter();
            MemoryStream ms = new MemoryStream(decryptedBytes);
            MyCustomStrokes customStrokes = bf.Deserialize(ms) as MyCustomStrokes;
            for(int i = 0; i < customStrokes.StrokeCollection.Length; i++)
            {
                if(customStrokes.StrokeCollection[i] != null)
                {
                    StylusPointCollection stylusCollection = new
                      StylusPointCollection(customStrokes.StrokeCollection[i]);
                    Stroke stroke = new Stroke(stylusCollection);
                    StrokeCollection strokes = new StrokeCollection();
                    strokes.Add(stroke);
                    this.MyInkPresenter.Strokes.Add(strokes);
                }
            }

        }
        catch (Exception ex)
        {
            System.Windows.MessageBox.Show(ex.Message);
        }
    }
[Serializable]
public sealed class MyCustomStrokes
{
    public MyCustomStrokes() { }
    /// <SUMMARY>
    /// The first index is for the stroke no.
    /// The second index is for the keep the 2D point of the Stroke.
    /// </SUMMARY>
    public Point[][] StrokeCollection;
}
person gtnewhouse    schedule 17.06.2015