将图像转换为字节并将其分成块

时间:2020-08-14 02:26:33

标签: c#

我试图将图像文件读取为字节,然后将这些字节分成较小的块,如下面的代码所示。有人可以指导我这样做是否正确和有效吗?请帮忙。

public static IEnumerable<IEnumerable<char>> ReadByChunk(int chunkSize)
            {
                IEnumerable<char> result;
                int startByte = 0;
                do
                {
                    result = ReadBytes(startByte, chunkSize);
                    startByte += chunkSize;
                    yield return result;
                }
                while (result.Any());
            }
    
            public static IEnumerable<char> ReadBytes(int startByte, int byteToRead)
            {
                char[] result;
                byte[] b = File.ReadAllBytes(@"C:\Users\1.jpg");
                for (int i = startbyte; i <= b.length; i++)
                {
                    result = b;
                }
                return result;
            }            
            public static void Main()
            {
                const int chunkSize = 2048;
                foreach (IEnumerable<byte> bytes in ReadByChunk(chunkSize))
                {
                  //more code
                
                }
            }

1 个答案:

答案 0 :(得分:2)

您的代码有很多问题:

  1. 每次调用ReadBytes都会将整个文件读入内存。
  2. for中的ReadBytes循环实际上并不对结果进行分块,它只是将b分配给result,这意味着此方法的结果始终是整个文件。
  3. 出于某种原因,您正尝试将char用于二进制数据。这不是一个好主意,因为文本编码不适用于二进制数据。例如,使用UTF8对任意字节序列进行编码,然后反转将无法获得相同的字节值。
  4. 由于ReadBytes始终返回整个文件,因此while (result.Any())将永远循环(除非文件为空)。

这是一种更正确的方法:

public static IEnumerable<IEnumerable<byte>> ReadByChunk(int chunkSize)
{
    using (var reader = File.OpenRead("filename")) // open the file as a stream
    {
        byte[] chunk = new byte[chunkSize]; // create a byte array equal to our chunkSize
        int bytesRead = 0;
        // when `Read` returns `0`, it means we've reached the end of the file
        // so loop while the number of bytes read is > 0
        while ((bytesRead = reader.Read(chunk, 0, chunkSize)) > 0)
        {
            // take the actual number of bytes read and return
            // this chunk as an array
            yield return chunk.Take(bytesRead).ToArray();
        }
    }
}