2015-06-17 7 views
2

Я работаю над программой, которая преобразует штрихи inkcanvas в массив байтов для шифрования, а затем сохраняет его в txt-файле. По сути, мне нужно преобразовать массив байтов в штрихи 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); 

    } 

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

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

код я использую:

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; 
} 

}

+0

Попробуйте взглянуть на это: [Сохранение перестроения InkCanvas Strokes] (http://www.codeproject.com/Articles/16579/Saving-Rebuilding-InkCanvas-Strokes). Похоже, это может быть полезно. – Jashaszun

+0

Jashaszun, спасибо! Я видел это и решил проверить его перед обедом. Я буду обновлять сообщение и отвечать на мой вопрос, если он работает. – gtnewhouse

+1

Это не то, как работает WPF. Единственный способ получить растровое изображение - начать с WPF-отображаемого объекта (в данном случае холста, презентатора и т. Д.) И сделать это, например, 'RenderTargetBitmap'. Другими словами, вопрос «как сохранить/загрузить штрихи» полностью отделен от вопроса «как сделать штрихи в растровое изображение». Пожалуйста, выясните, с каким вопросом вам нужна помощь, и отредактируйте/опубликуйте вопрос, чтобы включить [хороший, _minimal_, _complete_ пример кода] (http://stackoverflow.com/help/mcve), который четко показывает, что вы пробовали, и с чем вы столкнулись. –

ответ

0

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

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; 
}