如何将像素数据从非托管缓冲区复制到ImageSharp上的图像?

时间:2017-11-03 15:04:16

标签: c# .net image imagesharp

我有一个生活在非托管堆中的图像缓冲区,我想用ImageSharp来操作它。

现在我将非托管缓冲区复制到字节数组中,然后调用Image.LoadPixelData(),将缓冲区再次复制到图像PixelBuffer中。

如何改为执行单一复制?我的图片格式为Argb32

2 个答案:

答案 0 :(得分:1)

Anton Firsov上的ImageSharp gitter获得一些帮助后,我可以做我想做的事。我需要使用DangerousGetPinnableReferenceToPixelBuffer()

using(var image  = new Image<Argb32>(surfaceLock.Width, surfaceLock.Height))
using(var output = new MemoryStream()) {
    unsafe {
        fixed(void* buffer = &image.DangerousGetPinnableReferenceToPixelBuffer()) {
            memcpy((IntPtr)buffer, surfaceLock.Buffer, surfaceLock.SlicePitchInBytes);
        }
    }
    image.Save(output, jpegEncoder);
    return output.ToArray();
}

答案 1 :(得分:0)

您可以创建UnmanagedMemoryStream,然后创建Image.Load(流))但我不确定它是否比您现在正在做的更好