我有一种使用Bitmap
将byte
复制到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
一张一张地传递给方法?
您的代码看起来像这样
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);
}
}
}
}