Freigeben über


JPEG YCbCr-Unterstützung

Ab Windows 8.1 unterstützt der WIC-JPEG-Codec (Windows Imaging Component) das Lesen und Schreiben von Bilddaten in seiner nativen YCbCr-Form. WIC YCbCr-Unterstützung kann in Verbindung mit Direct2D verwendet werden, um Pixeldaten von YCbCr mit einem Bildeffekt zu rendern. Darüber hinaus kann der WIC JPEG-Codec YCbCr Pixeldaten nutzen, die von bestimmten Kameratreibern über Media Foundation erzeugt werden.

YCbCr Pixeldaten verbrauchen deutlich weniger Arbeitsspeicher als BGRA-Standardpixelformate. Darüber hinaus können Sie durch den Zugriff auf YCbCr-Daten einige Phasen der JPEG-Decodierungs-/Codierungspipeline in Direct2D auslagern, das GPU-beschleunigt ist. Durch die Verwendung von YCbCr kann Ihre App den JPEG-Speicherverbrauch und die Ladezeiten für die gleiche Größe und Qualität von Bildern reduzieren. Oder Ihre App kann mehr JPEG-Bilder mit höherer Auflösung verwenden, ohne leistungseinbußen zu erleiden.

In diesem Thema wird beschrieben, wie YCbCR-Daten funktionieren und wie sie in WIC und Direct2D verwendet werden.

Informationen zu JPEG YCbCr-Daten

In diesem Abschnitt werden einige wichtige Konzepte erläutert, die erforderlich sind, um zu verstehen, wie die YCbCr-Unterstützung in WIC funktioniert, und ihre wichtigsten Vorteile.

YCbCr Farbmodell

WIC in Windows 8 und früheren Versionen unterstützt vier verschiedene Farbmodelle, von denen RGB/BGR am häufigsten ist. Dieses Farbmodell definiert Farbdaten mithilfe roter, grüner und blauer Komponenten. Es kann auch eine vierte Alphakomponente verwendet werden.

Hier sehen Sie ein Bild, das in seine roten, grünen und blauen Komponenten zerlegt ist.

ein Bild, das in seine roten, grünen und blauen Komponenten zerlegt wurde.

YCbCr ist ein alternatives Farbmodell, das Farbdaten mit einer Leuchtdichtekomponente (Y) und zwei Chrominanzkomponenten (Cb und Cr) definiert. Es wird häufig in digitalen Bild- und Videoszenarien verwendet. Der Begriff YCbCr wird häufig synonym mit YUV verwendet, obwohl die beiden technisch unterschiedlich sind.

Es gibt mehrere Varianten von YCbCr , die sich in Farbraum und dynamischen Bereichsdefinitionen unterscheiden – WIC unterstützt speziell JPEG JFIF YCbCr-Daten . Weitere Informationen finden Sie in der SPEZIFIKATION JPEG ITU-T81.

Hier sehen Sie ein Bild, das in die Y-, Cb- und Cr-Komponenten zerlegt ist.

ein Bild, das in seine y-, cb- und cr-Komponenten zerlegt wurde.

Planare und verschachtelte Speicherlayouts

In diesem Abschnitt werden einige Unterschiede zwischen dem Zugriff auf und dem Speichern von RGB-Pixeldaten im Arbeitsspeicher im Vergleich zu YCbCr-Daten beschrieben.

RGB-Pixeldaten werden in der Regel mit einem überlappenden Speicherlayout gespeichert. Dies bedeutet, dass Daten für eine einzelne Farbkomponente zwischen Pixeln überlappen und jedes Pixel zusammenhängend im Arbeitsspeicher gespeichert wird.

Hier ist eine Abbildung, die RGBA-Pixeldaten zeigt, die in einem überlappenden Speicherlayout gespeichert sind.

Abbildung: Rgba-Pixeldaten, die in einem verschachtelten Speicherlayout gespeichert sind.

YCbCR-Daten werden in der Regel mit einem planaren Speicherlayout gespeichert. Dies bedeutet, dass jede Farbkomponente separat in einer eigenen zusammenhängenden Ebene für insgesamt drei Ebenen gespeichert wird. In einer anderen gängigen Konfiguration werden die Cb - und Cr-Komponenten miteinander verschachtelt und gespeichert, während die Y-Komponente in ihrer eigenen Ebene für insgesamt zwei Ebenen verbleibt.

Hier ist eine Abbildung mit planaren Y- und überlappenden CbCr-Pixeldaten , einem gängigen YCbCr-Speicherlayout .

