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

标签 c# optimization bitmap copy bytearray

这是绝对最快吗?我可以可能Bitmap复制到中的Byte[] >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, 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 总线带宽限制,只有购买更昂贵的机器才能加快速度。

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

关于c# - 我可以更快地复制这个数组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5163391/

相关文章:

c# - 为 Visual Studio 安装 Hyper-V 模拟器时出错

c# - 如何在遵循 MVVM 设计模式的 WPF 应用程序中工作之前显示等待对话框?

c++ - 针对多个目标优化 A* 寻路

c# - SQLite 数据库插入错误约束

C# 属性问题

javascript - 合并对象使用 javascript 中的加法保留它的值

python - 在 Python 中按索引从列表中删除元素的简洁方法

android - setDither、setFilterBitmap 和 setAntiAlias 在 Canvas 中的作用是什么?

android - ImageView 未显示 PDFRenderer 在 Android API 29 上创建的位图中的图像

java - 如何加载原始位图,而不在 Android 上缩放?