2013-10-07 126 views
2

我有一个图像对象。图像源是一个带有透明度的白色图形(精确地为圆角矩形)。我想要的是能够在不同的地方重复使用相同的图像,但色调不同的图像颜色。到目前为止,我发现的最好的建议是在顶部绘制一个半透明的矩形,但这会显示在透明度所在的角落。任何人都可以提出更好的选择吗Windows 8 XAML:着色图像对象

+0

通过圆角矩形,是它的形状可以使用Border/CornerRadius或Rectangle/RadiusX/Y进行复制,以便使用您已收到的“over-the-top”建议?如果是这样的话,我们可以将它拖拽到一个ContentControl中,并允许您很容易地指定色调。如果它是一种更自定义的形状,你可能会多花点心思。 –

+0

我认为它需要更复杂的东西。我为图像添加了浮雕效果,其中一些形状比简单的圆角矩形更复杂。 –

回答

1

随着BitmapDecoder你可以得到所有的像素数据的字节数组,那么您可以手动抵消了部分ARGB值改变它,它在一个新的WriteableBitmap节省:

var picker = new FileOpenPicker(); 
picker.FileTypeFilter.Add(".jpg"); 
StorageFile file = await picker.PickSingleFileAsync(); 
if (file != null) 
{ 
    using (IRandomAccessStream ras = await file.Openasync(FileAccessMode.Read)) 
    { 
     BitmapDecoder decoder = await BitmapDecoder.CreateAsync(ras); 
     PixelDataProvider provider = await decoder.GetPixelDataAsync(decoder.BitmapPixelFormat, decoder.BitmapAlphaMode, new BitmapTransform(), ExifOrientationMode.RespectExifOrientation, ColorManagementMode.ColorManageToSRgb); 
     byte[] pixels = provider.DetachPixelData(); 
     for (int i = 0; i < pixels.Length; i += 4) 
     { 
      pixels[i] = (byte)(pixels[i] + 72); 
     } 
     WriteableBitmap bitmap = new WriteableBitmap((int)decoder.OrientedPixelWidth, (int)decoder.OrientedPixelHeight); 
     using (Stream stream = bitmap.PixelBuffer.AsStream()) 
     { 
      await stream.WriteAsync(pixels, 0, pixels.Length); 
     } 
     image.Source = bitmap; 
    } 
}