我想在C#中打开一个位图文件作为字节数组,并替换该数组中的某些字节,并再次将Byte数组重写为磁盘作为位图。
我目前的方法是读入byte []数组,然后将该数组转换为列表以开始编辑单个字节。
originalBytes = File.ReadAllBytes(path);
List<byte> listBytes = new List<Byte>(originalBytes);
如何用每次用户配置/不同的字节替换数组中的每个第n个字节并重写回文件?
答案 0 :(得分:3)
不需要List<byte>
用customByte
var n = 5;
byte customByte = 0xFF;
var bytes = File.ReadAllBytes(path);
for (var i = 0; i < bytes.Length; i++)
{
if (i%n == 0)
{
bytes[i] = customByte;
}
}
File.WriteAllBytes(path, bytes);
答案 1 :(得分:2)
假设你想用相同的新字节替换每个第n个字节,你可以做这样的事情(每隔3个字节显示一次):
int n = 3;
byte newValue = 0xFF;
for (int i = n; i < listBytes.Count; i += n)
{
listBytes[i] = newValue;
}
File.WriteAllBytes(path, listBytes.ToArray());
当然,您也可以使用花哨的LINQ表达式来实现这一点,我觉得这个表达式更难以阅读。
答案 2 :(得分:1)
从技术上讲,您可以实现以下目标:
// ReadAllBytes returns byte[] array, we have no need in List<byte>
byte[] data = File.ReadAllBytes(path);
// starting from 0 - int i = 0 - will ruin BMP header which we must spare
// if n is small, you may want to start from 2 * n, 3 * n etc.
// or from some fixed offset
for (int i = n; i < data.Length; i += n)
data[i] = yourValue;
File.WriteAllBytes(path, data);
请注意, Bitmap 文件有一个标题
https://en.wikipedia.org/wiki/BMP_file_format
这就是为什么我从n
开始循环,而不是从0
开始循环