Formatos de píxel admitidos y modos alfa

En este tema se describen los formatos de píxeles y los modos alfa admitidos por las distintas partes de Direct2D, incluidos cada tipo de destino de representación, ID2D1Bitmap e ID2D1ImageSource. Contiene las siguientes secciones:

Formatos YUV admitidos para el origen de imagen DXGI

Id2D1ImageSource es un proveedor abstracto de píxeles. Se puede crear una instancia desde WIC (CreateImageSourceFromWic o idXGISurface (CreateImageSourceFromDxgi).

ID2D1ImageSourceFromWic admite el mismo conjunto de formatos de píxeles y modos alfa que ID2D1Bitmap.

Además de lo anterior, un ID2D1ImageSource al que se crea una instancia de IDXGISurface también admite algunos formatos de píxeles YUV, incluidos los datos planos divididos en varias superficies. Consulte CreateImageSourceFromDxgi para obtener más información sobre los requisitos de cada formato de píxel.

Formato
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

 

Especificar un formato de píxel para un destino de representación

Al crear un destino de representación, debe especificar su formato de píxel. Para especificar el formato de píxel, se usa una estructura de D2D1_PIXEL_FORMAT para establecer el miembro pixelFormat de una estructura de D2D1_RENDER_TARGET_PROPERTIES . A continuación, pase esa estructura al método Create adecuado, como ID2D1Factory::CreateHwndRenderTarget.

La estructura D2D1_PIXEL_FORMAT tiene dos campos:

  • format, un valor de DXGI_FORMAT que describe el tamaño y la disposición de los canales en cada píxel, y
  • alpha, un valor de D2D1_ALPHA_MODE que describe cómo se interpreta la información alfa.

En el ejemplo siguiente se crea una estructura D2D1_PIXEL_FORMAT y se usa para especificar el formato de píxel y el modo alfa de un 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
    );

Los diferentes destinos de representación admiten diferentes combinaciones de formato y modo alfa. En las secciones siguientes se enumeran las combinaciones de formato y alfa admitidas por cada destino de representación.

Formatos admitidos para ID2D1HwndRenderTarget

Los formatos admitidos para un ID2D1HwndRenderTarget dependen de si se representa mediante hardware o software, o si Direct2D controla el modo de representación automáticamente de forma predeterminada.

Nota

Se recomienda usar DXGI_FORMAT_B8G8R8A8_UNORM como formato de píxel para mejorar el rendimiento. Esto es especialmente útil para los destinos de representación de software. Los destinos de formato BGRA funcionan mejor que los formatos RGBA.

 

Al crear un ID2D1HwndRenderTarget, se usa la estructura D2D1_RENDER_TARGET_PROPERTIES para especificar las opciones de representación. Las opciones incluyen el formato de píxel, como se indicó en la sección anterior. El campo de tipo de esta estructura permite especificar si el destino de representación se representa en hardware o software, o si Direct2D debe determinar automáticamente el modo de representación.

Para habilitar Direct2D para determinar si el destino de representación usa la representación de hardware o software, use la configuración de D2D1_RENDER_TARGET_TYPE_DEFAULT .

En la tabla siguiente se enumeran los formatos admitidos para los objetos ID2D1HwndRenderTarget creados mediante la configuración de D2D1_RENDER_TARGET_TYPE_DEFAULT .

Formato Modo alfa
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

 

Para forzar que un destino de representación use la representación de hardware, use la configuración de D2D1_RENDER_TARGET_TYPE_HARDWARE . En la tabla siguiente se enumeran los formatos admitidos para los objetos ID2D1HwndRenderTarget que usan explícitamente la representación de hardware.

Formato Modo alfa
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

 

Para forzar que un destino de representación use la representación de software, use la configuración de D2D1_RENDER_TARGET_TYPE_SOFTWARE . En la tabla siguiente se enumeran los formatos admitidos para los objetos ID2D1HwndRenderTarget que usan explícitamente la representación de software.

Formato Modo alfa
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

 

Independientemente de si id2D1HwndRenderTarget está acelerado por hardware, el formato de DXGI_FORMAT_UNKNOWN usa DXGI_FORMAT_B8G8R8A8 de forma predeterminada y el modo alfa de D2D1_ALPHA_MODE_UNKNOWN usa D2D1_ALPHA_MODE_IGNORE de forma predeterminada.

Formatos admitidos para ID2D1DeviceContext

A partir de Windows 8 el contexto del dispositivo aprovecha más de los formatos de color alto de Direct3D, como:

  • DXGI_FORMAT_B8G8R8A8_UNORM_SRGB
  • DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
  • DXGI_FORMAT_R16G16B16A16_UNORM
  • DXGI_FORMAT_R16G16B16A16_FLOAT
  • DXGI_FORMAT_R32G32B32A32_FLOAT

Use el método ID2D1DeviceContext::IsDxgiFormatSupported para ver si un formato funciona en un contexto de dispositivo determinado. Estos formatos también pueden funcionar en un ID2D1HwndRenderTarget.

