加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 我可以更快地复制这个数组吗?

发布时间:2020-12-15 04:30:55 所属栏目:百科 来源:网络整理
导读:这是绝对最快的我可以将位图复制到C#中的字节[]吗? 如果有一种更快的方式我很想知道! const int WIDTH = /* width */;const int HEIGHT = /* height */;Bitmap bitmap = new Bitmap(WIDTH,HEIGHT,PixelFormat.Format32bppRgb);Byte[] bytes = new byte[WID
这是绝对最快的我可以将位图复制到C#中的字节[]吗?

如果有一种更快的方式我很想知道!

const int WIDTH = /* width */;
const int HEIGHT = /* height */;


Bitmap bitmap = new Bitmap(WIDTH,HEIGHT,PixelFormat.Format32bppRgb);
Byte[] bytes = new byte[WIDTH * HEIGHT * 4];

BitmapToByteArray(bitmap,bytes);


private unsafe void BitmapToByteArray(Bitmap bitmap,Byte[] bytes)
{
    BitmapData bitmapData = bitmap.LockBits(new Rectangle(0,WIDTH,HEIGHT),ImageLockMode.ReadOnly,PixelFormat.Format32bppRgb);

    fixed(byte* pBytes = &bytes[0])
    {
        MoveMemory(pBytes,bitmapData.Scan0.ToPointer(),WIDTH * HEIGHT * 4);
    }

    bitmap.UnlockBits(bitmapData);
}

[DllImport("Kernel32.dll",EntryPoint = "RtlMoveMemory",SetLastError = false)]
private static unsafe extern void MoveMemory(void* dest,void* src,int size);

解决方法

好吧,使用 Marshal.Copy()会更明智,至少可以减少查找DLL导出的(一次性)成本.但就是这样,它们都使用C运行时memcpy()函数.速度完全受RAM总线带宽限制,只需购买更昂贵的机器就可以加快速度.

请注意,分析很棘手,第一次访问位图数据会导致页面错误,从而将像素数据导入内存.这需要多长时间取决于您的硬盘正在做什么以及文件系统缓存的状态.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读