- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在开发一个程序,将 inkcanvas 笔画转换为字节数组进行加密,然后将其保存在 txt 文件中。本质上,我需要将字节数组转换为 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 笔划。如果找到解决方案,我会更新这篇文章!
编辑:嗯。我正在使用该链接中的代码,我得到:“输入流不是有效的二进制格式。起始内容(字节)是: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;
}
最佳答案
我的问题是我没有将输出序列化到保存的文件中,因此当我加载该文件时反序列化它会触发错误。这是正确的代码:
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;
}
关于c# - 将 InkCanvas 笔划转换为字节数组并再次转换回来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30896167/
所以我试图通过使用套接字创建一个类似同步绘画程序的东西。我有一个服务器端..和一个客户端,我试图将inkCollection从服务器发送到客户端。这适用于简单的文本,但我似乎无法发送inkCollec
我正在胡思乱想,无法控制路径宽度。 看到倒数第二行,真是莫名其妙: var paper = Raphael(20, 20, 320, 320); function arc(center, radi
我想提一下,这篇文章类似于 Continuous drawing in CGContext with drawRect但它没有任何代码片段解决方案,所以再次询问。 我正在学习 iOS 开发应用程序。我
我正在创建很多元素,这些元素基本上基于模板,但具有不同的大小和颜色 - 圆圈、方框、星号、菱形、图表中经常使用的元素。我发现我可以使用 SVG Symbol 来定义我的模板,如下例所示: http:/
我正在使用 Chart.js 创建圆环图,但遇到了圆环上的笔划被 Canvas 对象 chop 的问题。 Canvas 上的填充/边距并没有为我解决问题。知道发生了什么事吗? JSFiddle her
我试过设置描边颜色。它可以使用 linearGradient 但不能使用 solidColor :
我目前正在调整文件输入以使用预览显示其内容 标签。 ..... 使用一些 CSS,它在 Chrome 上正确呈现,但我在 Firefox 上(并且仅在 Firefox 上)在正
我有一组三 Angular 坐标。每三个点一个 vector 。在下图中,这个三 Angular 形是 thin yellow 三 Angular 形。我需要向这个向内和向外突出的三 Angular
我是一名优秀的程序员,十分优秀!