C#_バイト配列分割アクション_Buffer.BlockCopy()とBinaryReader.ReadBytes()の違い

1075 ワード

以下の例は、YUV 420 Pの動作について、1フレームのYUV 420 Pを3段Y,U,Vに分割する必要がある2つの方法を提供する.効率についてはご自身でテストしてください
一:BlockCopy()
        byte[] data = new byte[Width * Height * 3 / 2];

        byte[] dataY = new byte[Width * Height];
        byte[] dataU = new byte[Width * Height / 4];
        byte[] dataV = new byte[Width * Height / 4];

        Buffer.BlockCopy(data, 0, dataY, 0, Width * Height);
        Buffer.BlockCopy(data, Width * Height, dataU, 0, Width * Height / 4);
        Buffer.BlockCopy(data, Width * Height * 5 / 4, dataV, 0, Width * Height / 4);

 
二:ReadBytes()
        byte[] data = new byte[Width * Height * 3 / 2];
        MemoryStream ms = new MemoryStream(data);
        BinaryReader reader = new BinaryReader(ms);

        byte[] dataY = reader.ReadBytes(Width * Height);
        byte[] dataU = reader.ReadBytes(Width * Height / 4);
        byte[] dataV = reader.ReadBytes(Width * Height / 4);
        

 
ps:
BlockCopy()メソッドでは、オフセット量を指定する必要があることが知られています.そうしないと、上書きされ、ReadBytes()がオフセット量を書き込むたびに進みます.