В Winforms у нас есть метод Bitmap.MakeTransparent
для установки прозрачного цвета. Есть ли эквивалентный метод в UWP? (Для WriteableBitmap
или SoftwareBitmap
и т. д.)
Bitmap.MakeTransparent для приложения Магазина Windows?
Ответы (1)
Есть несколько подходов к этому:
Во-первых, если вы используете растровое изображение в качестве кисти изображения элемента управления пользовательского интерфейса, вы можете просто установить его непрозрачность в соответствии с вашими требованиями. Простая демонстрация выглядит следующим образом:
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Rectangle x:Name="rct" Width="800" Height="800">
<Rectangle.Fill>
<ImageBrush x:Name="ib" ImageSource="Assets//hero.bmp" Stretch="Uniform" Opacity="0.5"/>
</Rectangle.Fill>
</Rectangle>
</Grid>
Второй способ — использовать компонент Windows Imaging. Здесь вы можете найти пример использования Direct2D и WIC Image вместе. Ниже приведены два простых решения:
1) С помощью интерфейса IWICFormatConverter.
В IWICFormatConverter.Initialize() установите порог альфа-канала в соответствии с вашими требованиями: значение AlphaThreshold используется для определения того, какой уровень непрозрачности будет сопоставлен с полностью прозрачным цветом в преобразованном формате. Значение 9,8 означает, что любой пиксель со значением альфа менее 25 будет сопоставлен с прозрачным цветом. Значение 100 сопоставляет все пиксели, которые не являются полностью непрозрачными, с прозрачным цветом. Затем вы можете рисовать растровое изображение с помощью D2D.
hr = m_pConvertedSourceBitmap->Initialize(
pFrame, // Input bitmap to convert
GUID_WICPixelFormat32bppPBGRA, // Destination pixel format
WICBitmapDitherTypeNone, // Specified dither pattern
NULL, // Specify a particular palette
0.f, // Alpha threshold
WICBitmapPaletteTypeCustom // Palette translation type
);
2) Получите IWICBitmapLock для указанного прямоугольника IWICBitmap, затем обработайте данные пикселей, которые теперь заблокированы объектом IWICBitmapLock.
Конечно, есть и другие решения, такие как использование WriteableBitmap для прямого управления пикселями изображения. Вот пример доступа к пикселям с помощью класса PixelDataProvider. для доступа к пикселям в растровом изображении.
Однако, за исключением элемента пользовательского интерфейса XAML, простой замены для Bitmap.MakeTransparent пока нет. Так что все зависит от вашей модели использования.