Eine Abbildung, die planare y- und interleavierte CBCR-Pixeldaten zeigt, ein allgemeines ycbcr-Speicherlayout.

Sowohl in WIC als auch in Direct2D wird jede Farbebene als eigenes objekt behandelt (entweder als IWICBitmapSource oder ID2D1Bitmap), und zusammen bilden diese Ebenen die Hintergrunddaten für ein YCbCr-Bild .

Während WIC den Zugriff auf YCbCr-Daten sowohl in den Konfigurationen 2 als auch 3 Ebenen unterstützt, unterstützt Direct2D nur erstere (Y und CbCr). Daher sollten Sie bei der gemeinsamen Verwendung von WIC und Direct2D immer die YCbCr-Konfiguration mit zwei Ebenen verwenden.

Chroma-Subsampling

Das Farbmodell YCbCr eignet sich gut für digitale Bildaufnahmen, da es bestimmte Aspekte des menschlichen visuellen Systems nutzen kann. Insbesondere der Mensch ist empfindlicher gegenüber Veränderungen der Leuchtdichte (Helligkeit) eines Bilds und weniger Chrominanz (Farbe). Durch die Aufteilung der Farbdaten in separate Luminanz- und Chrominanzkomponenten können wir nur die Chrominanzkomponenten selektiv komprimieren, um Platzeinsparungen bei minimalem Qualitätsverlust zu erzielen.

Eine Technik hierfür ist die sogenannte Chroma-Subsampling. Die Ebenen Cb und Cr werden in einer oder beiden horizontalen und vertikalen Dimensionen untersampelt (herunterskaliert). Aus historischen Gründen wird jeder Chroma-Subsamplingmodus häufig mit einem dreiteiligen J:a:b-Verhältnis bezeichnet.

Subsamplingmodus Horizontale Abwärtsskalierung Vertikale Abwärtsskalierung Bits pro Pixel*
4:4:4 1x 1x 24
4:2:2 2x 1x 16
4:4:0 1x 2x 16
4:2:0 2x 2x 12

 

* Enthält Y-Daten.

Wenn Sie in der obigen Tabelle YCbCr zum Speichern von unkomprimierten Bilddaten verwenden, können Sie je nach verwendetem Chroma-Subsampling-Modus eine Speicherersparnis von 25 % bis 62,5 % gegenüber 32 Bit pro Pixel RGBA-Daten erzielen.

JPEG Verwendung von YCbCr

Im Allgemeinen besteht die JPEG-Dekomprimierungspipeline aus den folgenden Phasen:

  1. Dekomprimierung von Entropie (z. B. Huffman) durchführen
  2. Durchführen der Dequantisierung
  3. Ausführen einer umgekehrten diskreten Kosinustransformation
  4. Durchführen von Chroma-Upsampling für CBCr-Daten
  5. Konvertieren von YCbCr-Daten in RGBA (falls erforderlich)

Indem der JPEG-Codec YCbCr-Daten erzeugt, können wir die letzten beiden Schritte des Decodierungsprozesses vermeiden oder auf die GPU zurückstellen. Zusätzlich zu den im vorherigen Abschnitt aufgeführten Speichereinsparungen reduziert sich dadurch die Gesamtzeit, die zum Decodieren des Bilds erforderlich ist, erheblich. Die gleichen Einsparungen gelten beim Codieren von YCbCr-Daten .

Verwenden von JPEG YCbCr-Daten

In diesem Abschnitt wird erläutert, wie Sie WIC und Direct2D verwenden, um mit YCbCr-Daten zu arbeiten.

Die in der Praxis verwendeten Anleitungen aus diesem Dokument finden Sie im Beispiel JPEG YCbCr-Optimierungen in Direct2D und WIC , das alle Schritte veranschaulicht, die zum Decodieren und Rendern von YCbCr-Inhalten in einer Direct2D-App erforderlich sind.

Verwenden von YCbCr JPEG-Bildern

Die überwiegende Mehrheit der JPEG-Bilder werden als YCbCr gespeichert. Einige JPEGs enthalten CMYK- oder Graustufendaten und verwenden nicht YCbCr. Dies bedeutet, dass Sie in der Regel, aber nicht immer, bereits vorhandene JPEG-Inhalte direkt ohne Änderungen verwenden können.

