C#字节数组到映像不能使用相同的字节数组
完整代码C#字节数组到映像不能使用相同的字节数组,c#,arrays,image,parameters,bytearray,C#,Arrays,Image,Parameters,Bytearray,完整代码 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; namespace WindowsFormsApplication1 { pu
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;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//Display byte array as image
private void button1_Click(object sender, EventArgs e)
{
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
Image img = ByteArrayToImage(File.ReadAllBytes("")); //fill with path info
pictureBox1.Image = (Image)img.Clone();
}
//Convert to image from bytes
public Image ByteArrayToImage(byte[] byteArrayIn)
{
using (MemoryStream ms = new MemoryStream(byteArrayIn))
{
ms.Position = 0;
Image returnImage = Image.FromStream(ms);
return returnImage;
}
}
//Open Image for conversion
private void loadImage_Click(object sender, EventArgs e)
{
OpenFileDialog opf = new OpenFileDialog();
DialogResult dr = new DialogResult();
dr = opf.ShowDialog();
if (dr == DialogResult.OK)
{
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
pictureBox1.Image = Image.FromFile(opf.FileName);
}
}
private void convertImage_Click(object sender, EventArgs e)
{
//Choose Path to Save To
SaveFileDialog saveDialog = new SaveFileDialog();
saveDialog.Title = "Choose Directory and File Name";
saveDialog.Filter = "Canga Comix *.CCMX|*.CCMX";
DialogResult dr = saveDialog.ShowDialog();
if (dr == DialogResult.OK)
{
byte[] array;
//Save Image
using (MemoryStream ms = new MemoryStream())
{
Image img = pictureBox1.Image;
img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
array = ms.ToArray();
}
using(FileStream fs = new FileStream(saveDialog.FileName, FileMode.Create))
{
fs.Write(array, 0, array.Length);
}
}
}
//clear image
private void clearImage_Click(object sender, EventArgs e)
{
pictureBox1.Image = null;
}
}
}
这些是相当标准的。我有一个使用这些方法的测试程序。它在pictureBox中打开图像,然后将其转换为字节[],并清除pictureBox图像。然后点击Load byte[],它将在运行ByteArrayToImage方法时正确显示图片
然后,如果我从我的另一个程序中保存一张图片,并尝试在测试程序中打开它,它会给我一个不神圣的“Parameter is not valid”错误。尽管就我所知,这两个文本文档完全相同。此代码包含一个常见问题。在这里,您可以创建一个绑定到包含位图的流的
图像
public Image ByteArrayToImage(byte[] byteArrayIn)
{
using (MemoryStream ms = new MemoryStream(byteArrayIn))
{
ms.Position = 0;
Image returnImage = Image.FromStream(ms);
return returnImage;
}
}
。。。而using
块在退出时处理MemoryStream
实例,这使得图像
相当无用
您可以通过调用Clone()
,获得一个管理自己内存的图像,而不是期望流停留在内存中:
克隆未绑定到原始流。如何保存图像?请显示完整的异常以及堆栈跟踪,以及引发异常的代码。正如其他人所指出的,“从我的其他程序中保存图片并尝试在测试程序中打开它”的代码将有助于查看。已编辑。这就是全部。我的大程序是以完全相同的方式保存图像。很高兴知道并感谢您提供的信息。但问题仍然以同样的方式存在。我可以打开一个文件,但不能打开一个完全相同但由另一个程序创建的文件。我的另一个程序也在图像上方添加了一些额外的信息,我必须手动删除这些信息,但是这些文件完全相同。我保存了,但在测试程序中无法读取。因此,我决定将文本从工作文件复制并粘贴到另一个非工作文件中,只是为了确保它们完全相同,并且仍然不起作用。然后,当我删除工作文件的内容后将其粘贴回自身时,它无法打开并抛出相同的错误。是什么原因导致了这种情况?即使修改只是删除文本并重新绘制相同的文本?文本?位图文件需要为处理二进制数据而设计的工具。图像将被转换为字节数组,然后保存到文本文件中。这是可行的,但并不始终如一。这个问题是由编码引起的吗?或者没有?也许。您至少应该使用二进制工具(例如字节的十六进制视图)来确定工作和非工作情况之间的区别。
public Image ByteArrayToImage(byte[] byteArrayIn)
{
using (MemoryStream ms = new MemoryStream(byteArrayIn))
using (Image returnImage = Image.FromStream(ms))
{
return returnImage.Clone();
}
}