C#将图像,音频和视频转换为字节数组

时间:2016-12-18 01:01:35

标签: c# arrays binary directx

我正在开发一个C#WinForms项目,我必须将以下内容转换为字节数组,然后使用FileStreamBinaryWriter写入二进制文件:

System.Drawing.Image image
Microsoft.DirectX.AudioVideoPlayback.Audio audio 
Microsoft.DirectX.AudioVideoPlayback.Video video

然后我必须使用FileStreamBinaryReader从二进制文件中读取它们,并将它们转换回上述文件类型。

这里是在将它们写入二进制文件之前将它们转换为字节数组的代码:

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

以下是将它们转换回原始图像,音频和视频文件的方法:

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

以下是三行代码,用于说明我如何将它们写入二进制文件:

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

第一次尝试使用public Audio Bytes2Audio(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();

当我尝试读取第二个整数时,我得到错误&#34; System.IO.EndOfStreamException:无法读取超出流的末尾。&#34;它看起来像我的BinaryReader(br)不知道它应该读取该字节数组,它应该读取下一个第二个整数。如果是这样的话,有什么更好的东西我可以用来映射字节数组的长度而不是&#34; br.ReadBytes((int)br.BaseStream.Length);&#34; < / p>

最后一行代码&#34; clsProjInfo.intTSMediaType = br.ReadInt32();&#34;当它应该读取1时,它一直读零。我猜测在读取第二个整数之前字节数组没有被完全读取。

0 个答案:

没有答案