WIC und Direct2D unterstützen nicht jede mögliche YCbCr-Konfiguration , und die Unterstützung von YCbCr in Direct2D ist von der zugrunde liegenden Grafikhardware und dem zugrunde liegenden Treiber abhängig. Aus diesem Grund muss eine Universelle Imaging-Pipeline robust für Bilder sein, die keine YCbCr verwenden (einschließlich anderer gängiger Bildformate wie PNG oder BMP) oder für Fälle, in denen keine Unterstützung für YCbCr verfügbar ist. Es wird empfohlen, Ihre vorhandene BGRA-basierte Imagingpipeline beizubehalten und YCbCr als Leistungsoptimierung zu aktivieren, sofern verfügbar.

ApIs für Windows-Bildverarbeitungskomponenten

WIC in Windows 8.1 fügt drei neue Schnittstellen hinzu, um den Zugriff auf JPEG YCbCr-Daten zu ermöglichen.

IWICPlanarBitmapSourceTransform

IWICPlanarBitmapSourceTransform ist analog zu IWICBitmapSourceTransform, mit der Ausnahme, dass es Pixel in einer planaren Konfiguration erzeugt, einschließlich YCbCr-Daten . Sie können diese Schnittstelle abrufen, indem Sie QueryInterface für eine Implementierung von IWICBitmapSource aufrufen, die den planaren Zugriff unterstützt. Dies umfasst die Implementierung von IWICBitmapFrameDecode durch den JPEG-Codec sowie IWICBitmapScaler, IWICBitmapFlipRotator und IWICColorTransform.

IWICPlanarBitmapFrameEncode

IWICPlanarBitmapFrameEncode bietet die Möglichkeit, planare Pixeldaten zu codieren, einschließlich YCbCr-Daten . Sie können diese Schnittstelle abrufen, indem Sie QueryInterface für die Implementierung von IWICBitmapFrameEncode des JPEG-Codecs aufrufen.

IWICPlanarFormatConverter

IWICPlanarFormatConverter ermöglicht es IWICFormatConverter , planare Pixeldaten, einschließlich YCbCr, zu nutzen und in ein verschachteltes Pixelformat zu konvertieren. Es macht nicht die Möglichkeit verfügbar, verschachtelte Pixeldaten in ein planares Format zu konvertieren. Sie können diese Schnittstelle abrufen, indem Sie QueryInterface in der von Windows bereitgestellten Implementierung von IWICFormatConverter aufrufen.

Direct2D-APIs

Direct2D in Windows 8.1 unterstützt planare Pixeldaten von YCbCr mit dem neuen Bildeffekt YCbCr. Dieser Effekt ermöglicht das Rendern von YCbCr-Daten . Der Effekt übernimmt als Eingabe zwei ID2D1Bitmap-Schnittstellen : eine mit planaren Y-Daten im DXGI_FORMAT_R8_UNORM-Format und eine mit verschachtelten CbCr-Daten im DXGI_FORMAT_R8G8_UNORM-Format. In der Regel verwenden Sie diesen Effekt anstelle der ID2D1Bitmap , die BGRA-Pixeldaten enthalten hätte.

Der Bildeffekt YCbCr soll in Verbindung mit den WIC YCbC r-APIs verwendet werden, die die YCbCr-Daten bereitstellen. Dies wirkt effektiv, um einen Teil der Decodierungsarbeit von der CPU auf die GPU zu entladen, wo sie viel schneller und parallel verarbeitet werden kann.

Ermitteln, ob die YCbCr-Konfiguration unterstützt wird

Wie bereits erwähnt, sollte Ihre App für Fälle robust sein, in denen keine Unterstützung für YCbCr verfügbar ist. In diesem Abschnitt werden die Bedingungen erläutert, nach denen Ihre App suchen sollte. Wenn eine der folgenden Überprüfungen fehlschlägt, sollte Ihre App auf eine standardmäßige BGRA-basierte Pipeline zurückgreifen.

Unterstützt die WIC-Komponente den YCbCr-Datenzugriff ?

Nur der von Windows bereitgestellte JPEG-Codec und bestimmte WIC-Transformationen unterstützen den YCbCr-Datenzugriff . Eine vollständige Liste finden Sie im Abschnitt Windows Imaging Component APIs .

Um eine der planaren YCbCr-Schnittstellen abzurufen, rufen Sie QueryInterface auf der ursprünglichen Schnittstelle auf. Dies schlägt fehl, wenn die Komponente den YCbCr-Datenzugriff nicht unterstützt.

Wird die angeforderte WIC-Transformation für YCbCr unterstützt?

