Windows Store App的Bitmap.MakeTransparent?

时间:2015-12-13 14:13:09

标签: c# windows-store-apps win-universal-app uwp

在Winforms中,我们使用Bitmap.MakeTransparent方法将颜色设置为透明。 UWP中是否存在等效方法? (适用于WriteableBitmapSoftwareBitmap等)

1 个答案:

答案 0 :(得分:0)

有几种方法可以解决这个问题:

首先,如果您将位图用作UI控件的图像画笔,则可以根据需要设置其不透明度。一个简单的演示如下:

<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 Component。 Here您可以找到有关一起使用Direct2D和WIC Image的示例。以下是两个简单的解决方案:

1)使用IWICFormatConverter界面。

在IWICFormatConverter.Initialize()中,根据您的要求设置Alpha阈值:AlphaThreshold值用于确定将哪种级别的不透明度映射到转换后的格式中的完全透明色。值9.8表示任何alpha值小于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)获取IWICBitmap的指定矩形的IWICBitmapLock,然后处理现在由IWICBitmapLock对象锁定的像素数据。

当然还有其他解决方案,例如使用WriteableBitmap直接操作图像像素。这是一个sample,可以在PixelDataProvider类的帮助下访问像素,以访问位图中的像素。

但是,除了XAML UI元素之外,还没有Bitmap.MakeTransparent的简单替换。所以这一切都取决于你的使用模式。