将二维结构数组复制到 byte[]

发布于 2024-11-01 05:36:52 字数 412 浏览 2 评论 0原文

我有类似的事情:

[StructLayout(LayoutKind.Explicit)]
public struct PixelColorRGBA
{
    [FieldOffset(0)]
    public UInt32 ColorBGRA;
    [FieldOffset(0)]
    public byte Blue;
    [FieldOffset(1)]
    public byte Green;
    [FieldOffset(2)]
    public byte Red;
    [FieldOffset(3)]
    public byte Alpha;
}

将 PixelColorRGBA[w, h] 复制到 byte[w * h * 4] 的最快方法是什么,反之亦然?

I have something like that:

[StructLayout(LayoutKind.Explicit)]
public struct PixelColorRGBA
{
    [FieldOffset(0)]
    public UInt32 ColorBGRA;
    [FieldOffset(0)]
    public byte Blue;
    [FieldOffset(1)]
    public byte Green;
    [FieldOffset(2)]
    public byte Red;
    [FieldOffset(3)]
    public byte Alpha;
}

What is the fastest way to copy PixelColorRGBA[w, h] to byte[w * h * 4] and vise versa?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

末骤雨初歇 2024-11-08 05:36:52

我最终得到以下代码:

var source = new PixelColorRGBA[1000, 1000];
var destination = new byte[4000000];
{
    var start = DateTime.Now;
    unsafe
    {
        for (var q = 0; q < 100; q++)
            fixed (PixelColorRGBA* tmpSourcePtr = &source[0, 0])
            {
                var sourcePtr = (IntPtr) tmpSourcePtr;
                Marshal.Copy(sourcePtr, destination, 0, 4000000);
            }
    }
    Console.WriteLine("MS: " + DateTime.Now.Subtract(start).TotalMilliseconds);
}

在我的计算机上需要 62 毫秒。

I end up with the following code:

var source = new PixelColorRGBA[1000, 1000];
var destination = new byte[4000000];
{
    var start = DateTime.Now;
    unsafe
    {
        for (var q = 0; q < 100; q++)
            fixed (PixelColorRGBA* tmpSourcePtr = &source[0, 0])
            {
                var sourcePtr = (IntPtr) tmpSourcePtr;
                Marshal.Copy(sourcePtr, destination, 0, 4000000);
            }
    }
    Console.WriteLine("MS: " + DateTime.Now.Subtract(start).TotalMilliseconds);
}

It takes 62 ms on my computer.

扶醉桌前 2024-11-08 05:36:52

尝试以下操作

    PixelColorRGBA[,] source = ...;
    byte[] dest = source
        .Cast<PixelColorRGBA>()
        .SelectMany(x => new byte[] { x.Blue, x.Green, x.Red, x.Alpha })
        .ToArray();

Try the following

    PixelColorRGBA[,] source = ...;
    byte[] dest = source
        .Cast<PixelColorRGBA>()
        .SelectMany(x => new byte[] { x.Blue, x.Green, x.Red, x.Alpha })
        .ToArray();
暮色兮凉城 2024-11-08 05:36:52

您可以使用

System.Buffer.BlockCopy(myArray, 0, byteArray, 0, length) 

System.Runtime.InteropServices.Marshal.Copy(myArray, 0, destPtr, length);

You can use

System.Buffer.BlockCopy(myArray, 0, byteArray, 0, length) 

or

System.Runtime.InteropServices.Marshal.Copy(myArray, 0, destPtr, length);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文