Поддерживаемые форматы пикселей и режимы альфа-канала
В этом разделе описываются форматы пикселей и альфа-режимы, поддерживаемые различными частями Direct2D, включая каждый тип целевого объекта отрисовки, ID2D1Bitmap и ID2D1ImageSource. В него входят следующие разделы.
- Поддерживаемые форматы YUV для источника изображений DXGI
- Указание формата пикселей для целевого объекта отрисовки
- Поддерживаемые форматы для ID2D1HwndRenderTarget
- Поддерживаемые форматы для ID2D1DeviceContext
- Поддерживаемые форматы для совместимого целевого объекта отрисовки
- Поддерживаемые форматы для dxGI Surface Render Target
- Поддерживаемые форматы для целевого объекта отрисовки точечного изображения 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 для задания элемента pixelFormatD2D1_RENDER_TARGET_PROPERTIES структуры. Затем необходимо передать эту структуру в соответствующий метод Create, например ID2D1Factory::CreateHwndRenderTarget.
Структура D2D1_PIXEL_FORMAT содержит два поля:
- format, значение DXGI_FORMAT , описывающее размер и расположение каналов в каждом пикселе;
- alpha— значение 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 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 , чтобы нарисовать непрозрачный прямоугольник за областью, в которой будет отображаться текст.
Связанные темы
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по