Поддерживаемые форматы пикселей и режимы альфа-канала
В этом разделе описываются форматы пикселей и альфа-режимы, поддерживаемые различными частями Direct2D, включая каждый тип целевого объекта отрисовки, ID2D1Bitmap и ID2D1ImageSource. Он содержит следующие разделы.
- Поддерживаемые форматы YUV для источника изображений DXGI
- Указание формата пикселей для целевого объекта отрисовки
- Поддерживаемые форматы для ID2D1HwndRenderTarget
- Поддерживаемые форматы для ID2D1DeviceContext
- Поддерживаемые форматы для совместимого целевого объекта отрисовки
- Поддерживаемые форматы для целевого объекта отрисовки DXGI Surface
- Поддерживаемые форматы для целевого объекта отрисовки растрового изображения WIC
- Поддерживаемые форматы для ID2D1DCRenderTarget
- Указание формата пикселя для id2D1Bitmap
- Использование неподдерживаемого формата
- О альфа-режимах
- Связанные статьи
Поддерживаемые форматы 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 в прозрачном целевом объекте отрисовки, рекомендуется использовать один из следующих двух методов.
- Используйте метод PushAxisAlignedClip, чтобы вырезать целевой объект отрисовки в область, в которой будет отображаться текст, а затем вызвать метод Clear и указать непрозрачный цвет, а затем отобразить текст.
- Используйте DrawRectangle для рисования непрозрачного прямоугольника за областью, в которой будет отображаться текст.