Мне нужно хранить пять минут потоковой передачи данных в RAM (или альтернативу, если таковая имеется. Теперь я знаю только RAM ). Я знаю, как преобразовать данные в изображения bmp и сохранить их в списке, используя байты, используя Marshal.copy
Но размер каждого кадра составляет около 3 МБ, что слишком много для ОЗУ для хранения.
Я считаю, что размер данных мог бы быть намного меньше, если бы я просто хранил байты в массиве, но я не знаю как. В настоящий момент мне все не совсем понятно, и дни поиска методов для копирования значения указателя в управляемый массив были напрасны. Мне нужна помощь.
Что мне не хватает? Почему я не могу скопировать кусок, который могу использовать для хранения в виде BMP, в виде простого массива байтов? Как я могу преобразовать следующую функцию в функцию, которая возвращает массив?
Вот код, который я использую для преобразования данных в BMP, и мне нужно иметь возможность внести необходимые изменения, чтобы преобразовать их в функцию, которая собираетвсе данные в списке или массиве.
private Bitmap GetBitmap(ISampleGrabber i_grabber, int width, int height, int stride)
{
int sz = 0;
i_grabber.GetCurrentBuffer(ref sz, IntPtr.Zero);
if (sz == 0) return null;
var ptr = Marshal.AllocCoTaskMem(sz);
i_grabber.GetCurrentBuffer(ref sz, ptr);
var data = new byte[sz];
Marshal.Copy(ptr, data, 0, sz);
Bitmap result = null;
try
{
result = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
var bmp_data = result.LockBits(new Rectangle(Point.Empty, result.Size), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
for (int y = 0; y < height; y++)
{
var src_idx = sz - (stride * (y + 1));
//Console.WriteLine(src_idx);
var dst = new IntPtr(bmp_data.Scan0.ToInt32() + (stride * y));
Marshal.Copy(data, src_idx, dst, stride);
}
result.UnlockBits(bmp_data);
Marshal.FreeCoTaskMem(ptr);
}
catch (ArgumentException ax)
{
//System.Windows.Forms.MessageBox.Show(ax.Message);
Console.WriteLine(ax.Message);
}
return result;
}