Nachdem Sie eine IWICPlanarBitmapSourceTransform abgerufen haben, sollten Sie zuerst DoesSupportTransform aufrufen. Diese Methode akzeptiert als Eingabeparameter den vollständigen Satz von Transformationen, den Sie auf die planaren YCbCr-Daten anwenden möchten, und gibt einen booleschen Wert zurück, der die Unterstützung angibt, sowie die dimensionen, die der angeforderten Größe am nächsten sind, die zurückgegeben werden können. Sie sollten alle drei Werte überprüfen, bevor Sie mit IWICPlanarBitmapSourceTransform::CopyPixels auf die Pixeldaten zugreifen.

Dieses Muster ähnelt der Verwendung von IWICBitmapSourceTransform .

Unterstützt der Grafiktreiber die Features, die für die Verwendung von YCbCr mit Direct2D erforderlich sind?

Diese Überprüfung ist nur erforderlich, wenn Sie den Direct2D YCbCr-Effekt verwenden, um YCbCr-Inhalt zu rendern. Direct2D speichert YCbCr-Daten unter Verwendung der DXGI_FORMAT_R8_UNORM- und DXGI_FORMAT_R8G8_UNORM Pixelformate, die nicht von allen Grafiktreibern verfügbar sind.

Bevor Sie den Bildeffekt YCbCr verwenden, sollten Sie ID2D1DeviceContext::IsDxgiFormatSupported aufrufen, um sicherzustellen, dass beide Formate vom Treiber unterstützt werden.

Beispielcode

Im Folgenden finden Sie ein Codebeispiel, das die empfohlenen Überprüfungen veranschaulicht. Dieses Beispiel wurde aus den JPEG-YCbCr-Optimierungen in Direct2D und WIC entnommen.

bool DirectXSampleRenderer::DoesWicSupportRequestedYCbCr()
{
    ComPtr<IWICPlanarBitmapSourceTransform> wicPlanarSource;
    HRESULT hr = m_wicScaler.As(&wicPlanarSource);
    if (SUCCEEDED(hr))
    {
        BOOL isTransformSupported;
        uint32 supportedWidth = m_cachedBitmapPixelWidth;
        uint32 supportedHeight = m_cachedBitmapPixelHeight;
        DX::ThrowIfFailed(
            wicPlanarSource->DoesSupportTransform(
                &supportedWidth,
                &supportedHeight,
                WICBitmapTransformRotate0,
                WICPlanarOptionsDefault,
                SampleConstants::WicYCbCrFormats,
                m_planeDescriptions,
                SampleConstants::NumPlanes,
                &isTransformSupported
                )
            );

        // The returned width and height may be larger if IWICPlanarBitmapSourceTransform does not
        // exactly support what is requested.
        if ((isTransformSupported == TRUE) &&
            (supportedWidth == m_cachedBitmapPixelWidth) &&
            (supportedHeight == m_cachedBitmapPixelHeight))
        {
            return true;
        }
    }

    return false;
}

bool DirectXSampleRenderer::DoesDriverSupportYCbCr()
{
    auto d2dContext = m_deviceResources->GetD2DDeviceContext();

    return (d2dContext->IsDxgiFormatSupported(DXGI_FORMAT_R8_UNORM)) &&
        (d2dContext->IsDxgiFormatSupported(DXGI_FORMAT_R8G8_UNORM));
}

Decodieren von YCbCr Pixeldaten

Wenn Sie YCbC r-Pixeldaten abrufen möchten, sollten Sie IWICPlanarBitmapSourceTransform::CopyPixels aufrufen. Diese Methode kopiert Pixeldaten in ein Array ausgefüllter WICBitmapPlane-Strukturen , eines für jede gewünschte Datenebene (z. B. Y und CbCr). Ein WICBitmapPlane enthält Informationen zu den Pixeldaten und verweist auf den Speicherpuffer, der die Daten empfängt.

Wenn Sie die YCbC r-Pixeldaten mit anderen WIC-APIs verwenden möchten, sollten Sie eine entsprechend konfigurierte IWICBitmap erstellen, Lock aufrufen, um den zugrunde liegenden Speicherpuffer abzurufen, und den Puffer dem WICBitmapPlane zuordnen, der zum Empfangen der Pixeldaten von YCbCr verwendet wird. Sie können die IWICBitmap dann normal verwenden.

Wenn Sie schließlich die YCbCr-Daten in Direct2D rendern möchten, sollten Sie eine ID2D1Bitmap aus jeder IWICBitmap erstellen und sie als Quelle für den YCbCr-Bildeffekt verwenden. MIT WIC können Sie mehrere planare Konfigurationen anfordern. Bei der Zusammenarbeit mit Direct2D sollten Sie zwei Ebenen anfordern, eine mit GUID_WICPixelFormat8bppY und die andere mit GUID_WICPixelFormat16bppCbCr, da dies die von Direct2D erwartete Konfiguration ist.

