Wic Bitmap из необработанных байтов - PullRequest
0 голосов
/ 14 октября 2019

Мой секвенсор поддерживает видео, поэтому я хочу отображать растровые изображения в редакторе. Идея состоит в том, чтобы иметь растровое изображение WIC, обработать его некоторыми фильтрами, а затем отобразить его с Direct2D.

Когда я загружаю растровое изображение WIC из изображения, все хорошо. Я использую IWICImagingFactory :: CreateDecoderFromFilename (), GetFrame () и конвертер в GUID_WICPixelFormat32bppPBGRA. Я могу отобразить растровое изображение с Direct2D ID2D1RenderTarget :: CreateBitmapFromWicBitmap (), и я также могу сохранить WIC в jpg (проверка ошибок удалена, все вызовы возвращают S_OK):

// Create and initialize WIC Bitmap Encoder.
CComPtr<IWICBitmapEncoder> wicBitmapEncoder;
auto hr = WbF()->CreateEncoder(
    wicFormat,
    nullptr,    // No preferred codec vendor.
    &wicBitmapEncoder
);

wicBitmapEncoder->Initialize(&vs,WICBitmapEncoderNoCache);

// Create and initialize WIC Frame Encoder.
CComPtr<IWICBitmapFrameEncode> wicFrameEncode;
wicBitmapEncoder->CreateNewFrame(&wicFrameEncode,nullptr);

wicFrameEncode->Initialize(nullptr);
wicFrameEncode->SetSize(W, H);
WICPixelFormatGUID gg;
gg = GUID_WICPixelFormat32bppPBGRA;
wicFrameEncode->SetPixelFormat(&gg);

wicFrameEncode->WriteSource(wic, NULL);
wicFrameEncode->Commit();
wicBitmapEncoder->Commit();

СтранноДело в том, когда я создаю растровое изображение WIC из необработанных байтов. Это может произойти при чтении видео, в котором я получаю кадр, используя метод Media Foundation IMFSourceReader :: ReadSample, и это возвращает мне необработанный байтовый кадр (преобразованный в RGBA с помощью преобразователей Media Foundation).

На этот раз Direct2D все еще работает и WIC все еще создается;

CComPtr<IWICBitmap> wb;
auto hr = WbF()->CreateBitmapFromMemory(width, height, GUID_WICPixelFormat32bppPBGRA, Width * 4, raw.size() * sizeof(DWORD), (BYTE*)raw.data(), &wb);

Direct2D успешно отрисовывает изображение, поэтому буфер действителен. Однако приведенный выше код не работает. В результате получается черный файл JPG.

Кроме того, этот WIC нельзя использовать при обработке эффектов Direct2D. Когда я передаю его в механизм действия:

    CComPtr<ID2D1Effect> eff;
    m_d2dContext->CreateEffect(CLSID_D2D1Sepia, &eff);

    // Input bitmap
    CComPtr<ID2D1Effect> bitmapSourceEffect;
    m_d2dContext->CreateEffect(CLSID_D2D1BitmapSource, &bitmapSourceEffect);

    bitmapSourceEffect->SetValue(D2D1_BITMAPSOURCE_PROP_WIC_BITMAP_SOURCE, wic);
    eff->SetInputEffect(0, bitmapSourceEffect);

    eff->SetValue(D2D1_SEPIA_PROP_INTENSITY, 0.5f);
    eff->SetValue(D2D1_SEPIA_PROP_ALPHA_MODE, D2D1_ALPHA_MODE_PREMULTIPLIED);

    m_d2dContext->BeginDraw();
    D2D1_COLOR_F black = { 0,0,0,1.0f };
    ct->d->m_d2dContext->Clear(black);
    ct->d->m_d2dContext->DrawImage(eff);
    ct->d->m_d2dContext->EndDraw();

Приведенный выше код ничего не рисует (только черный bg). Когда WIC загружается из изображения, этот код успешно обрабатывает изображение Wic.

Что может быть не так?

Редактировать: Хорошо, это действительно странно. Я получаю образцы видео в формате MFVideoFormat_ARGB32.

Когда я использую CreateBitmapFromMemory с GUID_WICPixelFormat32bppBGRA, изображение может быть корректно сохранено в поток, но затем Direct2D отображает пустое изображение (изображение преобразуется с помощью IWICFormatConverter в GUID_WPPPP с помощью IWICFormatConver)ID2D1REnderTarget :: CreateBitmapFromWicBitmap возвращает S_OK, но растровое изображение пусто).

Когда я использую CreateBitmapFromMemory с GUID_WICPixelFormat32bppPBGRA, изображение не может быть сохранено в поток (оно сохраняет пустое изображение), но оно отображается правильно с помощью Direct2.

...