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


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

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

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

  • формат, DXGI_FORMAT значение, описывающее размер и расположение каналов в каждом пикселе, и
  • альфа- D2D1_ALPHA_MODE значение, описывающее интерпретацию альфа-информации.

В следующем примере создается структура 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

Цель отрисовки 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.

О альфа-режимах

О предварительно подготовленных и прямых альфа-режимах

Перечисление 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, 0 * 0,6, 255 * 0,6) = (153, 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 в прозрачном целевом объекте отрисовки, рекомендуется использовать один из следующих двух методов.

D2D1_PIXEL_FORMAT

D2D1_ALPHA_MODE

DXGI_FORMAT