JPEG-YCbCr-Unterstützung
Ab Windows 8.1 unterstützt der JPEG-Codec Windows Imaging Component (WIC) das Lesen und Schreiben von Bilddaten in seiner nativen YCbCr-Form. WIC YCbCr-Unterstützung kann in Verbindung mit Direct2D verwendet werden, um YCbCr Pixeldaten mit einem Bildeffekt zu rendern. Darüber hinaus kann der WIC JPEG-Codec YCbCr Pixeldaten verarbeiten, die von bestimmten Kameratreibern über Media Foundation.
YCbCr Pixel-Daten 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 auslasten, das durch GPU beschleunigt wird. Mithilfe von YCbCrkann Ihre App den JPEG-Arbeitsspeicherverbrauch und die Ladezeiten für Bilder mit der gleichen Größe und Qualität reduzieren. Oder Ihre App kann mehr JPEG-Bilder mit höherer Auflösung verwenden, ohne dass die Leistung darunter zu beeinträchtigen ist.
In diesem Thema wird beschrieben, wie YCbCr-Daten funktionieren und wie sie in WIC und Direct2D verwendet werden.
Informationen zu JPEG YCbCr Data
In diesem Abschnitt werden einige wichtige Konzepte erläutert, die erforderlich sind, um zu verstehen, wie die Unterstützung von YCbCr in WIC funktioniert, und die wichtigsten Vorteile.
YCbCr Farbmodell
WIC in Windows 8 und früher unterstützt vier verschiedene Farbmodelle, von denen RGB/BGR am häufigsten verwendet wird. Dieses Farbmodell definiert Farbdaten mithilfe roter, grüner und blauer Komponenten. Eine vierte Alphakomponente kann ebenfalls verwendet werden.
Hier sehen Sie ein Bild, das in seine roten, grünen und blauen Komponenten zersetzt ist.

YCbCr ist ein alternatives Farbmodell, das Farbdaten mithilfe einer Leuchtdichtekomponente (Y) und zwei Chrominancekomponenten (Cb und Cr) definiert. Sie wird häufig in Szenarien mit digitaler Bildverarbeitung und Video verwendet. Der Begriff YCbCr wird häufig synonym mit YUV verwendet, obwohl die beiden technisch eindeutig sind.
Es gibt mehrere Variationen von YCbCr, die sich im Farbraum und in dynamischen Bereichsdefinitionen unterscheiden– WIC unterstützt speziell JPEG JFIF YCbCr-Daten. Weitere Informationen finden Sie in der JPEG ITU-T81-Spezifikation.
Hier sehen Sie ein Image, das in seine Y-, Cb-und Cr-Komponenten zersetzt ist.

Planar im Vergleich zu überlappten Speicherlayouts
In diesem Abschnitt werden einige Unterschiede zwischen dem Zugreifen auf und Speichern von RGB-Pixeldaten im Arbeitsspeicher und YCbCr-Daten beschrieben.
RGB-Pixeldaten werden in der Regel mithilfe eines überlappten Speicherlayouts gespeichert. Dies bedeutet, dass Daten für eine einzelne Farbkomponente zwischen Pixeln übereinander liegen und jedes Pixel zusammenhängend im Arbeitsspeicher gespeichert wird.
Die folgende Abbildung zeigt RGBA-Pixeldaten, die in einem überlappten 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 allgemeinen Konfiguration werden die Cb- und Cr-Komponenten übereinander verwebt und gespeichert, während die Y-Komponente auf ihrer eigenen Ebene verbleibt, für insgesamt zwei Ebenen.
Die folgende Abbildung zeigt planare Y- und überlappte CbCr Pixel-Daten, ein gemeinsames YCbCr-Speicherlayout.