Estos formatos se agregan a los formatos admitidos por la interfaz ID2D1HwndRenderTarget en Windows 7. Consulte Dispositivos y contextos de dispositivo para obtener más información.

Formatos admitidos para el destino de representación compatible

Un destino de representación compatible (un id2D1BitmapRenderTarget creado por uno de los métodos ID2D1RenderTarget::CreateCompatibleRenderTarget ) hereda los formatos admitidos y los modos alfa del destino de representación que lo creó. Un destino de representación compatible también admite las siguientes combinaciones de formato y modo alfa, independientemente de lo que admita su elemento primario.

Formato Modo alfa
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_STRAIGHT
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_UNKNOWN

 

El formato DXGI_FORMAT_UNKNOWN usa el formato de destino de representación primario de forma predeterminada y el modo alfa de D2D1_ALPHA_MODE_UNKNOWN usa D2D1_ALPHA_MODE_PREMULTIPLIED de forma predeterminada.

Formatos admitidos para el destino de representación de Surface DXGI

Un destino de representación DXGI es un ID2D1RenderTarget creado por uno de los métodos ID2D1Factory::CreateDxgiSurfaceRenderTarget . Admite las siguientes combinaciones de formato y modo alfa.

Formato Modo alfa
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

 

Nota

El formato debe coincidir con el formato de la superficie DXGI a la que dibuja el destino de representación de la superficie DXGI.

 

El formato DXGI_FORMAT_UNKNOWN usa el formato de superficie DXGI de forma predeterminada. No utilice el modo alfa de D2D1_ALPHA_MODE_UNKNOWN con un destino de representación de superficie DXGI. No tiene ningún valor predeterminado y hará que se produzca un error en la creación del destino de representación de superficie DXGI.

Formatos admitidos para el destino de representación de mapa de bits wic

Un destino de representación de mapa de bits wic es un id2D1RenderTarget creado por uno de los métodos ID2D1Factory::CreateWicBitmapRenderTarget . Admite las siguientes combinaciones de formato y modo alfa.

Formato Modo alfa
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

 

El formato de píxel del destino de mapa de bits WIC debe coincidir con el formato de píxel del mapa de bits WIC.

El formatoDXGI_FORMAT_UNKNOWN usa el formato de mapa de bits WIC de forma predeterminada y el modo alfa de D2D1_ALPHA_MODE_UNKNOWN usa el modo alfa de mapa de bits WIC de forma predeterminada.

Formatos admitidos para ID2D1DCRenderTarget

Un ID2D1DCRenderTarget admite las siguientes combinaciones de formato y modo alfa.

Formato Modo alfa
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_IGNORE

 

No use el formato DXGI_FORMAT_UNKNOWN ni el modo alfa de D2D1_ALPHA_MODE_UNKNOWN con un ID2D1DCRenderTarget. No tiene ningún valor predeterminado y hará que se produzca un error en la creación de ID2D1DCRenderTarget .

Especificar un formato de píxel para un objeto ID2D1Bitmap

Por lo general, los objetos ID2D1Bitmap admiten los siguientes formatos y modos alfa (con algunas restricciones, que se describen en los párrafos siguientes).

Formato Modo alfa
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 (solo Windows 8.1 y versiones posteriores) D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_BC1_UNORM (solo Windows 8.1 y versiones posteriores) D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_BC1_UNORM (solo Windows 8.1 y versiones posteriores) D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_BC1_UNORM (solo Windows 8.1 y versiones posteriores) D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_BC2_UNORM (solo Windows 8.1 y versiones posteriores) D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_BC2_UNORM (solo Windows 8.1 y versiones posteriores) D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_BC2_UNORM (solo Windows 8.1 y versiones posteriores) D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_BC3_UNORM (solo Windows 8.1 y versiones posteriores) D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_BC3_UNORM (solo Windows 8.1 y versiones posteriores) D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_BC3_UNORM (solo Windows 8.1 y versiones posteriores) D2D1_ALPHA_MODE_UNKNOWN

 

Cuando se usa el método ID2D1RenderTarget::CreateSharedBitmap , se usa el campo pixelFormat de una estructura de D2D1_BITMAP_PROPERTIES para especificar el formato de píxel del nuevo destino de representación. Debe coincidir con el formato de píxel del origen ID2D1Bitmap .

Cuando se usa el método CreateBitmapFromWicBitmap , se usa el campo pixelFormat de una estructura de D2D1_BITMAP_PROPERTIES (en lugar del miembro pixelFormat de una estructura D2D1_RENDER_TARGET_PROPERTIES ) para especificar el formato de píxel del nuevo destino de representación. Debe coincidir con el formato de píxel del origen del mapa de bits WIC.

Nota

Para obtener más información sobre la compatibilidad con formatos de píxeles comprimidos en bloques (BCn), consulte Compresión de bloques.

 

Formatos WIC admitidos

Cuando usas el método CreateBitmapFromWicBitmap para crear un mapa de bits a partir de un mapa de bits WIC, o cuando usas el método CreateSharedBitmap con un IWICBitmapLock, el origen wiC debe estar en un formato compatible con Direct2D.

