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

How can I copy pixel data from an unmanaged buffer to an Image on ImageSharp?

我有一个位于非托管堆中的图像缓冲区,我想使用 ImageSharp 对其进行操作。

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

我怎样才能做一份呢?我的图片是 Argb32 格式。

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

Anton Firsov on the 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();
}