从一个位图指向另一个数组的多个指针

问题描述 投票:0回答:1

我有一种使用Bitmapbyte复制到Marshal.Copy数组的方法:

    public byte[][] PrepareTestSamples(Bitmap bitmap, int imageCount, out BitmapData bitmapData)
    {
        bitmapData = bitmap.LockBits(
            new Rectangle(0, 0, bitmap.Width, bitmap.Height),
            ImageLockMode.ReadWrite,
            bitmap.PixelFormat);

        int pixelsCount = bitmapData.Stride * bitmap.Height;
        byte[][] images = new byte[imageCount * 3][];

        for (int i = 0; i < imageCount * 3; i++)
        {
            images[i] = new byte[pixelsCount];
            Marshal.Copy(bitmapData.Scan0, images[i], 0, pixelsCount);
        }

        return images;
    }

并且此代码运行完美。我可以将图像复制到字节数组imageCount * 3次。

然后我使用此数组来测试我的算法。任何算法的定义如下所示:

    byte[] Execute(byte[] pixels, int stride, int height, int width);

执行算法后,我将返回具有更改像素的新byte[]。然后,我再次使用Bitmap将其复制回新的Lockbits

var bmp = new Bitmap(bitmap.Width, bitmap.Height);
BitmapData bmpData = bmp.LockBits(
           new Rectangle(0, 0, bmp.Width, bmp.Height),
           ImageLockMode.ReadWrite,
           bitmap.PixelFormat);

        Marshal.Copy(images[1], 0, bmpData.Scan0, images[1].Length);
        bmp.UnlockBits(bmpData);

我想使用pointers测试程序。我想检查一下,在这种情况下指针是否会比托管内存快。

我认为,任何算法的定义都必须更改为:

byte[] Execute(byte* pixels, int stride, int height, int width);

但是我有疑问,如何将BitmapData复制到指针数组之类的东西?如何将imagesCount * 3图像存储为指针,并将pointer一张一张地传递给方法?

c# image pointers bitmap marshalling
1个回答
0
投票

您的代码看起来像这样

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    class Program
    {
        public struct BitmapData
        {
            public int stride { get; set; }
            public int height { get; set; }
            public int width { get; set; }
            public long length { get; set; }
            public byte[] pixels { get; set; } 
        }
        public class ManagedBitmapData
        {
            public int stride { get; set; }
            public int height { get; set; }
            public int width { get; set; }
            public long length { get; set; }
            public byte[] pixels { get; set; }
        }

        static void Main(string[] args)
        {
            //source data
            List<ManagedBitmapData> managedData = new List<ManagedBitmapData>();
            IntPtr[] UnmanagedData = new IntPtr[managedData.Count];
            BitmapData[] bitMaps = new BitmapData[managedData.Count];
            for (int i = 0; i < managedData.Count; i++)
            {
                bitMaps[i] = new BitmapData();
                bitMaps[i].stride = managedData[i].stride;
                bitMaps[i].height = managedData[i].height;
                bitMaps[i].width = managedData[i].width;
                bitMaps[i].length = managedData[i].length;
                bitMaps[i].pixels = managedData[i].pixels;
                Marshal.StructureToPtr(bitMaps[i], UnmanagedData[i], true);
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.