使用不安全块将字节数组复制到位图
本文关键字:数组 复制 位图 字节数 字节 不安全 | 更新日期: 2023-09-27 18:29:21
我试图从一些图像代码中挤出最佳性能,但我遇到了困难。
据我所知,使用指针应该可以加快过程,但我使用指针的经验非常有限,很难找到好的文档来阅读和理解。
我说得对吗?有人能展示一个带注释的代码转换示例来帮助我理解这个过程吗。
public void UpdatePixelIndexes(IEnumerable<byte[]> lineIndexes)
{
int width = this.Image.Width;
int height = this.Image.Height;
IEnumerator<byte[]> indexesIterator = lineIndexes.GetEnumerator();
for (int rowIndex = 0; rowIndex < height; rowIndex++)
{
indexesIterator.MoveNext();
BitmapData data = this.Image.LockBits(Rectangle.FromLTRB(0, rowIndex, width, rowIndex + 1), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
try
{
Marshal.Copy(indexesIterator.Current, 0, data.Scan0, width);
}
finally
{
this.Image.UnlockBits(data);
}
}
}
这里不太可能真正需要unsafe
。按照建议,您应该停止锁定/解锁每个扫描行的位图。相反,这样做:
public void UpdatePixelIndexes(IEnumerable<byte[]> lineIndexes)
{
int width = this.Image.Width;
int height = this.Image.Height;
int rowIndex = 0;
BitmapData data = this.Image.LockBits(Rectangle.FromLTRB(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
try
{
foreach (byte[] scanLine in lineIndexes)
{
Marshal.Copy(scanLine, 0,
IntPtr.Add(data.Scan0, data.Stride * rowIndex), width);
if (++rowIndex >= height)
{
break;
}
}
}
finally
{
this.Image.UnlockBits(data);
}
}