Bitmap.MakeTransparent для приложения Магазина Windows?

В Winforms у нас есть метод Bitmap.MakeTransparent для установки прозрачного цвета. Есть ли эквивалентный метод в UWP? (Для WriteableBitmap или SoftwareBitmap и т. д.)


person ispiro    schedule 13.12.2015    source источник
comment
Нет ответа, скорее подсказка: попробуйте использовать GetPixel для просмотра изображения и SetPixel для установки прозрачных пикселей для определенных пикселей, которые вы хотите сделать прозрачными самостоятельно: github.com/teichgraf/WriteableBitmapEx (см. также stackoverflow.com/questions/16382536/ )   -  person sibbl    schedule 14.12.2015


Ответы (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 пока нет. Так что все зависит от вашей модели использования.

person Fangfang Wu - MSFT    schedule 14.12.2015