Codebeispiel

Im Folgenden finden Sie ein Codebeispiel, das die Schritte zum Decodieren und Rendern von YCbCr-Daten in Direct2D veranschaulicht. Dieses Beispiel wurde aus den JPEG-YCbCr-Optimierungen in Direct2D und WIC entnommen.

void DirectXSampleRenderer::CreateYCbCrDeviceResources()
{
    auto wicFactory = m_deviceResources->GetWicImagingFactory();
    auto d2dContext = m_deviceResources->GetD2DDeviceContext();

    ComPtr<IWICPlanarBitmapSourceTransform> wicPlanarSource;
    DX::ThrowIfFailed(
        m_wicScaler.As(&wicPlanarSource)
        );

    ComPtr<IWICBitmap> bitmaps[SampleConstants::NumPlanes];
    ComPtr<IWICBitmapLock> locks[SampleConstants::NumPlanes];
    WICBitmapPlane planes[SampleConstants::NumPlanes];

    for (uint32 i = 0; i < SampleConstants::NumPlanes; i++)
    {
        DX::ThrowIfFailed(
            wicFactory->CreateBitmap(
                m_planeDescriptions[i].Width,
                m_planeDescriptions[i].Height,
                m_planeDescriptions[i].Format,
                WICBitmapCacheOnLoad,
                &bitmaps[i]
                )
            );

        LockBitmap(bitmaps[i].Get(), WICBitmapLockWrite, nullptr, &locks[i], &planes[i]);
    }

    DX::ThrowIfFailed(
        wicPlanarSource->CopyPixels(
            nullptr, // Copy the entire source region.
            m_cachedBitmapPixelWidth,
            m_cachedBitmapPixelHeight,
            WICBitmapTransformRotate0,
            WICPlanarOptionsDefault,
            planes,
            SampleConstants::NumPlanes
            )
        );

    DX::ThrowIfFailed(d2dContext->CreateEffect(CLSID_D2D1YCbCr, &m_d2dYCbCrEffect));

    ComPtr<ID2D1Bitmap1> d2dBitmaps[SampleConstants::NumPlanes];
    for (uint32 i = 0; i < SampleConstants::NumPlanes; i++)
    {
        // IWICBitmapLock must be released before using the IWICBitmap.
        locks[i] = nullptr;

        // First ID2D1Bitmap1 is DXGI_FORMAT_R8 (Y), second is DXGI_FORMAT_R8G8 (CbCr).
        DX::ThrowIfFailed(d2dContext->CreateBitmapFromWicBitmap(bitmaps[i].Get(), &d2dBitmaps[i]));
        m_d2dYCbCrEffect->SetInput(i, d2dBitmaps[i].Get());
    }
}

void DirectXSampleRenderer::LockBitmap(
    _In_ IWICBitmap *pBitmap,
    DWORD bitmapLockFlags,
    _In_opt_ const WICRect *prcSource,
    _Outptr_ IWICBitmapLock **ppBitmapLock,
    _Out_ WICBitmapPlane *pPlane
    )
{
    // ComPtr guarantees the IWICBitmapLock is released if an exception is thrown.
    ComPtr<IWICBitmapLock> lock;
    DX::ThrowIfFailed(pBitmap->Lock(prcSource, bitmapLockFlags, &lock));
    DX::ThrowIfFailed(lock->GetStride(&pPlane->cbStride));
    DX::ThrowIfFailed(lock->GetDataPointer(&pPlane->cbBufferSize, &pPlane->pbBuffer));
    DX::ThrowIfFailed(lock->GetPixelFormat(&pPlane->Format));
    *ppBitmapLock = lock.Detach();
}

Transformieren von YCbCr Pixeldaten

Die Transformation von YCbCr-Daten ist fast identisch mit der Decodierung, da beide IWICPlanarBitmapSourceTransform umfassen. Der einzige Unterschied besteht darin, von welchem WIC-Objekt Sie die Schnittstelle abgerufen haben. Die von Windows bereitgestellten Skalierungs-, Fliprotator- und Farbtransformationen unterstützen alle YCbCr-Zugriff .

Verketten von Transformationen

WIC unterstützt das Verketten mehrerer Transformationen. Sie können beispielsweise die folgende WIC-Pipeline erstellen:

Ein Diagramm einer wic-Pipeline, die mit einem JPEG-Decoder beginnt.

Anschließend können Sie QueryInterface auf der IWICColorTransform aufrufen, um IWICPlanarBitmapSourceTransform abzurufen. Die Farbtransformation kann mit den vorherigen Transformationen kommunizieren und die Aggregatfunktionen jeder Phase in der Pipeline verfügbar machen. WIC stellt sicher, dass die YCbCr-Daten während des gesamten Prozesses erhalten bleiben. Diese Verkettung funktioniert nur, wenn Komponenten verwendet werden, die den YCbCr-Zugriff unterstützen.

JPEG-Codec-Optimierungen

Ähnlich wie die JPEG-Framedecodierungsimplementierung von IWICBitmapSourceTransform unterstützt die JPEG-Framedecodierungsimplementierung von IWICPlanarBitmapSourceTransform native Skalierung und Drehung der JPEG-DCT-Domäne. Sie können eine Leistung von zwei Herunterskalierungsstufen oder eine Drehung direkt vom JPEG-Decoder anfordern. Dies führt in der Regel zu einer höheren Qualität und Leistung als die Verwendung der diskreten Transformationen.

Wenn Sie außerdem eine oder mehrere WIC-Transformationen nach dem JPEG-Decoder verketten, kann dies die native JPEG-Skalierung und -Rotation nutzen, um den angeforderten Aggregatvorgang zu erfüllen.

Formatkonvertierungen

Verwenden Sie IWICPlanarFormatConverter , um planare YCbCr-Pixeldaten in ein verschachteltes Pixelformat wie GUID_WICPixelFormat32bppPBGRA zu konvertieren. WIC in Windows 8.1 bietet nicht die Möglichkeit, in ein planares YCbC r-Pixelformat zu konvertieren.

Codieren von YCbCr Pixeldaten

Verwenden Sie IWICPlanarBitmapFrameEncode , um YCbCr Pixeldaten in den JPEG-Encoder zu codieren. Die Codierung von YCbCr-DatenIWICPlanarBitmapFrameEncode ist ähnlich, aber nicht identisch mit der Codierung von verschachtelten Daten mit IWICBitmapFrameEncode. Die planare Schnittstelle macht nur die Möglichkeit verfügbar, planare Bilddaten zu schreiben, und Sie sollten weiterhin die Framecodierungsschnittstelle verwenden, um Metadaten oder eine Miniaturansicht festzulegen und am Ende des Vorgangs zu commiten.

Für den typischen Fall sollten Sie die folgenden Schritte ausführen:

  1. Rufen Sie den IWICBitmapFrameEncode wie gewohnt ab. Wenn Sie die Chroma-Subsampling konfigurieren möchten, legen Sie beim Erstellen des Frames die JpegYCrCbSubsampling-Encoderoption fest.
  2. Wenn Sie Metadaten oder eine Miniaturansicht festlegen müssen, verwenden Sie IWICBitmapFrameEncode wie gewohnt.
  3. QueryInterface für den IWICPlanarBitmapFrameEncode.
  4. Legen Sie die YCbCr-Pixeldaten mithilfe von IWICPlanarBitmapFrameEncode::WriteSource oder IWICPlanarBitmapFrameEncode::WritePixels fest. Im Gegensatz zu ihren IWICBitmapFrameEncode-Entsprechungen stellen Sie diese Methoden mit einem Array von IWICBitmapSource oder WICBitmapPlane bereit, die die Pixelebenen YCbCr enthalten.
  5. Wenn Sie fertig sind, rufen Sie IWICBitmapFrameEncode::Commit auf.

Decodieren von YCbCr Pixeldaten in Windows 10

Ab Windows 10 Build 1507 bietet Direct2D ID2D1ImageSourceFromWic, eine einfachere Möglichkeit, JPEGs in Direct2D zu decodieren und gleichzeitig YCbC r-Optimierungen zu nutzen. ID2D1ImageSourceFromWic führt automatisch alle erforderlichen YCbCr-Funktionsprüfungen für Sie durch; Wenn möglich, wird der optimierte Codepfad verwendet, andernfalls wird ein Fallback verwendet. Es ermöglicht auch neue Optimierungen, z. B. nur die Zwischenspeicherung von Unterregionen des Images, die gleichzeitig benötigt werden.

Weitere Informationen zur Verwendung von ID2D1ImageSourceFromWic finden Sie im Beispiel zum Direct2D Photo Adjustment SDK.