Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#将图像、音频和视频与字节数组进行转换_C#_Arrays_Binary_Directx - Fatal编程技术网

C#将图像、音频和视频与字节数组进行转换

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从二进制文件中读取它们,并将它

我正在从事一个C#WinForms项目,在该项目中,我必须将以下内容转换为字节数组,然后使用
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”读取整个流,我如何从头到尾读取音频,然后读取后面的内容而不让读取器溢出?如何存储这些字节?需要有关存储它们的结构的更多信息,例如是否将多种媒体类型(图像/视频/音频)存储在一个文件中,或者它们分别存储在不同的文件中,以及是否仅存储数据或是否向其中添加了更多信息。顺便说一句,您总是可以从文件属性和文件内容中获取媒体类型和创建日期。