Dela via


Pixelformat och alfalägen som stöds

Det här avsnittet beskriver pixelformat och alfalägen som stöds av de olika delarna av Direct2D, inklusive varje återgivningsmåltyp, ID2D1Bitmapoch ID2D1ImageSource. Den innehåller följande avsnitt.

YUV-format som stöds för DXGI-avbildningskälla

En ID2D1ImageSource är en abstrakt provider av pixlar. Den kan instansieras från antingen WIC (CreateImageSourceFromWic eller en IDXGISurface (CreateImageSourceFromDxgi).

ID2D1ImageSourceFromWic stöder samma uppsättning pixelformat och alfalägen som ID2D1Bitmap.

Utöver ovanstående stöder en ID2D1ImageSource- som instansieras från IDXGISurface även vissa YUV-pixelformat, inklusive planardata som är uppdelade på flera ytor. Mer information om kraven för varje pixelformat finns i CreateImageSourceFromDxgi.

Format
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

 

Ange ett pixelformat för ett återgivningsmål

När du skapar ett återgivningsmål måste du ange dess pixelformat. Om du vill ange pixelformatet använder du en D2D1_PIXEL_FORMAT struktur för att ange pixelFormat medlem i en D2D1_RENDER_TARGET_PROPERTIES struktur. Sedan skickar du den strukturen till lämplig Create-metod, till exempel ID2D1Factory::CreateHwndRenderTarget.

Strukturen D2D1_PIXEL_FORMAT har två fält:

  • format, ett DXGI_FORMAT värde som beskriver storleken och arrangemanget för kanaler i varje pixel, och
  • alfa, ett D2D1_ALPHA_MODE-värde som beskriver hur alfainformation tolkas.

I följande exempel skapas en D2D1_PIXEL_FORMAT struktur och används för att ange pixelformatet och alfaläget för en ID2D1HwndRenderTarget.

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
    );

Olika återgivningsmål stöder olika kombinationer av format och alfaläge. I följande avsnitt visas de format- och alfakombinationer som stöds av varje återgivningsmål.

Format som stöds för ID2D1HwndRenderTarget

Vilka format som stöds för en ID2D1HwndRenderTarget beror på om det återges med hjälp av maskinvara eller programvara, eller om Direct2D hanterar återgivningsläget automatiskt som standard.

Not

Vi rekommenderar att du använder DXGI_FORMAT_B8G8R8A8_UNORM som pixelformat för bättre prestanda. Detta är särskilt användbart för mål för programvaruåtergivning. BGRA-formatmål presterar bättre än RGBA-format.

 

När du skapar en ID2D1HwndRenderTargetanvänder du D2D1_RENDER_TARGET_PROPERTIES-strukturen för att ange återgivningsalternativ. Alternativen inkluderar pixelformatet, enligt beskrivningen i föregående avsnitt. Med typfältet i den här strukturen kan du ange om återgivningsmålet återges till maskinvara eller programvara, eller om Direct2D automatiskt ska bestämma återgivningsläget.

Om du vill aktivera Direct2D för att avgöra om återgivningsmålet använder maskinvaru- eller programvaruåtergivning använder du inställningen D2D1_RENDER_TARGET_TYPE_DEFAULT.

I följande tabell visas de format som stöds för ID2D1HwndRenderTarget objekt som skapas med hjälp av inställningen D2D1_RENDER_TARGET_TYPE_DEFAULT.

Format Alfaläge
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

 

Om du vill tvinga ett återgivningsmål att använda maskinvarurendering använder du inställningen D2D1_RENDER_TARGET_TYPE_HARDWARE. I följande tabell visas de format som stöds för ID2D1HwndRenderTarget objekt som uttryckligen använder maskinvaruåtergivning.

Format Alfaläge
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

 

Om du vill tvinga ett återgivningsmål att använda programvarurendering använder du inställningen D2D1_RENDER_TARGET_TYPE_SOFTWARE. I följande tabell visas de format som stöds för ID2D1HwndRenderTarget objekt som uttryckligen använder programvaruåtergivning.

Format Alfaläge
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

 

Oavsett om ID2D1HwndRenderTarget är maskinvaruaccelererad använder DXGI_FORMAT_UNKNOWN-formatet DXGI_FORMAT_B8G8R8A8 som standard och D2D1_ALPHA_MODE_UNKNOWN alfaläge använder D2D1_ALPHA_MODE_IGNORE som standard.

Format som stöds för ID2D1DeviceContext

Från och med Windows 8 drar enhetskontexten nytta av fler av de Direct3D-högfärgsformat som:

  • DXGI_FORMAT_B8G8R8A8_UNORM_SRGB
  • DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
  • DXGI_FORMAT_R16G16B16A16_UNORM
  • DXGI_FORMAT_R16G16B16A16_FLOAT
  • DXGI_FORMAT_R32G32B32A32_FLOAT

Använd metoden ID2D1DeviceContext::IsDxgiFormatSupported för att se om ett format fungerar i en viss enhetskontext. Dessa format kan också fungera på en ID2D1HwndRenderTarget.

