C#_バイト配列分割アクション_Buffer.BlockCopy()とBinaryReader.ReadBytes()の違い
1075 ワード
以下の例は、YUV 420 Pの動作について、1フレームのYUV 420 Pを3段Y,U,Vに分割する必要がある2つの方法を提供する.効率についてはご自身でテストしてください
一:BlockCopy()
二:ReadBytes()
ps:
BlockCopy()メソッドでは、オフセット量を指定する必要があることが知られています.そうしないと、上書きされ、ReadBytes()がオフセット量を書き込むたびに進みます.
一: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()がオフセット量を書き込むたびに進みます.