Sowohl in WIC als auch in Direct2D wird jede Farbebene als eigenes eindeutiges Objekt (entweder EINE IWICBitmapSource oder ID2D1Bitmap)behandelt, und zusammen bilden diese Ebenen die Hintergrunddaten für ein YC bC r-Bild.
WIC unterstützt den Zugriff auf YCbCr-Daten sowohl in den Konfigurationen der 2- als auch der 3-Ebene, Direct2D unterstützt jedoch nur den ersten (Y und CbCr). Wenn Sie WIC und Direct2D zusammen verwenden, sollten Sie daher immer die 2-Ebenen-YCbCr-Konfiguration verwenden.
Subsampling von Subsampling
Das YCbCr-Farbmodell eignet sich gut für Szenarien mit digitaler Bildverarbeitung, da es bestimmte Aspekte des menschlichen visuellen Systems nutzen kann. Insbesondere menschen sind anfälliger für Änderungen der Leuchtdichte (Helligkeit) eines Bilds und weniger empfindlich gegenüber Chrominance (Farbe). Indem die Farbdaten in separate Leuchtdichte- und Chrominancekomponenten aufgeteilt werden, können wir selektiv nur die Chrominancekomponenten komprimieren, um Platzeinsparungen mit minimalem Qualitätsverlust zu erzielen.
Eine Technik dafür wird als "untergeordnetes Subsampling" bezeichnet. Die Ebenen Cb und Cr werden in einer oder beiden horizontalen und vertikalen Dimensionen subsampelt (herunterskaliert). Aus historischen Gründen wird auf jeden Untergeordneten Subsamplingmodus mit einem Dreiteil-J:a:b-Verhältnis verwiesen.
| Subsamplingmodus | Horizontales Herunterskalieren | Vertikales Herunterskalieren | 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 |
* Schließt Y-Daten ein.
Wenn Sie in der obigen Tabelle YCbCr verwenden, um unkomprimierte Bilddaten zu speichern, können Sie eine Speichereinsparung von 25 % bis 62,5 % im Vergleich zu RGBA-Daten mit 32 Bit pro Pixel erzielen, je nachdem, welcher Subsamplingmodus verwendet wird.
JPEG-Verwendung von YCbCr
Auf hoher Ebene besteht die JPEG-Dekomprimierungspipeline aus den folgenden Phasen:
- Durchführen der Entropiedekomprimierung (z. B. Huffman)
- Durchführen der Dequantisierung
- Durchführen einer inversen diskreten Kosinustransformation
- Durchführen eines upsampling-Upsamplings für CbCr-Daten
- Konvertieren von YCbCr-Daten in RGBA (falls erforderlich)
Wenn der JPEG-Codec YCbCr-Daten erzeugt, können wir die letzten beiden Schritte des Decodierungsprozesses vermeiden oder sie auf die GPU zurückstufen. Zusätzlich zu den im vorherigen Abschnitt aufgeführten Speichereinsparungen reduziert dies die Gesamtzeit, die zum Decodieren des Bilds benötigt wird, erheblich. Beim Codieren von YCbC r-Daten gelten diegleichen Einsparungen.
Verwenden von JPEG YCbCr Data
In diesem Abschnitt wird erläutert, wie WIC und Direct2D zum Verarbeiten von YCbCr-Daten verwendet werden.
Die Anleitungen aus diesem Dokument, die in der Praxis verwendet werden, finden Sie im Beispiel JPEG YCbCr optimizations in Direct2D and WIC (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 wird als YCbCr gespeichert. Einige JPEGs enthalten C JPEG- oder Graustufendaten und verwenden YCbCr nicht. Dies bedeutet, dass Sie in der Regel, aber nicht immer, bereits vorhandene JPEG-Inhalte ohne Änderungen direkt 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 Treiber abhängig. Aus diesem Grund muss eine allgemeine Bildverarbeitungspipeline stabil für Bilder sein, die YCbCr nicht verwenden (einschließlich anderer gängiger Bildformate wie PNG oder BMP) oder für Fälle, in denen YCbCr nicht unterstützt wird. Es wird empfohlen, ihre vorhandene BGRA-basierte Bildverarbeitungspipeline beizubehalten und YCbCr als Leistungsoptimierung zu aktivieren, sofern verfügbar.
Windows APIs für Bildverarbeitungskomponenten
WIC in Windows 8.1 fügt drei neue Schnittstellen hinzu, um Zugriff auf JPEG YCbCr-Daten zu ermöglichen.
IWICPlanarBitmapSourceTransform
IWICPlanarBitmapSourceTransform ist analog zu IWICBitmapSourceTransform,mit der Ausnahme, dass pixel in einer planaren Konfiguration erzeugt wird, einschließlich YC bC r-Daten. Sie können diese Schnittstelle abrufen, indem Sie QueryInterface für eine Implementierung von IWICBitmapSource aufrufen, die planaren Zugriff unterstützt. Dies schließt die Implementierung des JPEG-Codecs von IWICBitmapFrameDecode sowie IWICBitmapScaler, IWICBitmapFlipRotatorund IWICColorTransformein.
IWICPlanarBitmapFrameEncode
IWICPlanarBitmapFrameEncode bietet die Möglichkeit, planare Pixeldaten zu codieren, einschließlich YC bC r-Daten. Sie können diese Schnittstelle abrufen, indem Sie QueryInterface für die Implementierung des JPEG-Codecs von IWICBitmapFrameEncodeaufrufen.
IWICPlanarFormatConverter
IWICPlanarFormatConverter ermöglicht IWICFormatConverter, planare Pixeldaten zu nutzen, einschließlich YC bC r, und konvertiert sie in ein verschachteltes Pixelformat. Es bietet keine Möglichkeit, überlappende Pixeldaten in ein planares Format zu konvertieren. Sie können diese Schnittstelle abrufen, indem Sie QueryInterface für die Windows bereitgestellte Implementierung von IWICFormatConverter aufrufen.
Direct2D-APIs
Direct2D in Windows 8.1 unterstützt YCbCr planare Pixeldaten mit dem neuen Bildeffekt YCbCr. Dieser Effekt bietet die Möglichkeit, YCbC r-Daten zurendern. Der Effekt nimmt als Eingabe zwei ID2D1Bitmap-Schnittstellen an: 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 Imageeffekt YCbC r ist für die Verwendung in Verbindung mit den WIC YCbCr-APIs vorgesehen, die die YCbCr-Daten bereitstellen. Dadurch wird effektiv ein Teil der Decodierungsarbeit von der CPU auf die GPU ausgelagert, wo sie viel schneller und parallel verarbeitet werden kann.
Bestimmen, ob die YCbCr-Konfiguration unterstützt wird
Wie bereits erwähnt, sollte Ihre App in Fällen robust sein, in denen die Unterstützung von YCbCr nicht verfügbar ist. In diesem Abschnitt werden die Bedingungen erläutert, die Ihre App überprüfen sollte. Wenn eine der folgenden Überprüfungen fehlschlägt, sollte Ihre App auf eine BGRA-basierte Standardpipeline zurückgreifen.
Unterstützt die WIC-Komponente den Datenzugriff auf YCbC r?
Nur die Windows JPEG-Codec und bestimmte WIC-Transformationen unterstützen den YCbC r-Datenzugriff. Eine vollständige Liste finden Sie im Abschnitt Windows Imaging Component-APIs.
Um eine der planaren YCbCr-Schnittstellen abzurufen, rufen Sie QueryInterface für die ursprüngliche Schnittstelle auf. Dies schlägt fehl, wenn die Komponente keinen YCbCr-Datenzugriff unterstützt.
Wird die angeforderte WIC-Transformation für YCbCrunterstützt?
Nachdem Sie eine IWICPlanarBitmapSourceTransform-Dateierhalten haben, sollten Sie zuerst DoesSupportTransformaufrufen. Diese Methode verwendet als Eingabeparameter den vollständigen Satz von Transformationen, die 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 kann. Überprüfen Sie alle drei Werte, bevor Sie mit IWICPlanarBitmapSourceTransform::CopyPixelsauf 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 YCbC r-Inhalt zurendern. Direct2D speichert YCbCr-Daten mithilfe der _ UNORM-Formate DXGI FORMAT _ R8 und _ DXGI FORMAT _ _ R8G8 _ UNORM, die nicht von allen Grafiktreibern verfügbar sind.
Bevor Sie den Imageeffekt YC bC r verwenden, sollten Sie ID2D1DeviceContext::IsDxgiFormatSupported aufrufen, um sicherzustellen, dass beide Formate vom Treiber unterstützt werden.
Beispielcode
Im Folgenden finden Sie ein Codebeispiel, in dem die empfohlenen Überprüfungen veranschaulicht werden. Dieses Beispiel stammt aus den JPEG-YCbCr-Optimierungen im Direct2D- und WIC-Beispiel.
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 YCbC r Pixel-Daten
Wenn Sie YC bC r Pixeldaten abrufen möchten, sollten Sie IWICPlanarBitmapSourceTransform::CopyPixelsaufrufen. Diese Methode kopiert Pixeldaten in ein Array ausgefüllter WICBitmapPlane-Strukturen, eine für jede gewünschte Datenebene (z. B. Y und C bC r). Ein WICBitmapPlane enthält Informationen zu den Pixeldaten und zeigt auf den Speicherpuffer, der die Daten empfängt.
Wenn Sie die YC bC r-Pixeldaten mit anderen WIC-APIs verwenden möchten, sollten Sie eine entsprechend konfigurierte IWICBitmaperstellen, lock aufrufen, um den zugrunde liegenden Speicherpuffer abzurufen, und den Puffer dem WICBitmapPlane zuordnen, der zum Empfangen der YC bC r-Pixeldaten verwendet wird. Anschließend können Sie IWICBitmap normal verwenden.
Wenn Sie schließlich die YC bC r-Daten in Direct2D rendern möchten, sollten Sie eine ID2D1Bitmap aus jeder IWICBitmap erstellen und diese als Quelle für den YC bC r-Imageeffekt 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 stammt aus den JPEG-YCbCr-Optimierungen im Direct2D- und WIC-Beispiel.
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 Pixel-Daten
Das Transformieren von YC bC r-Daten ist nahezu identisch mit der Decodierung, da beide IWICPlanarBitmapSourceTransformbeinhalten. Der einzige Unterschied besteht darin, von welchem WIC-Objekt Sie die Schnittstelle erhalten haben. Die Windows bereitgestellten Scaler, Flip-Rotator und Farbtransformation unterstützen alle YCbCr-Zugriff.
Verketten von Transformationen
WIC unterstützt das Konzept der Verkettung mehrerer Transformationen. Beispielsweise können Sie die folgende WIC-Pipeline erstellen:

Anschließend können Sie QueryInterface für IWICColorTransform aufrufen, um IWICPlanarBitmapSourceTransformabzurufen. 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 beibehalten werden. Diese Verkettung funktioniert nur, wenn Komponenten verwendet werden, die YCbCr-Zugriff unterstützen.
JPEG-Codecoptimierungen
Ähnlich wie bei der Implementierung der JPEG-Framedecodierung von IWICBitmapSourceTransformunterstützt die JPEG-Framedecodierungsimplementierung von IWICPlanarBitmapSourceTransform die native Skalierung und Drehung von JPEG-DCT-Domänen. Sie können eine Leistung von zwei Herunterskalierungs- oder Drehungen direkt vom JPEG-Decoder anfordern. Dies führt in der Regel zu einer höheren Qualität und Leistung als bei der Verwendung der diskreten Transformationen.
Wenn Sie eine oder mehrere WIC-Transformationen nach dem JPEG-Decoder verketten, kann außerdem die native JPEG-Skalierung und -Drehung genutzt werden, um den angeforderten Aggregatvorgang zu erfüllen.
Formatkonvertierungen
Verwenden Sie IWICPlanarFormatConverter, um planare YC bC r-Pixeldaten in ein verschachteltes Pixelformat wie GUID _ WICPixelFormat32bppPBGRA zu konvertieren. WIC in Windows 8.1 bietet nicht die Möglichkeit, in ein planares YCbCr-Pixelformat zu konvertieren.
Codierung von YCbCr Pixeldaten
Verwenden Sie IWICPlanarBitmapFrameEncode, um YC bC r Pixeldaten im JPEG-Encoder zu codieren. Encoding YC bC r data IWICPlanarBitmapFrameEncode is similar but not identical to encoding interleaved data using IWICBitmapFrameEncode. Die planare Schnittstelle bietet nur die Möglichkeit, planare Framebilddaten zu schreiben, und Sie sollten weiterhin die Framecodierungsschnittstelle verwenden, um Metadaten oder eine Miniaturansicht festzulegen und am Ende des Vorgangs einen Commit zu committen.
Für den typischen Fall sollten Sie die folgenden Schritte ausführen:
- Rufen Sie IWICBitmapFrameEncode wie gewohnt ab. Wenn Sie die Subsamplingoption "JpegYCrCbSubsampling" konfigurieren möchten, legen Sie beim Erstellen des Frames die Option JpegYCrCbSubsampling fest.
- Wenn Sie Metadaten oder eine Miniaturansicht festlegen müssen, verwenden Sie IWICBitmapFrameEncode wie gewohnt.
- QueryInterface für IWICPlanarBitmapFrameEncode.
- Legen Sie die YC bC r-Pixeldaten mithilfe von IWICPlanarBitmapFrameEncode::WriteSource oder IWICPlanarBitmapFrameEncode::WritePixelsfest. Im Gegensatz zu ihren IWICBitmapFrameEncode-Entsprechungen stellen Sie diese Methoden mit einem Array von IWICBitmapSource oder WICBitmapPlane bereit, das die YC bC r-Pixelebenen enthält.
- Wenn Sie fertig sind, rufen Sie IWICBitmapFrameEncode::Commitauf.
Decodieren von YCbCr-Pixeldaten in Windows 10
Ab Windows 10 Build 1507 bietet Direct2D ID2D1ImageSourceFromWic,eine einfachere Möglichkeit, JPEGs in Direct2D zu decodieren, während YC bC r-Optimierungen genutzt werden. ID2D1ImageSourceFromWic führt automatisch alle erforderlichen YC bC r-Funktionsüberprüfungen für Sie aus. er verwendet nach Möglichkeit den optimierten Codepfad und andernfalls einen Fallback. Außerdem werden neue Optimierungen ermöglicht, z. B. das Zwischenspeichern von Teilregionen des Images, die gleichzeitig benötigt werden.
Weitere Informationen zur Verwendung von ID2D1ImageSourceFromWicfinden Sie im Direct2D Photo Adjustment SDK-Beispiel.