Поделиться через


Поддерживаемые форматы пикселей и режимы альфа-канала

В этом разделе описываются форматы пикселей и альфа-режимы, поддерживаемые различными частями Direct2D, включая каждый тип целевого объекта отрисовки, ID2D1Bitmap и ID2D1ImageSource. В него входят следующие разделы.

Поддерживаемые форматы YUV для источника изображений DXGI

ID2D1ImageSource — это абстрактный поставщик пикселей. Его можно создать из WIC (CreateImageSourceFromWic ) или IDXGISurface (CreateImageSourceFromDxgi).

ID2D1ImageSourceFromWic поддерживает тот же набор форматов пикселей и альфа-режимов, что и ID2D1Bitmap.

В дополнение к описанному выше , ID2D1ImageSource , созданный из IDXGISurface , также поддерживает некоторые форматы пикселей 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 для задания элемента pixelFormatD2D1_RENDER_TARGET_PROPERTIES структуры. Затем необходимо передать эту структуру в соответствующий метод Create, например ID2D1Factory::CreateHwndRenderTarget.

Структура D2D1_PIXEL_FORMAT содержит два поля:

В следующем примере создается структура D2D1_PIXEL_FORMAT и она используется для указания формата пикселей и альфа-режима 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
    );

Различные целевые объекты отрисовки поддерживают различные сочетания форматов и альфа-режимов. В следующих разделах перечислены сочетания формата и альфа,поддерживаемые каждым целевым объектом отрисовки.

Поддерживаемые форматы для ID2D1HwndRenderTarget

Поддерживаемые форматы для ID2D1HwndRenderTarget зависят от того, выполняется ли он отрисовка с помощью оборудования или программного обеспечения, а также от того, обрабатывает ли Direct2D режим отрисовки автоматически по умолчанию.

Примечание

Для повышения производительности рекомендуется использовать DXGI_FORMAT_B8G8R8A8_UNORM в качестве формата пикселей. Это особенно полезно для целевых объектов программной отрисовки. Целевые объекты формата BGRA работают лучше, чем форматы RGBA.

 

При создании id2D1HwndRenderTarget используется структура D2D1_RENDER_TARGET_PROPERTIES для указания параметров отрисовки. Параметры включают формат пикселей, как было отмечено в предыдущем разделе. Поле типа этой структуры позволяет указать, будет ли целевой объект отрисовки отрисовывать оборудование или программное обеспечение, или direct2D должен автоматически определять режим отрисовки.

Чтобы включить Direct2D для определения того, использует ли целевой объект отрисовки аппаратное или программное обеспечение, используйте параметр D2D1_RENDER_TARGET_TYPE_DEFAULT .

В следующей таблице перечислены поддерживаемые форматы для объектов ID2D1HwndRenderTarget , созданных с помощью параметра D2D1_RENDER_TARGET_TYPE_DEFAULT .

Формат Альфа-режим
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 , которые явно используют аппаратную отрисовку.

Формат Альфа-режим
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 , которые явно используют программную отрисовку.

Формат Альфа-режим
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 альфа-режим использует 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.

Эти форматы являются дополнением к форматам, поддерживаемым интерфейсом ID2D1HwndRenderTarget в Windows 7. Дополнительные сведения см. в разделе Устройства и контексты устройств .

Поддерживаемые форматы для совместимого целевого объекта отрисовки

Совместимый целевой объект отрисовки ( id2D1BitmapRenderTarget , созданный одним из методов ID2D1RenderTarget::CreateCompatibleRenderTarget ) наследует поддерживаемые форматы и режимы альфа-канала целевого объекта отрисовки, который его создал. Совместимый целевой объект отрисовки также поддерживает следующие сочетания форматов и альфа-режимов независимо от того, что поддерживает его родительский объект.

Формат Альфа-режим
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 альфа-режиме — D2D1_ALPHA_MODE_PREMULTIPLIED по умолчанию.

Поддерживаемые форматы для dxGI Surface Render Target

Целевой объект отрисовки DXGI — это id2D1RenderTarget , созданный одним из методов ID2D1Factory::CreateDxgiSurfaceRenderTarget . Он поддерживает следующие сочетания форматов и альфа-режимов.

Формат Альфа-режим
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. Не используйте D2D1_ALPHA_MODE_UNKNOWN альфа-режим с целевым объектом отрисовки поверхности DXGI. Он не имеет значения по умолчанию и приведет к сбою создания целевого объекта визуализации поверхности DXGI.

Поддерживаемые форматы для целевого объекта отрисовки точечного изображения WIC

Целевой объект отрисовки точечного изображения WIC — это ID2D1RenderTarget , созданный одним из методов ID2D1Factory::CreateWicBitmapRenderTarget . Он поддерживает следующие сочетания форматов и альфа-режимов.

Формат Альфа-режим
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 альфа-режим использует по умолчанию режим точечных изображений WIC.

Поддерживаемые форматы для ID2D1DCRenderTarget

ID2D1DCRenderTarget поддерживает следующие сочетания форматов и альфа-режимов.

Формат Альфа-режим
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_IGNORE

 

Не используйте формат DXGI_FORMAT_UNKNOWN или D2D1_ALPHA_MODE_UNKNOWN альфа-режим с ID2D1DCRenderTarget. Он не имеет значения по умолчанию и приведет к сбою создания ID2D1DCRenderTarget .

Указание формата пикселей для ID2D1Bitmap

Как правило, объекты ID2D1Bitmap поддерживают следующие форматы и альфа-режимы (с некоторыми ограничениями, описанными в следующих абзацах).

Формат Альфа-режим
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 используется поле pixelFormatструктуры D2D1_BITMAP_PROPERTIES , чтобы указать формат пикселей нового целевого объекта отрисовки. Он должен соответствовать формату пикселей источника ID2D1Bitmap .

