У меня есть экземпляр EmguCV.Image<Brg, Byte>()
и другой сторонний API, для которого требуется Stream
, который представляет данные изображения.Как эффективно получать поток от изображения EmguCV (OpenCV)
Мне удалось преобразовать изображение EmguCV в поток и передать его стороннему API с помощью System.Drawing.Bitmap.Save
, но это не очень эффективно.
Как получить поток как можно более аффилированным?
Этот код работает:
var image = new Image<Rgb, byte>("photo.jpg");
var bitmap = image.Bitmap// System.Drawing - this takes 108ms!
using (var ms = new MemoryStream())
{
bitmap.Save(ms, ImageFormat.Bmp); //not very efficient neither
ms.Position = 0;
return ImageUtils.load(ms); //the 3rd party API
}
Я пытался создать UnmanagedMemoryStream
непосредственно с изображения:
byte* pointer = (byte*)image.Ptr.ToPointer();
int length = image.Height*image.Width*3;
var unmanagedMemoryStream = new UnmanagedMemoryStream(pointer, length);
, но когда я пытаюсь читать из него, он бросает AccessViolationException
: Пытались чтение или запись защищенной памяти.
for (int i = 0; i < length; i++)
{
//throw AccessViolationException at random interation, e.g i==82240, 79936, etc
unmanagedMemoryStream.ReadByte();
}
длина в данном случае 90419328 и shoudl быть правильным, поскольку он имеет такое же значение, как image.ManagedArray.Length;
Как получить поток без копирования данных?