我有一个位于非托管堆中的图像缓冲区,我想用 ImageSharp 操作它。
现在我将非托管缓冲区复制到一个字节数组中,然后调用Image.LoadPixelData()
which 将缓冲区再次复制到图像PixelBuffer
中。
我怎样才能做一个副本呢?我的图像是Argb32
格式的。
我有一个位于非托管堆中的图像缓冲区,我想用 ImageSharp 操作它。
现在我将非托管缓冲区复制到一个字节数组中,然后调用Image.LoadPixelData()
which 将缓冲区再次复制到图像PixelBuffer
中。
我怎样才能做一个副本呢?我的图像是Argb32
格式的。
在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();
}
你可以创建 UnmanagedMemoryStream 然后 Image.Load(stream)) 但我不确定它是否比你现在做的更好