При использовании метода CreateBitmapFromWicBitmap используется поле pixelFormatструктуры D2D1_BITMAP_PROPERTIES (вместо элемента pixelFormatструктуры D2D1_RENDER_TARGET_PROPERTIES ), чтобы указать формат пикселей нового целевого объекта отрисовки. Он должен соответствовать формату пикселей источника точечных изображений WIC.

Примечание

Дополнительные сведения о поддержке форматов пикселей со сжатием блоков (BCN) см. в разделе Сжатие блоков.

 

Поддерживаемые форматы WIC

При использовании метода CreateBitmapFromWicBitmap для создания растрового изображения из wic или при использовании метода CreateSharedBitmap с IWICBitmapLock источник WIC должен быть в формате, поддерживаемом Direct2D.

Формат WIC Соответствующий формат DXGI Соответствующий альфа-режим
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 в поддерживаемый формат см. в разделе Загрузка растрового изображения из файла.

Использование неподдерживаемого формата

Использование любого сочетания, кроме форматов пикселей и альфа-режимов, перечисленных в предыдущих таблицах, приводит к D2DERR_UNSUPPORTED_PIXEL_FORMAT или ошибке E_INVALIDARG .

Сведения о режимах альфа-канала

Сведения о режимах premultiplied и прямого альфа-канала

Перечисление D2D1_ALPHA_MODE указывает, использует ли альфа-канал предварительно заданный альфа-канал, прямой альфа-канал или следует игнорировать и считать непрозрачным. При использовании прямого альфа-канала альфа указывает значение, соответствующее прозрачности цвета.

Цвета всегда обрабатываются как прямые альфа-каналы с помощью команд рисования Direct2D и кистей, независимо от формата назначения.

При предварительном использовании альфа-канала каждый цветовые каналы масштабируются по значению альфа. Как правило, значение канала цвета не превышает значение альфа-канала. Если значение цветного канала в формате с предварительно умноженным значением больше, чем альфа-канал, то стандартная математика смешения с исходным кодом создает аддитивную смесь.

Значение самого альфа-канала одинаково как в прямом, так и в предварительно умноженном альфа-канале.

Различия между прямой и предварительной альфа

При описании цвета RGBA с помощью прямого альфа-канала альфа-значение цвета сохраняется в альфа-канале. Например, чтобы описать непрозрачный красный цвет на 60 %, используйте следующие значения: (255, 0, 0, 255 * 0,6) = (255, 0, 0, 153). Значение 255 указывает на полный красный цвет, а 153 (что составляет 60 процентов от 255) указывает, что цвет должен иметь непрозрачность 60 процентов.

При описании цвета RGBA с помощью предварительного альфа-канала каждый цвет умножается на альфа-значение: (255 * 0,6, 0 * 0,6, 0 * 0,6, 255 * 0,6) = (153, 0, 0, 153).

Независимо от режима альфа целевого объекта отрисовки , значения D2D1_COLOR_F всегда интерпретируются как прямые альфа-каналы. Например, при указании цвета ID2D1SolidColorBrush для использования с целевым объектом отрисовки, использующим предварительно заданный альфа-режим, укажите цвет так же, как если бы целевой объект отрисовки использовал прямой альфа-канал. При рисовании с помощью кисти Direct2D преобразует цвет в формат назначения.

Альфа-режим для целевых объектов отрисовки

Независимо от параметра альфа-режима содержимое целевого объекта отрисовки поддерживает прозрачность. Например, если нарисовать частично прозрачный красный прямоугольник с целевым объектом отрисовки с альфа-режимом D2D1_ALPHA_MODE_IGNORE, прямоугольник будет розовый (если фон белый).

Если вы нарисуете частично прозрачный красный прямоугольник, когда альфа-режим D2D1_ALPHA_MODE_PREMULTIPLIED, прямоугольник будет розовый (при условии, что фон белый), и вы сможете видеть через него все, что находится за целевым объектом отрисовки. Это полезно при использовании ID2D1DCRenderTarget для отрисовки в прозрачном окне или при использовании совместимого целевого объекта отрисовки (целевого объекта отрисовки, созданного методом CreateCompatibleRenderTarget ) для создания растрового изображения, поддерживающего прозрачность.

Режимы ClearType и Альфа

Если для целевого объекта отрисовки указан режим альфа, отличный от D2D1_ALPHA_MODE_IGNORE , режим сглаживания текста автоматически изменится с D2D1_TEXT_ANTIALIAS_MODE CLEARTYPE на D2D1_TEXT_ANTIALIAS_MODE GRAYSCALE. (При указании альфа-режима D2D1_ALPHA_MODE_UNKNOWN Direct2D задает альфа-канал в зависимости от типа целевого объекта отрисовки.)

Вы можете использовать метод SetTextAntialiasMode , чтобы изменить режим сглаживания текста обратно на D2D1_TEXT_ANTIALIAS_MODE CLEARTYPE, но отрисовка текста ClearType на прозрачной поверхности может создать непредсказуемые результаты. Если вы хотите преобразовать текст ClearType в прозрачный целевой объект отрисовки, рекомендуется использовать один из следующих двух методов.

  • Используйте метод PushAxisAlignedClip , чтобы обрезать целевой объект отрисовки до области, в которой будет отображаться текст, затем вызовите метод Clear и укажите непрозрачный цвет, а затем отрисуйте текст.
  • Используйте DrawRectangle , чтобы нарисовать непрозрачный прямоугольник за областью, в которой будет отображаться текст.

D2D1_PIXEL_FORMAT

D2D1_ALPHA_MODE

DXGI_FORMAT