支援的像素格式和 Alpha 模式

本主題描述 Direct2D 各種部分支援的像素格式和 Alpha 模式,包括每個轉譯目標型別、 ID2D1BitmapID2D1ImageSource。 包含以下幾節。

DXGI 映射來源支援的 YUV 格式

ID2D1ImageSource是圖元的抽象提供者。 它可以從 WIC (CreateImageSourceFromWicIDXGISurface (CreateImageSourceFromDxgi) 具現化。

ID2D1ImageSourceFromWic 支援與 ID2D1Bitmap相同的像素格式和 Alpha 模式。

除了上述專案之外,從IDXGISurface具現化的ID2D1ImageSource也支援一些 YUV 像素格式,包括平面資料分割成多個表面。 如需每個像素格式需求的詳細資訊,請參閱 CreateImageSourceFromDxgi

格式
DXGI_FORMAT_AYUV
DXGI_FORMAT_NV12
DXGI_FORMAT_YUY2
DXGI_FORMAT_P208
DXGI_FORMAT_V208
DXGI_FORMAT_V408
DXGI_FORMAT_R8_UNORM
DXGI_FORMAT_R8G8_UNORM

 

指定轉譯目標的像素格式

當您建立轉譯目標時,必須指定其像素格式。 若要指定像素格式,您可以使用D2D1_PIXEL_FORMAT結構來設定D2D1_RENDER_TARGET_PROPERTIES結構的pixelFormat成員。 然後,您會將該結構傳遞至適當的 Create 方法,例如 ID2D1Factory::CreateHwndRenderTarget

D2D1_PIXEL_FORMAT結構有兩個欄位:

  • formatDXGI_FORMAT 值,描述每個圖元中的通道大小和相片順序,以及
  • Alpha,描述 Alpha 資訊的解譯方式 D2D1_ALPHA_MODE 值。

下列範例會建立D2D1_PIXEL_FORMAT結構 並用它來指定 ID2D1HwndRenderTarget的像素格式和 Alpha 模式。

RECT rc;
GetClientRect(m_hwnd, &rc);

D2D1_SIZE_U size = D2D1::SizeU(
    rc.right - rc.left,
    rc.bottom - rc.top
    );

// Create a pixel format and initial its format
// and alphaMode fields.
D2D1_PIXEL_FORMAT pixelFormat = D2D1::PixelFormat(
    DXGI_FORMAT_B8G8R8A8_UNORM,
    D2D1_ALPHA_MODE_IGNORE
    );

D2D1_RENDER_TARGET_PROPERTIES props = D2D1::RenderTargetProperties();
props.pixelFormat = pixelFormat;

// Create a Direct2D render target.
hr = m_pD2DFactory->CreateHwndRenderTarget(
    props,
    D2D1::HwndRenderTargetProperties(m_hwnd, size),
    &m_pRT
    );

不同的轉譯目標支援不同的格式和 Alpha 模式組合。 下列各節列出每個轉譯目標所支援的格式和 Alpha 組合。

ID2D1HwndRenderTarget 的支援格式

ID2D1HwndRenderTarget的支援格式取決於它是否使用硬體或軟體轉譯,或 Direct2D 預設會自動處理轉譯模式。

注意

我們建議您使用 DXGI_FORMAT_B8G8R8A8_UNORM 做為像素格式,以提升效能。 這對軟體轉譯目標特別有用。 BGRA 格式目標的執行效能優於 RGBA 格式。

 

當您建立 ID2D1HwndRenderTarget時,您可以使用 D2D1_RENDER_TARGET_PROPERTIES 結構來指定轉譯選項。 選項包含像素格式,如上一節所述。 這個結構的類型欄位可讓您指定轉譯目標是否會轉譯為硬體或軟體,或 Direct2D 是否應該自動判斷轉譯模式。

若要讓 Direct2D 判斷轉譯目標是否使用硬體或軟體轉譯,請使用 D2D1_RENDER_TARGET_TYPE_DEFAULT 設定。

下表列出使用D2D1_RENDER_TARGET_TYPE_DEFAULT設定所建立之ID2D1HwndRenderTarget物件的支援格式。

格式 Alpha 模式
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_UNKNOWN

 

若要強制轉譯目標使用硬體轉譯,請使用 D2D1_RENDER_TARGET_TYPE_HARDWARE 設定。 下表列出明確使用硬體轉譯之 ID2D1HwndRenderTarget 物件的支援格式。

格式 Alpha 模式
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_R8G8B8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_R8G8B8A8_UNORM D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_R8G8B8A8_UNORM D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_UNKNOWN

 

若要強制轉譯目標使用軟體轉譯,請使用 D2D1_RENDER_TARGET_TYPE_SOFTWARE 設定。 下表列出明確使用軟體轉譯之 ID2D1HwndRenderTarget 物件的支援格式。

格式 Alpha 模式
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_UNKNOWN

 

不論 ID2D1HwndRenderTarget 是否為硬體加速, DXGI_FORMAT_UNKNOWN 格式預設會使用 DXGI_FORMAT_B8G8R8A8而 D2D1_ALPHA_MODE_UNKNOWN Alpha 模式預設會使用 D2D1_ALPHA_MODE_IGNORE

ID2D1DeviceCoNtext 支援的格式

從Windows 8裝置內容開始,會利用更多Direct3D 高色彩格式,例如:

  • DXGI_FORMAT_B8G8R8A8_UNORM_SRGB
  • DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
  • DXGI_FORMAT_R16G16B16A16_UNORM
  • DXGI_FORMAT_R16G16B16A16_FLOAT
  • DXGI_FORMAT_R32G32B32A32_FLOAT

使用 ID2D1DeviceCoNtext::IsDxgiFormatSupported 方法來查看格式是否在特定裝置內容上運作。 這些格式也適用于 ID2D1HwndRenderTarget

這些格式除了 Windows 7 中 ID2D1HwndRenderTarget 介面所支援的格式之外。 如需詳細資訊 ,請參閱裝置和裝置內容

相容的轉譯目標支援格式

相容的轉譯目標 (由其中一個ID2D1RenderTarget::CreateCompatibleRenderTarget方法所建立的ID2D1BitmapRenderTarget,) 繼承所建立之轉譯目標的支援格式和 Alpha 模式。 相容的轉譯目標也支援下列格式和 Alpha 模式組合,不論其父代支援什麼。

格式 Alpha 模式
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_STRAIGHT
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_UNKNOWN

 

DXGI_FORMAT_UNKNOWN格式預設會使用父轉譯目標格式,而 D2D1_ALPHA_MODE_UNKNOWN Alpha 模式預設會使用D2D1_ALPHA_MODE_PREMULTIPLIED

DXGI Surface 轉譯目標支援的格式

DXGI 轉譯目標是由其中一個ID2D1Factory::CreateDxgiSurfaceRenderTarget方法所建立的ID2D1RenderTarget。 它支援下列格式和 Alpha 模式組合。

格式 Alpha 模式
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_R8G8B8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_R8G8B8A8_UNORM D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_STRAIGHT
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_IGNORE

 

注意

格式必須符合 DXGI 表面轉譯目標繪製的 DXGI 表面格式。

 

DXGI_FORMAT_UNKNOWN格式預設會使用 DXGI 介面格式。 請勿搭配 DXGI 表面轉譯目標使用 D2D1_ALPHA_MODE_UNKNOWN Alpha 模式。 它沒有預設值,而且會導致 DXGI 表面轉譯目標建立失敗。

WIC 點陣圖轉譯目標支援的格式

WIC 點陣圖轉譯目標是由其中一個ID2D1Factory::CreateWicBitmapRenderTarget方法所建立的ID2D1RenderTarget。 它支援下列格式和 Alpha 模式組合。

格式 Alpha 模式
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_STRAIGHT
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_UNKNOWN

 

WIC 點陣圖目標的像素格式必須符合 WIC 點陣圖的像素格式。

DXGI_FORMAT_UNKNOWN格式預設會使用 WIC 點陣圖格式,而D2D1_ALPHA_MODE_UNKNOWN Alpha 模式預設會使用 WIC 點陣圖 Alpha 模式。

ID2D1DCRenderTarget 的支援格式

ID2D1DCRenderTarget支援下列格式和 Alpha 模式組合。

格式 Alpha 模式
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_IGNORE

 

請勿搭配ID2D1DCRenderTarget使用DXGI_FORMAT_UNKNOWN格式或D2D1_ALPHA_MODE_UNKNOWN Alpha 模式。 它沒有預設值,而且會導致 ID2D1DCRenderTarget 建立失敗。

指定 ID2D1Bitmap 的像素格式

一般而言, ID2D1Bitmap 物件支援下列格式和 Alpha 模式, (一些限制,如下列段落所述。)

格式 Alpha 模式
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_STRAIGHT
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_B8G8R8X8_UNORM (Windows 8.1和更新版本,僅) D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_BC1_UNORM (Windows 8.1和更新版本,僅) D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_BC1_UNORM (Windows 8.1和更新版本,僅) D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_BC1_UNORM (Windows 8.1和更新版本,僅) D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_BC2_UNORM (Windows 8.1和更新版本,僅) D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_BC2_UNORM (Windows 8.1和更新版本,僅) D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_BC2_UNORM (Windows 8.1和更新版本,僅) D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_BC3_UNORM (Windows 8.1和更新版本,僅) D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_BC3_UNORM (Windows 8.1和更新版本,僅) D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_BC3_UNORM (Windows 8.1和更新版本,僅) D2D1_ALPHA_MODE_UNKNOWN

 

當您使用ID2D1RenderTarget::CreateSharedBitmap方法時,您可以使用D2D1_BITMAP_PROPERTIES結構的pixelFormat欄位來指定新轉譯目標的像素格式。 它必須符合 ID2D1Bitmap 來源的像素格式。

當您使用CreateBitmapFromWicBitmap方法時,您可以使用D2D1_BITMAP_PROPERTIES結構的pixelFormat欄位 (,而不是D2D1_RENDER_TARGET_PROPERTIES結構) 的pixelFormat成員,以指定新轉譯目標的像素格式。 它必須符合 WIC 點陣圖來源的像素格式。

注意

如需支援區塊壓縮 (BCn) 像素格式的詳細資訊,請參閱 區塊壓縮

 

支援的 WIC 格式

當您使用 CreateBitmapFromWicBitmap 方法從 WIC 點陣圖建立點陣圖時,或使用 CreateSharedBitmap 方法搭配 IWICBitmapLock時,WIC 來源必須是 Direct2D 支援的格式。

WIC 格式 對應的 DXGI 格式 對應的 Alpha 模式
GUID_WICPixelFormat8bppAlpha DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_STRAIGHT或D2D1_ALPHA_MODE_PREMULTIPLIED
GUID_WICPixelFormat32bppPRGBA DXGI_FORMAT_R8G8B8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED或D2D1_ALPHA_MODE_IGNORE
GUID_WICPixelFormat32bppBGR DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_IGNORE
GUID_WICPixelFormat32bppPBGRA DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED

 

如需示範如何將 WIC 點陣圖轉換成支援格式的範例,請參閱 如何從檔案載入點陣圖

使用不支援的格式

使用先前資料表中所列的像素格式和 Alpha 模式以外的任何組合,會導致 D2DERR_UNSUPPORTED_PIXEL_FORMATE_INVALIDARG 錯誤。

關於 Alpha 模式

關於預先乘法和直線 Alpha 模式

D2D1_ALPHA_MODE列舉指出 Alpha 色板是否使用預先乘法、直 Alpha 或應該忽略並視為不透明。 使用直接 Alpha 時,Alpha 色板會指出對應于色彩透明程度的值。

不論目的地格式為何,Direct2D 繪圖命令和筆刷一律會將色彩視為直接 Alpha。

使用預乘 Alpha 時,每個色彩色板都會依 Alpha 值進行調整。 一般而言,沒有色彩色板值大於 Alpha 色板值。 如果預先乘法格式的色彩色板值大於 Alpha 色板,則標準來源過度混合數學會建立加法混合。

Alpha 色板本身的值在直接和預先乘法的 Alpha 中都相同。

直線和預先乘法 Alpha 之間的差異

使用直接 Alpha 描述 RGBA 色彩時,色彩的 Alpha 值會儲存在 Alpha 色板中。 例如,若要描述 60% 不透明紅色,請使用下列值: (255、0、0、255 * 0.6) = (255、0、0、0、153) 。 255 值表示完整紅色,而 153 (60% 為 255) 表示色彩應該不透明度為 60%。

使用預先乘法 Alpha 描述 RGBA 色彩時,每個色彩都會乘以 Alpha 值: (255 * 0.6、0*0.6、0.6、0.6、255 * 0.6) = (153、0、0、153) 。

不論轉譯目標的 Alpha 模式為何, D2D1_COLOR_F 值一律會解譯為直接 Alpha。 例如,指定 ID2D1SolidColorBrush 的色彩以搭配使用預先乘法模式的轉譯目標時,請指定色彩,就像轉譯目標使用直接 Alpha 一樣。 當您使用筆刷繪製時,Direct2D 會將色彩轉譯為您的目的格式。

轉譯目標的 Alpha 模式

不論 Alpha 模式設定為何,轉譯目標的內容都支援透明度。 例如,如果您使用 Alpha 模式為 D2D1_ALPHA_MODE_IGNORE的轉譯目標繪製部分透明紅色矩形,則如果背景為白色) ,則矩形會顯示為紅色 (。

如果您在 Alpha 模式D2D1_ALPHA_MODE_PREMULTIPLIED時繪製部分透明紅色矩形,則矩形會顯示為紅色 (假設背景為白色) ,而且您可以在轉譯目標後方看到該矩形。 當您使用 ID2D1DCRenderTarget 轉譯至透明視窗,或使用相容的轉譯目標 (CreateCompatibleRenderTarget 方法所建立的轉譯目標時,這會很有用) 建立支援透明度的點陣圖。

ClearType 和 Alpha 模式

如果您指定轉譯目標 D2D1_ALPHA_MODE_IGNORE 以外的 Alpha 模式,文字反鋸齒模式會自動從 D2D1_TEXT_ANTIALIAS_MODE CLEARTYPE 變更為 D2D1_TEXT_ANTIALIAS_MODE GRAYSCALE。 (當您指定 Alpha 模式D2D1_ALPHA_MODE_UNKNOWN時,Direct2D 會根據轉譯目標的類型為您設定 Alpha。)

您可以使用 SetTextAntialiasMode 方法,將文字反鋸齒模式變更回 D2D1_TEXT_ANTIALIAS_MODE CLEARTYPE,但將 ClearType 文字轉譯為透明表面可能會產生無法預期的結果。 如果您想要將 ClearType 文字轉譯為透明轉譯目標,建議您使用下列兩種技術之一。

  • 使用 PushAxisAlignedClip 方法將轉譯目標裁剪到將轉譯文字的區域,然後呼叫 Clear 方法並指定不透明色彩,然後轉譯文字。
  • 使用 DrawRectangle 在文字轉譯的區域後面繪製不透明的矩形。

D2D1_PIXEL_FORMAT

D2D1_ALPHA_MODE

DXGI_FORMAT