Formato WIC Formato DXGI correspondiente Modo alfa correspondiente
GUID_WICPixelFormat8bppAlpha DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_STRAIGHT o D2D1_ALPHA_MODE_PREMULTIPLIED
GUID_WICPixelFormat32bppPRGBA DXGI_FORMAT_R8G8B8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED o D2D1_ALPHA_MODE_IGNORE
GUID_WICPixelFormat32bppBGR DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_IGNORE
GUID_WICPixelFormat32bppPBGRA DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED

 

Para obtener un ejemplo en el que se muestra cómo convertir un mapa de bits WIC a un formato compatible, vea Cómo cargar un mapa de bits desde un archivo.

Usar un formato no admitido

El uso de cualquier combinación distinta de los formatos de píxeles y modos alfa que se enumeran en las tablas anteriores produce un error de D2DERR_UNSUPPORTED_PIXEL_FORMAT o de E_INVALIDARG .

Acerca de los modos alfa

Acerca de los modos alfa premultiplicados y rectos

La enumeración D2D1_ALPHA_MODE indica si el canal alfa usa alfa premultiplicado, alfa recto o debe omitirse y considerarse opaco. Con alfa recto, el canal alfa indica un valor que corresponde a la transparencia de un color.

Los colores siempre se tratan como alfa rectos mediante comandos de dibujo y pinceles direct2D, independientemente del formato de destino.

Con alfa premultiplicado, cada canal de color se escala mediante el valor alfa. Normalmente, ningún valor de canal de color es mayor que el valor del canal alfa. Si un valor de canal de color en un formato multiplicado previamente es mayor que el canal alfa, el origen estándar de la combinación matemática crea una mezcla aditiva.

El valor del canal alfa es el mismo en alfa recto y pre multiplicado.

Diferencias entre alfa recto y premultiplicado

Al describir un color RGBA mediante alfa recto, el valor alfa del color se almacena en el canal alfa. Por ejemplo, para describir un color rojo que es 60 % opaco, use los valores siguientes: (255, 0, 0, 255 * 0,6) = (255, 0, 0, 153). El valor 255 indica rojo completo y 153 (que es el 60 por ciento del 255) indica que el color debe tener una opacidad del 60 por ciento.

Al describir un color RGBA mediante alfa premultiplicado, cada color se multiplica por el valor alfa: (255 * 0,6, 0 * 0,6, 0 * 0,6, 255 * 0,6) = (153, 0, 0, 153).

Independientemente del modo alfa del destino de representación, los valores de D2D1_COLOR_F siempre se interpretan como alfa recto. Por ejemplo, al especificar el color de un ID2D1SolidColorBrush para su uso con un destino de representación que usa el modo alfa premultiplicado, especifique el color como lo haría si el destino de representación usara alfa recto. Al pintar con el pincel, Direct2D traduce el color al formato de destino automáticamente.

Modo alfa para destinos de representación

Independientemente de la configuración del modo alfa, el contenido de un destino de representación admite transparencia. Por ejemplo, si dibuja un rectángulo rojo parcialmente transparente con un destino de representación con un modo alfa de D2D1_ALPHA_MODE_IGNORE, el rectángulo aparecerá rosa (si el fondo es blanco).

Si dibuja un rectángulo rojo parcialmente transparente cuando el modo alfa es D2D1_ALPHA_MODE_PREMULTIPLIED, el rectángulo aparecerá rosa (suponiendo que el fondo es blanco) y puede verlo a lo que esté detrás del destino de representación. Esto resulta útil cuando se usa un ID2D1DCRenderTarget para representarlo en una ventana transparente o cuando se usa un destino de representación compatible (un destino de representación creado por el método CreateCompatibleRenderTarget ) para crear un mapa de bits que admita transparencia.

Modos ClearType y Alfa

Si especifica un modo alfa distinto de D2D1_ALPHA_MODE_IGNORE para un destino de representación, el modo de suavizado de contorno de texto cambia automáticamente de D2D1_TEXT_ANTIALIAS_MODE CLEARTYPE a D2D1_TEXT_ANTIALIAS_MODE GRAYSCALE. (Cuando se especifica un modo alfa de D2D1_ALPHA_MODE_UNKNOWN, Direct2D establece el alfa para usted, según el tipo de destino de representación).

Puede usar el método SetTextAntialiasMode para volver a cambiar el modo antialias de texto a D2D1_TEXT_ANTIALIAS_MODE CLEARTYPE, pero la representación del texto ClearType en una superficie transparente puede crear resultados imprevisibles. Si desea representar texto ClearType en un destino de representación transparente, se recomienda usar una de las dos técnicas siguientes.

  • Use el método PushAxisAlignedClip para recortar el destino de representación en el área donde se representará el texto, luego llame al método Clear y especifique un color opaco y, a continuación, represente el texto.
  • Use DrawRectangle para dibujar un rectángulo opaco detrás del área donde se representará el texto.

D2D1_PIXEL_FORMAT

D2D1_ALPHA_MODE

DXGI_FORMAT