Přehled neprůhledných masek
Toto téma popisuje, jak pomocí rastrových obrázků a štětců definovat neprůhledné masky. Obsahuje následující části.
- požadavky
- Co je maska neprůhlednosti?
- Použít bitmapu jako masku průhlednosti metodou FillOpacityMask
- Použití štětce jako masky průhlednosti s metodou FillGeometry
- Aplikujte masku neprůhlednosti na vrstvu
- související témata
Požadavky
Tento přehled předpokládá, že znáte základní operace kreslení Direct2D, jak je popsáno v Vytvoření jednoduché aplikace Direct2D návod. Měli byste být také obeznámeni s různými typy štětců, jak je popsáno v Přehled štětců.
Co je maska neprůhlednosti?
Maska neprůhlednosti je maska popsaná štětcem nebo rastrovým obrázkem, která se použije u jiného objektu, aby byl objekt částečně nebo zcela průhledný. Maska průhlednosti používá informace o alfa kanálu k určení způsobu, jak se zdrojové pixely objektu slučují do konečného cíle. Průhledné části masky označují oblasti, ve kterých je podkladový obrázek skrytý, zatímco neprůhledné části masky označují, kde je maskovaný objekt viditelný.
Masku neprůhlednosti můžete použít několika způsoby:
- Použijte metodu ID2D1RenderTarget::FillOpacityMask. Metoda FillOpacityMask maluje obdélníkovou oblast cíle vykreslení a pak použije neprůhlednou masku definovanou rastrovým obrázkem. Tuto metodu použijte, pokud je maska neprůhlednosti rastrový obrázek a chcete vyplnit obdélníkovou oblast.
- Použijte metodu ID2D1RenderTarget::FillGeometry. Metoda FillGeometry maluje interiér geometrie se zadaným ID2D1BitmapBrush, pak použije neprůhlednou masku definovanou štětcem. Tuto metodu použijte, pokud chcete použít masku neprůhlednosti na geometrii nebo chcete použít štětec jako neprůhlednou masku.
- K použití masky neprůhlednosti použijte ID2D1Layer. Tento přístup použijte, když chcete použít masku neprůhlednosti u skupiny obsahu výkresu, nejen u jednoho obrazce nebo obrázku. Podrobnosti najdete v přehledu vrstev.
Použijte bitmapu jako masku průhlednosti pomocí metody FillOpacityMask
Metoda FillOpacityMask maluje obdélníkovou oblast cíle vykreslení a pak použije neprůhlednou masku definovanou ID2D1Bitmap. Tuto metodu použijte, pokud máte rastrový obrázek, který chcete použít jako neprůhlednou masku pro obdélníkovou oblast.
Následující diagram znázorňuje efekt použití masky průhlednosti (ID2D1Bitmap s obrázkem květiny) na ID2D1BitmapBrush s obrázkem kapradiny. Výsledný obrázek je bitmapa rostliny klipnuté do tvaru květiny.
Následující příklady kódu ukazují, jak se toho dosahuje.
První příklad načte následující rastrový obrázek, m_pBitmapMask, pro použití jako rastrovou masku. Následující obrázek znázorňuje výstup, který se vytvoří. Všimněte si, že i když neprůhledná část rastrového obrázku vypadá černá, barevné informace v rastrovém obrázku nemají žádný vliv na neprůhlednou masku; Použijí se pouze informace o neprůhlednosti každého pixelu v rastrovém obrázku. Plně neprůhledné pixely v tomto rastrovém obrázku byly barevné pouze pro ilustrativní účely.
V tomto příkladu je ID2D1Bitmap načten pomocí pomocné metody LoadResourceBitmap definované jinde v ukázce.
if (SUCCEEDED(hr))
{
hr = LoadResourceBitmap(
m_pRenderTarget,
m_pWICFactory,
L"BitmapMask",
L"Image",
&m_pBitmapMask
);
}
Další příklad definuje štětec, m_pFernBitmapBrush, na který je použita neprůhledná maska. Tento příklad používá ID2D1BitmapBrush, který obsahuje obrázek kapradí, ale můžete použít ID2D1SolidColorBrush, ID2D1LinearGradientBrushnebo ID2D1RadialGradientBrush. Následující obrázek znázorňuje výstup, který se vytvoří.
if (SUCCEEDED(hr))
{
D2D1_BITMAP_BRUSH_PROPERTIES propertiesXClampYClamp =
D2D1::BitmapBrushProperties(
D2D1_EXTEND_MODE_CLAMP,
D2D1_EXTEND_MODE_CLAMP,
D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR
);
hr = m_pRenderTarget->CreateBitmapBrush(
m_pFernBitmap,
propertiesXClampYClamp,
&m_pFernBitmapBrush
);
}
Teď, když je definována maska neprůhlednosti a štětec, můžete použít metodu FillOpacityMask v metodě vykreslování vaší aplikace. Při volání metody FillOpacityMask musíte zadat typ masky neprůhlednosti, kterou používáte: D2D1_OPACITY_MASK_CONTENT_GRAPHICS, D2D1_OPACITY_MASK_CONTENT_TEXT_NATURALa D2D1_OPACITY_MASK_CONTENT_TEXT_GDI_COMPATIBLE. Významy těchto tří typů naleznete v tématu D2D1_OPACITY_MASK_CONTENT.
Poznámka
Počínaje Windows 8 se D2D1_OPACITY_MASK_CONTENT nevyžaduje. Podívejte se na metodu ID2D1DeviceContext::FillOpacityMask, která nemá žádný parametr D2D1_OPACITY_MASK_CONTENT.
Následující příklad nastaví antialiasingový režim cíle vykreslení na D2D1_ANTIALIAS_MODE_ALIASED, aby maska neprůhlednosti fungovala správně. Potom volá FillOpacityMask metoda a předá ji neprůhlednou masku (m_pBitmapMask), štětec, na který se použije neprůhledná maska (m_pFernBitmapBrush), typ obsahu uvnitř neprůhledné masky (D2D1_OPACITY_MASK_CONTENT_GRAPHICS) a oblast, která se má malovat. Následující obrázek znázorňuje výstup, který se vytvoří.
D2D1_RECT_F rcBrushRect = D2D1::RectF(5, 5, 155, 155);
// D2D1_ANTIALIAS_MODE_ALIASED must be set for FillOpacityMask to function properly
m_pRenderTarget->SetAntialiasMode(D2D1_ANTIALIAS_MODE_ALIASED);
m_pRenderTarget->FillOpacityMask(
m_pBitmapMask,
m_pFernBitmapBrush,
D2D1_OPACITY_MASK_CONTENT_GRAPHICS,
&rcBrushRect
);
m_pRenderTarget->SetAntialiasMode(D2D1_ANTIALIAS_MODE_PER_PRIMITIVE);
V tomto příkladu byl vynechán kód.
Použití štětce jako masky průhlednosti s metodou FillGeometry
Předchozí část popisuje, jak použít ID2D1Bitmap jako neprůhlednou masku. Direct2D také poskytuje ID2D1RenderTarget::FillGeometry metodu, která umožňuje volitelně zadat štětec jako masku průhlednosti při vyplnění ID2D1Geometry. To umožňuje vytvářet neprůhledné masky z přechodů (pomocí ID2D1LinearGradientBrush nebo ID2D1RadialGradientBrush) a rastrových obrázků (pomocí ID2D1Bitmap).
Metoda FillGeometry přebírá tři parametry:
- První parametr, ID2D1Geometry, definuje obrazec, který se má malovat.
- Druhý parametr, ID2D1Brush, určuje štětec použitý k vykreslení geometrie. Tento parametr musí být ID2D1BitmapBrush, který má režimy x a y nastavené na D2D1_EXTEND_MODE_CLAMP.
- Třetí parametr, ID2D1Brush, určuje štětec, který se má použít jako neprůhledná maska. Tento štětec může být ID2D1LinearGradientBrush, ID2D1RadialGradientBrushnebo ID2D1BitmapBrush. (Technicky vzato můžete použít ID2D1SolidColorBrush, ale použití plného barevného štětce jako neprůhledné masky negeneruje zajímavé výsledky.)
Následující části popisují, jak používat ID2D1LinearGradientBrush a ID2D1RadialGradientBrush objekty jako neprůhledné masky.
Použití lineárního přechodového štětce jako masky průhlednosti
Následující diagram znázorňuje efekt použití lineárního přechodového štětce na obdélník, který je vyplněn rastrovým obrázkem květin.
Následující kroky popisují, jak tento efekt znovu vytvořit.
Definujte obsah, který se má maskovat. Následující příklad vytvoří ID2D1BitmapBrush, m_pLinearFadeFlowersBitmap. Rozšiřující režimy x- a y- pro m_pLinearFadeFlowersBitmap jsou nastaveny na D2D1_EXTEND_MODE_CLAMP, takže může být použita s maskou neprůhlednosti metodou FillGeometry.
if (SUCCEEDED(hr)) { // Create the bitmap to be used by the bitmap brush. hr = LoadResourceBitmap( m_pRenderTarget, m_pWICFactory, L"LinearFadeFlowers", L"Image", &m_pLinearFadeFlowersBitmap ); } if (SUCCEEDED(hr)) { D2D1_BITMAP_BRUSH_PROPERTIES propertiesXClampYClamp = D2D1::BitmapBrushProperties( D2D1_EXTEND_MODE_CLAMP, D2D1_EXTEND_MODE_CLAMP, D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR );
C++ if (SUCCEEDED(hr)) { hr = m_pRenderTarget->CreateBitmapBrush( m_pLinearFadeFlowersBitmap, propertiesXClampYClamp, &m_pLinearFadeFlowersBitmapBrush ); }
C++ }
Definujte masku neprůhlednosti. Další příklad kódu vytvoří diagonální lineární přechodový štětec (m_pLinearGradientBrush), který zesvětlí z zcela neprůhledné černé na pozici 0 na zcela průhlednou bílou na pozici 1.
if (SUCCEEDED(hr))
{
ID2D1GradientStopCollection *pGradientStops = NULL;
static const D2D1_GRADIENT_STOP gradientStops[] =
{
{ 0.f, D2D1::ColorF(D2D1::ColorF::Black, 1.0f) },
{ 1.f, D2D1::ColorF(D2D1::ColorF::White, 0.0f) },
};
hr = m_pRenderTarget->CreateGradientStopCollection(
gradientStops,
2,
&pGradientStops);
if (SUCCEEDED(hr))
{
hr = m_pRenderTarget->CreateLinearGradientBrush(
D2D1::LinearGradientBrushProperties(
D2D1::Point2F(0, 0),
D2D1::Point2F(150, 150)),
pGradientStops,
&m_pLinearGradientBrush);
}
pGradientStops->Release();
}
- Použijte metodu FillGeometry. Poslední příklad používá metodu FillGeometry na štětec pro obsah, aby vyplnil ID2D1RectangleGeometry (m_pRectGeo) pomocí ID2D1BitmapBrush (m_pLinearFadeFlowersBitmap) a aplikuje neprůhlednostní masku (m_pLinearGradientBrush).
m_pRenderTarget->FillGeometry(
m_pRectGeo,
m_pLinearFadeFlowersBitmapBrush,
m_pLinearGradientBrush
);
V tomto příkladu byl vynechán kód.
Použití paprskového přechodového štětce jako neprůhledné masky
Následující diagram znázorňuje vizuální efekt použití paprskového přechodového štětce na obdélník, který je vyplněn rastrovým obrázkem listí.
První příklad vytvoří ID2D1BitmapBrush, m_pRadialFadeFlowersBitmapBrush. Aby ji bylo možné použít s neprůhlednou maskou FillGeometry metodou, je režim rozšíření x- a y- pro m_pRadialFadeFlowersBitmapBrush nastaven na D2D1_EXTEND_MODE_CLAMP.
if (SUCCEEDED(hr))
{
// Create the bitmap to be used by the bitmap brush.
hr = LoadResourceBitmap(
m_pRenderTarget,
m_pWICFactory,
L"RadialFadeFlowers",
L"Image",
&m_pRadialFadeFlowersBitmap
);
}
if (SUCCEEDED(hr))
{
D2D1_BITMAP_BRUSH_PROPERTIES propertiesXClampYClamp =
D2D1::BitmapBrushProperties(
D2D1_EXTEND_MODE_CLAMP,
D2D1_EXTEND_MODE_CLAMP,
D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR
);
C++ |
---|
|
C++ |
---|
|
Další příklad definuje paprskový přechodový štětec, který se použije jako maska neprůhlednosti.
if (SUCCEEDED(hr))
{
ID2D1GradientStopCollection *pGradientStops = NULL;
static const D2D1_GRADIENT_STOP gradientStops[] =
{
{ 0.f, D2D1::ColorF(D2D1::ColorF::Black, 1.0f) },
{ 1.f, D2D1::ColorF(D2D1::ColorF::White, 0.0f) },
};
hr = m_pRenderTarget->CreateGradientStopCollection(
gradientStops,
2,
&pGradientStops);
if (SUCCEEDED(hr))
{
hr = m_pRenderTarget->CreateRadialGradientBrush(
D2D1::RadialGradientBrushProperties(
D2D1::Point2F(75, 75),
D2D1::Point2F(0, 0),
75,
75),
pGradientStops,
&m_pRadialGradientBrush);
}
pGradientStops->Release();
}
Poslední příklad kódu používá ID2D1BitmapBrush (m_pRadialFadeFlowersBitmapBrush) a masku neprůhlednosti (m_pRadialGradientBrush) k vyplnění ID2D1RectangleGeometry (m_pRectGeo).
m_pRenderTarget->FillGeometry(
m_pRectGeo,
m_pRadialFadeFlowersBitmapBrush,
m_pRadialGradientBrush
);
V tomto příkladu byl vynechán kód.
Použití masky neprůhlednosti na vrstvu
Při volání PushLayer pro vložení ID2D1Layer do cíle vykreslení můžete použít strukturu D2D1_LAYER_PARAMETERS k aplikaci štětce jako masky průhlednosti. Následující příklad kódu používá ID2D1RadialGradientBrush jako neprůhlednou masku.
HRESULT DemoApp::RenderWithLayerWithOpacityMask(ID2D1RenderTarget *pRT)
{
HRESULT hr = S_OK;
// Create a layer.
ID2D1Layer *pLayer = NULL;
hr = pRT->CreateLayer(NULL, &pLayer);
if (SUCCEEDED(hr))
{
pRT->SetTransform(D2D1::Matrix3x2F::Translation(300, 250));
// Push the layer with the content bounds.
pRT->PushLayer(
D2D1::LayerParameters(
D2D1::InfiniteRect(),
NULL,
D2D1_ANTIALIAS_MODE_PER_PRIMITIVE,
D2D1::IdentityMatrix(),
1.0,
m_pRadialGradientBrush,
D2D1_LAYER_OPTIONS_NONE),
pLayer
);
pRT->DrawBitmap(m_pBambooBitmap, D2D1::RectF(0, 0, 190, 127));
pRT->FillRectangle(
D2D1::RectF(25.f, 25.f, 50.f, 50.f),
m_pSolidColorBrush
);
pRT->FillRectangle(
D2D1::RectF(50.f, 50.f, 75.f, 75.f),
m_pSolidColorBrush
);
pRT->FillRectangle(
D2D1::RectF(75.f, 75.f, 100.f, 100.f),
m_pSolidColorBrush
);
pRT->PopLayer();
}
SafeRelease(&pLayer);
return hr;
}
Další informace o použití vrstev naleznete v tématu Přehled vrstev.
Související témata