使用不安全块将字节数组复制到位图

本文关键字:数组 复制 位图 字节数 字节 不安全 | 更新日期: 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);
    }
}