我有一个生活在非托管堆中的图像缓冲区,我想用ImageSharp来操作它。
现在我将非托管缓冲区复制到字节数组中,然后调用Image.LoadPixelData()
,将缓冲区再次复制到图像PixelBuffer
中。
如何改为执行单一复制?我的图片格式为Argb32
。
答案 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(流))但我不确定它是否比您现在正在做的更好