如何将像素数据从非托管缓冲区复制到 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();
}
我有一个位于非托管堆中的图像缓冲区,我想使用 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();
}