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 y ID2D1ImageSource. Contiene las siguientes secciones.

Formatos YUV compatibles con 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 del que se crea una instancia desde IDXGISurface también admite algunos formatos de píxeles YUV, incluidos los datos planares divididos en varias superficies. Consulte CreateImageSourceFromDxgi para obtener más información sobre los requisitos de cada formato de píxel.

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

 

Especificación de 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, use una estructura D2D1_PIXEL_FORMAT para establecer el miembro pixelFormat de una estructura 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 que 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 compatibles con ID2D1HwndRenderTarget

Los formatos compatibles con un ID2D1HwndRenderTarget dependen de si se representa mediante hardware o software, o de 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 resulta 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 indica 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 compatibles con los objetos ID2D1HwndRenderTarget creados mediante la configuración de D2D1_RENDER_TARGET_TYPE_DEFAULT.

Format 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 compatibles con los objetos ID2D1HwndRenderTarget que usan explícitamente la representación de hardware.

Format 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 compatibles con los objetos ID2D1HwndRenderTarget que usan explícitamente la representación de software.

Format 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 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 compatibles con ID2D1DeviceContext

A partir de Windows 8, el contexto del dispositivo aprovecha más de los formatos de color de alta densidad 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 compatibles con la interfaz ID2D1HwndRenderTarget en Windows 7. Para obtener más información, consulte Dispositivos y contextos de dispositivo.

Formatos compatibles con el destino de representación compatible

Un destino de representación compatible (un ID2D1BitmapRenderTarget que se crea con uno de los métodos ID2D1RenderTarget::CreateCompatibleRenderTarget) hereda los formatos compatibles 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.

Format 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 principal de forma predeterminada y el modo alfa de D2D1_ALPHA_MODE_UNKNOWN usa D2D1_ALPHA_MODE_PREMULTIPLIED de forma predeterminada.

Formatos compatibles con el destino de representación de Surface DXGI

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

Format 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 en 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 use 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 la superficie DXGI.

Formatos compatibles con el destino de representación de mapa de bits de WIC

Un destino de representación de mapa de bits de WIC es un ID2D1RenderTarget que se crea con uno de los métodos ID2D1Factory::CreateWicBitmapRenderTarget. Admite las siguientes combinaciones de formato y modo alfa.

Format 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 de WIC debe coincidir con el formato de píxel del mapa de bits de WIC.

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

Formatos compatibles con ID2D1DCRenderTarget

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

Format 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.

Especificación de un formato de píxel para un 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).

Format 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 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 de ID2D1Bitmap.

Cuando se usa el método CreateBitmapFromWicBitmap, se usa el campo pixelFormat de una estructura 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 de mapa de bits de WIC.

Nota:

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

 

Formatos de WIC compatibles

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

Formato de 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 ver un ejemplo en el que se muestra cómo convertir un mapa de bits de WIC a un formato compatible, consulte Cómo cargar un mapa de bits desde un archivo.

Uso de un formato no compatible

El uso de cualquier combinación que no sean los formatos de píxeles y los modos alfa que se enumeran en las tablas anteriores da como resultado un error de D2DERR_UNSUPPORTED_PIXEL_FORMAT o 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 si debe omitirse y considerarse opaco. Con el alfa recto, el canal alfa indica un valor que corresponde a la transparencia de un color.

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

Con alfa premultiplicado, cada canal de color se escala según 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 premultiplicado es mayor que el canal alfa, la matemática estándar de mezcla sobre la fuente crea una mezcla aditiva.

El valor del propio canal alfa es el mismo en alfa recto y premultiplicado.

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 un 60 % opaco, use los siguientes valores: (255, 0, 0, 255 * 0,6) = (255, 0, 0, 153). El valor 255 indica rojo completo y 153 (que es el 60 por ciento de 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, 0,6, 255 * 0,6) = (153, 0, 0, 153).

Independientemente del modo alfa del destino de representación, los valores 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 igual que 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 la 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á en 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á en rosa (suponiendo que el fondo es blanco) y podrá ver a través de él lo que haya detrás del objeto 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 con 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 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, dependiendo del tipo de destino de representación).

Puede usar el método SetTextAntialiasMode para volver a cambiar el modo de suavizado de texto a D2D1_TEXT_ANTIALIAS_MODE CLEARTYPE, pero la representación del texto ClearType en una superficie transparente puede crear resultados impredecibles. 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 y, a continuación, llame al método Clear, 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