C#将图像、音频和视频与字节数组进行转换
我正在从事一个C#WinForms项目,在该项目中,我必须将以下内容转换为字节数组,然后使用C#将图像、音频和视频与字节数组进行转换,c#,arrays,binary,directx,C#,Arrays,Binary,Directx,我正在从事一个C#WinForms项目,在该项目中,我必须将以下内容转换为字节数组,然后使用FileStream和BinaryWriter写入二进制文件: System.Drawing.Image image Microsoft.DirectX.AudioVideoPlayback.Audio audio Microsoft.DirectX.AudioVideoPlayback.Video video 然后我必须使用FileStream和BinaryReader从二进制文件中读取它们,并将它
FileStream
和BinaryWriter
写入二进制文件:
System.Drawing.Image image
Microsoft.DirectX.AudioVideoPlayback.Audio audio
Microsoft.DirectX.AudioVideoPlayback.Video video
然后我必须使用FileStream
和BinaryReader
从二进制文件中读取它们,并将它们转换回上述文件类型
以下是在将其写入二进制之前将其转换为字节数组的代码:
public byte[] Image2Bytes(Image imgImage2Convert)
{
using (var ms = new MemoryStream())
{
imgImage2Convert.Save(ms, imgImage2Convert.RawFormat);
return ms.ToArray();
}
}
public byte[] Audio2Bytes(Audio audAudio2Convert)
{
var bytes = default(byte[]);
using (var memstream = new MemoryStream())
{
StreamReader reader = new StreamReader(memstream);
var buffer = new byte[512];
var bytesRead = default(int);
while ((bytesRead = reader.BaseStream.Read(buffer, 0, buffer.Length)) > 0)
memstream.Write(buffer, 0, bytesRead);
bytes = memstream.ToArray();
return bytes;
}
}
public byte[] Video2Bytes(Video vidVideo2Convert)
{
var bytes = default(byte[]);
using (var memstream = new MemoryStream())
{
StreamReader reader = new StreamReader(memstream);
var buffer = new byte[512];
var bytesRead = default(int);
while ((bytesRead = reader.BaseStream.Read(buffer, 0, buffer.Length)) > 0)
{
memstream.Write(buffer, 0, bytesRead);
}
bytes = memstream.ToArray();
return bytes;
}
}
bw.Write(GameInfo.bytTSImage);
bw.Write(GameInfo.bytTSAudio);
bw.Write(GameInfo.bytTSVideo);
以下是将它们转换回原始图像、音频和视频文件的方法:
public Image Bytes2Image(byte[] bytBytes2Convert)
{
MemoryStream ms = new MemoryStream(bytBytes2Convert, 0, bytBytes2Convert.Length);
Image returnImage = Image.FromStream(ms, true);
return returnImage;
}
public Audio Bytes2Audio(byte[] bytBytes2Convert)
{
string strTempFile = Path.GetTempPath() + "\\MyTempFile.mp3";
System.IO.File.WriteAllBytes(strTempFile, bytBytes2Convert);
Microsoft.DirectX.AudioVideoPlayback.Audio audConvertedAudio = Audio.FromFile(strTempFile);
DeleteTempFile(strTempFile);
return audConvertedAudio;
}
public Video Bytes2Video(byte[] bytBytes2Convert)
{
string strTempFile = Path.GetTempPath() + "MyTempFile.wmv";
File.WriteAllBytes(strTempFile, bytBytes2Convert);
Video vidConvertedVideo = Video.FromFile(strTempFile);
DeleteTempFile(strTempFile);
return vidConvertedVideo;
}
下面是三行代码,说明我是如何将它们写入二进制的:
public byte[] Image2Bytes(Image imgImage2Convert)
{
using (var ms = new MemoryStream())
{
imgImage2Convert.Save(ms, imgImage2Convert.RawFormat);
return ms.ToArray();
}
}
public byte[] Audio2Bytes(Audio audAudio2Convert)
{
var bytes = default(byte[]);
using (var memstream = new MemoryStream())
{
StreamReader reader = new StreamReader(memstream);
var buffer = new byte[512];
var bytesRead = default(int);
while ((bytesRead = reader.BaseStream.Read(buffer, 0, buffer.Length)) > 0)
memstream.Write(buffer, 0, bytesRead);
bytes = memstream.ToArray();
return bytes;
}
}
public byte[] Video2Bytes(Video vidVideo2Convert)
{
var bytes = default(byte[]);
using (var memstream = new MemoryStream())
{
StreamReader reader = new StreamReader(memstream);
var buffer = new byte[512];
var bytesRead = default(int);
while ((bytesRead = reader.BaseStream.Read(buffer, 0, buffer.Length)) > 0)
{
memstream.Write(buffer, 0, bytesRead);
}
bytes = memstream.ToArray();
return bytes;
}
}
bw.Write(GameInfo.bytTSImage);
bw.Write(GameInfo.bytTSAudio);
bw.Write(GameInfo.bytTSVideo);
这里有三行代码来演示我如何从二进制文件中读取它们:
clsProjInfo.bytTSImage = br.ReadBytes((int)br.BaseStream.Length);
clsProjInfo.bytTSAudio = br.ReadBytes((int)br.BaseStream.Length);
clsProjInfo.bytTSVideo = br.ReadBytes((int)br.BaseStream.Length);
当我第一次尝试使用公共音频bytes2音频(byte[]bytBytes2Convert)
将字节数组转换回音频时,会发生此错误:
错误为“System.IO.EndOfStreamException:无法读取流结尾以外的内容。”
此错误发生在我尝试使用ReadInt32()读取整数值的行上代码>
我是否正确地将文件转换为字节数组?这是我怀疑自己做错的第一件事。或者br.ReadBytes((int)br.BaseStream.Length)
是从二进制文件读取的一种糟糕方法吗
这里有更多的信息:
首先读取字符串,然后读取整数,然后读取字节数组,所有顺序如下所示:
clsProjInfo.strCreationDate = br.ReadString();
clsProjInfo.intTSMediaType = br.ReadInt32();
clsProjInfo.bytTSImage = br.ReadBytes((int)br.BaseStream.Length);
然后,在读取字节数组(clsProjInfo.bytTSImage)之后,我接下来尝试读取第二个整数:
clsProjInfo.intTSMediaType = br.ReadInt32();
当我试图读取第二个整数时,我得到了错误“System.IO.EndOfStreamException:无法读取超过流末尾的数据。”在我看来,我的BinaryReader(br)不知道应该读取该字节数组,接下来应该读取第二个整数。如果是这样的话,我是否可以使用更好的方法来映射字节数组的长度,而不是“br.ReadBytes((int)br.BaseStream.length);”
最后一行代码“clsProjInfo.intTSMediaType=br.ReadInt32();”在应该读取1的时候一直读取零。我猜字节数组在读取第二个整数之前没有被完全读取。memstream.Write(buffer,0,bytesRead)
应该是memstream.Write(buffer,0,buffer.Length)
谢谢你指出这一点,伙计。我刚刚更新了问题,提供了更多关于我的情况的信息。你想读什么?您正在存储整个视频/图像/音频,而不存储任何字符串或创建日期,然后尝试单独读取它们br.ReadBytes((int)br.BaseStream.Length)
读取整个流,我有点希望您在那一行出现错误。好吧,如果“(int)br.BaseStream.Length”读取整个流,我如何从头到尾读取音频,然后读取后面的内容而不让读取器溢出?如何存储这些字节?需要有关存储它们的结构的更多信息,例如是否将多种媒体类型(图像/视频/音频)存储在一个文件中,或者它们分别存储在不同的文件中,以及是否仅存储数据或是否向其中添加了更多信息。顺便说一句,您总是可以从文件属性和文件内容中获取媒体类型和创建日期。