Я пытаюсь преобразовать биты PlanarImage в буфер pRgb32 в приложении WPF, чтобы отобразить его на моей виртуальной веб-камере, предоставленной VcamSDK. Я не знаю, что такое pRgb32buffer, но он необходим в качестве параметра наложения в VcamSDK от e2eSoft. Документация по методу addOverlay следующая:
HRESULT AddOverlay([in] VARIANT pRgb32Buffer, [in] ULONG width, [in] ULONG height
, [in] LONG px, [in] LONG py, [in] ULONG whichOne);
Add an image overlay to current VCam video.
pRgb32Buffer: overlay image buffer, in RGB32 format (with alpha channel), size is
[width x height], if it's NULL, this overlay (whichOne) will be removed;
px, py: overlay position, [0, 0] is left-top point;
whichOne: VCam support 5 image overlay (0~4).
А код для PlanarImage выглядит следующим образом: PixelFormat - Bgr32, поэтому также требуется небольшое преобразование;
void _nui_VideoFrameReady(object sender, ImageFrameReadyEventArgs e)
PlanarImage Image = e.ImageFrame.Image;
video.Source = BitmapSource.Create(
Image.Width, Image.Height, 96, 96, PixelFormats.Bgr32, null,
Image.Bits, Image.Width * Image.BytesPerPixel);
Я искал pRgb32 в Google, но нашел только ограниченную информацию, и нет примера документации по vCam SDK.
Я не специалист по обработке изображений, поэтому любая помощь приветствуется! Спасибо!
Edit:
Я думаю, что могу использовать метод PlayVideoFile(string fileName);
, который также существует в SDK, но для его отображения требуется Uri изображения. И я не могу сохранить его на жестком диске для некоторых ограничений в моем приложении (я могу много раз менять изображение и создавать потоковое видео из изображений, и если я пытаюсь сохранить его, среда выполнения выдает ошибку, что она в данный момент находится в Использовать), я не женат, что есть взлом или что-нибудь еще, чтобы отправить изображение на макете как Uri в параметрах?
UPDATE:
Мне удалось выполнить следующее преобразование битов, так как я понял, что Kinect не использует альфа-канал, поэтому он отправлял все альфа-биты 0. Сначала я решил эту проблему (изображение было невидимым из-за 0 альфа), затем я сделали следующее преобразование из BGRA (Kinect) в ABGR (желаемый формат пикселей). Документ был своего рода бредовым, говоря, что он в формате RGB с альфа-каналом, чтобы понять, что настоящий формат - ABGR, потребовалось немного времени.
Вот преобразование:
for (int i = 0; i < myBits.Length; i+=4)
{
for (int j = 0; j < 4; j++)
{
tempBit = myBits[i + j];
myBits[i + j] = myBits[i + 3];
myBits[i + 3] = tempBit;
}
myBits[i] = 255;
}
Если кто-нибудь может помочь мне сделать это более эффективно, я буду рад принять их ответы. Иначе я не знаю, как закрыть вопрос?