Dessa format är utöver de format som stöds av ID2D1HwndRenderTarget-gränssnittet i Windows 7. Mer information finns i enheter och enhetskontexter.

Format som stöds för kompatibelt återgivningsmål

Ett kompatibelt återgivningsmål (ett ID2D1BitmapRenderTarget- som skapas av en av ID2D1RenderTarget::CreateCompatibleRenderTarget metoder) ärver de format och alfalägen som stöds för återgivningsmålet som skapade det. Ett kompatibelt återgivningsmål stöder också följande kombinationer av format och alfaläge, oavsett vad dess överordnade stöder.

Format Alfaläge
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_STRAIGHT
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_UNKNOWN

 

I det DXGI_FORMAT_UNKNOWN formatet används det överordnade renderningsmålformatet som standard och D2D1_ALPHA_MODE_UNKNOWN alfaläge använder D2D1_ALPHA_MODE_PREMULTIPLIED som standard.

Format som stöds för DXGI Surface Render Target

Ett DXGI-renderingsmål är ett ID2D1RenderTarget- som skapas av någon av ID2D1Factory::CreateDxgiSurfaceRenderTarget metoder. Den stöder följande kombinationer av format och alfaläge.

Format Alfaläge
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

 

Not

Formatet måste matcha formatet på DXGI-ytan som måldragningsmålet för DXGI-ytan ritar till.

 

I DXGI_FORMAT_UNKNOWN format används DXGI-ytformatet som standard. Använd inte D2D1_ALPHA_MODE_UNKNOWN alfaläge med ett mål för DXGI-ytåtergivning. Den har inget standardvärde och gör att målskapandet av DXGI-ytåtergivningen misslyckas.

Format som stöds för WIC-bitmappsåtergivningsmål

Ett mål för WIC-bitmappsåtergivning är ett ID2D1RenderTarget- som skapas av någon av metoderna ID2D1Factory::CreateWicBitmapRenderTarget. Den stöder följande kombinationer av format och alfaläge.

Format Alfaläge
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

 

Pixelformatet för WIC-bitmappsmålet måste matcha pixelformatet för WIC-bitmappen.

I DXGI_FORMAT_UNKNOWN-formatet används WIC-bitmappsformatet som standard och D2D1_ALPHA_MODE_UNKNOWN alfaläge använder alfaläge för WIC-bitmapp som standard.

Format som stöds för ID2D1DCRenderTarget

En ID2D1DCRenderTarget- stöder följande kombinationer av format och alfaläge.

Format Alfaläge
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_IGNORE

 

Använd inte DXGI_FORMAT_UNKNOWN-formatet eller alfaläget D2D1_ALPHA_MODE_UNKNOWN med ett ID2D1DCRenderTarget-. Det har inget standardvärde och gör att ID2D1DCRenderTarget skapande misslyckas.

Ange ett pixelformat för en ID2D1Bitmap

I allmänhet stöder ID2D1Bitmap- objekt följande format och alfalägen (med vissa begränsningar som beskrivs i styckena som följer.)

Format Alfaläge
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 (endast Windows 8.1 och senare) D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_BC1_UNORM (endast Windows 8.1 och senare) D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_BC1_UNORM (endast Windows 8.1 och senare) D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_BC1_UNORM (endast Windows 8.1 och senare) D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_BC2_UNORM (endast Windows 8.1 och senare) D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_BC2_UNORM (endast Windows 8.1 och senare) D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_BC2_UNORM (endast Windows 8.1 och senare) D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_BC3_UNORM (endast Windows 8.1 och senare) D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_BC3_UNORM (endast Windows 8.1 och senare) D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_BC3_UNORM (endast Windows 8.1 och senare) D2D1_ALPHA_MODE_UNKNOWN

 

När du använder metoden ID2D1RenderTarget::CreateSharedBitmap använder du fältet pixelFormat i en D2D1_BITMAP_PROPERTIES struktur för att ange pixelformatet för det nya återgivningsmålet. Det måste matcha pixelformatet för ID2D1Bitmap källa.

När du använder metoden CreateBitmapFromWicBitmap använder du fältet pixelFormat i en D2D1_BITMAP_PROPERTIES struktur (i stället för pixelFormat medlem i en D2D1_RENDER_TARGET_PROPERTIES struktur) för att ange pixelformatet för det nya återgivningsmålet. Den måste matcha pixelformatet för WIC-bitmappskällan.

Not

Mer information om stöd för blockkomprimerade pixelformat (BCn) finns i Blockera komprimering.

 

WIC-format som stöds

När du använder metoden CreateBitmapFromWicBitmap för att skapa en bitmapp från en WIC-bitmapp eller när du använder metoden CreateSharedBitmap med en IWICBitmapLock-måste WIC-källan ha ett format som stöds av Direct2D.

