0

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

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

我怎样才能做一个副本呢?我的图像是Argb32格式的。

4

2 回答 2

2

Anton FirsovImageSharp 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();
}
于 2017-11-22T14:29:52.933 回答
0

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

于 2017-11-03T18:13:01.230 回答