WIC-format Motsvarande DXGI-format Motsvarande alfaläge
GUID_WICPixelFormat8bppAlpha DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_STRAIGHT eller D2D1_ALPHA_MODE_PREMULTIPLIED
GUID_WICPixelFormat32bppPRGBA DXGI_FORMAT_R8G8B8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED eller D2D1_ALPHA_MODE_IGNORE
GUID_WICPixelFormat32bppBGR DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_IGNORE
GUID_WICPixelFormat32bppPBGRA DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED

 

Ett exempel som visar hur du konverterar en WIC-bitmapp till ett format som stöds finns i Läsa in en bitmapp från en fil.

Använda ett format som inte stöds

Om du använder andra kombinationer än pixelformat och alfalägen som visas i de tidigare tabellerna resulterar det i ett D2DERR_UNSUPPORTED_PIXEL_FORMAT eller ett E_INVALIDARG fel.

Om Alfalägen

Om premultiplied och raka alfalägen

Den D2D1_ALPHA_MODE uppräkningen anger om alfakanalen använder premultiplied alfa, rak alfa eller ska ignoreras och betraktas som ogenomskinlig. Med rak alfa anger alfakanalen ett värde som motsvarar hur transparent en färg är.

Färger behandlas alltid som raka alfa av Direct2D-ritningskommandon och penslar, oavsett målformat.

Med förmultiplied alfa skalas varje färgkanal av alfavärdet. Normalt är inget färgkanalvärde större än alfakanalvärdet. Om ett färgkanalvärde i ett förmultnat format är större än alfakanalen skapar standardmatiken för källöverblandning en additiv blandning.

Värdet för själva alfakanalen är detsamma i både rak och för multiplicerad alfa.

Skillnaderna mellan rak och förmultiplied alfa

När du beskriver en RGBA-färg med rak alfa lagras alfavärdet för färgen i alfakanalen. Om du till exempel vill beskriva en röd färg som är 60% ogenomskinlig använder du följande värden: (255, 0, 0, 255 * 0,6) = (255, 0, 0, 153). Värdet 255 anger fullständigt rött och 153 (vilket är 60 procent av 255) anger att färgen ska ha en ogenomskinlighet på 60 procent.

När du beskriver en RGBA-färg med hjälp av förmultiplied alfa multipliceras varje färg med alfavärdet: (255 * 0,6, 0 * 0,6, 0 * 0,6, 255 * 0,6) = (153, 0, 0, 153).

Oavsett alfaläget för återgivningsmålet tolkas alltid D2D1_COLOR_F värden som raka alfa. När du till exempel anger färgen på en ID2D1SolidColorBrush för användning med ett återgivningsmål som använder det förmultiplierade alfaläget anger du färgen precis som du skulle göra om återgivningsmålet använde rak alfa. När du målar med penseln översätter Direct2D färgen till målformatet åt dig.

Alfaläge för återgivningsmål

Oavsett alfalägesinställningen stöder ett återgivningsmåls innehåll transparens. Om du till exempel ritar en delvis transparent röd rektangel med ett återgivningsmål med alfaläget D2D1_ALPHA_MODE_IGNOREvisas rektangeln rosa (om bakgrunden är vit).

Om du ritar en delvis transparent röd rektangel när alfaläget är D2D1_ALPHA_MODE_PREMULTIPLIEDvisas rektangeln rosa (förutsatt att bakgrunden är vit) och du kan se igenom den till det som finns bakom återgivningsmålet. Det här är användbart när du använder en ID2D1DCRenderTarget- för att återge till ett transparent fönster eller när du använder ett kompatibelt återgivningsmål (ett återgivningsmål som skapats av metoden CreateCompatibleRenderTarget) för att skapa en bitmapp som stöder transparens.

ClearType- och Alpha-lägen

Om du anger ett annat alfaläge än D2D1_ALPHA_MODE_IGNORE för ett återgivningsmål ändras textskyddsläget automatiskt från D2D1_TEXT_ANTIALIAS_MODE CLEARTYPE- till D2D1_TEXT_ANTIALIAS_MODE GRAYSCALE-. (När du anger ett alfaläge för D2D1_ALPHA_MODE_UNKNOWNanger Direct2D alfa för dig, beroende på typen av återgivningsmål.)

Du kan använda metoden SetTextAntialiasMode för att ändra tillbaka läget för textantialias till D2D1_TEXT_ANTIALIAS_MODE CLEARTYPE-, men om du återger ClearType-text till en transparent yta kan det ge oförutsägbara resultat. Om du vill återge ClearType-text till ett transparent återgivningsmål rekommenderar vi att du använder någon av följande två tekniker.

  • Använd metoden PushAxisAlignedClip för att klippa ut återgivningsmålet till det område där texten återges. Anropa sedan metoden Clear och ange en ogenomskinlig färg och återge sedan texten.
  • Använd DrawRectangle för att rita en ogenomskinlig rektangel bakom området där texten återges.

D2D1_PIXEL_FORMAT

D2D1_ALPHA_MODE

DXGI_FORMAT