创建BitmapImage并将特定颜色应用于它

3
我遇到了一个问题,如何基于一些颜色值创建 BitmapImage?例如,我有字符串“黑色”,所以我需要黑色的 BitmapImage。请问应该怎么做呢?
谢谢!
-- 更新 (我为 @StephenChung 提供了以下代码)
想法是创建一个带有任意不透明度的网格,并且不对其子元素应用不透明度。因此,我可以通过任何我需要的颜色创建图像,并为其应用不透明度。
BitmapSource bs = CreateBitmapSource(GetBackgroundColorValue());
// and here I use method of @StaWho CreateBitmapSource()
ImageBrush ib2 = new ImageBrush(bs);
ib2.Opacity = Opacity;
ib2.Stretch = Stretch.Fill;
RootGrid.Background = ib2;

2
创建一个空的BitmapImage并用黑色填充它? - Stephen Chung
1
它必须是BitmapImage还是可以是BitmapSource - StaWho
@StaWho实际上我需要BitmapImage,因为我必须创建ImageBrush ib = new ImageBrush(bitmapImage); - NoWar
1
你可以从 BitmapSource 创建 ImageBrush。请参考 MSDN。 - StaWho
嗯......一个填充单色的ImageBrush能做到SolidColorBrush做不到的事情是什么呢? - Stephen Chung
显示剩余4条评论
2个回答

4
您可以使用BitmapSource创建ImageBrush
    private BitmapSource CreateBitmapSource(System.Windows.Media.Color color)
    {
        int width = 128;
        int height = width;
        int stride = width / 8;
        byte[] pixels = new byte[height * stride];

        List<System.Windows.Media.Color> colors = new List<System.Windows.Media.Color>();
        colors.Add(color);
        BitmapPalette myPalette = new BitmapPalette(colors);

        BitmapSource image = BitmapSource.Create(
            width,
            height,
            96,
            96,
            PixelFormats.Indexed1,
            myPalette,
            pixels,
            stride);

        return image;
    }

我在处理较大的宽度/高度时遇到了一个错误。通过将步幅设置为int stride = width;,我解决了这个问题。如果调色板被设置,可能每个像素只有一个字节。 - geraphl

0

例子:

System.Drawing.Bitmap flag = new System.Drawing.Bitmap(10, 10);
for( int x = 0; x <  flag.Height; ++x )
    for( int y = 0; y < flag.Width; ++y )
        flag.SetPixel(x, y, Color.Black);
for( int x = 0; x < flag.Height; ++x )
    flag.SetPixel(x, x, Color.Black);

以及转换:

private BitmapImage Bitmap2BitmapImage(Bitmap bitmap) 
{ 
    using (MemoryStream ms = new MemoryStream()) 
    { 
        bitmap.Save(ms, ImageFormat.Png); 
        ms.Position = 0; 
        BitmapImage bi = new BitmapImage(); 
        bi.BeginInit(); 
        bi.StreamSource = ms; 
        bi.EndInit(); 

        return bi; 
    } 
} 

我认为OP想要首先根据字符串找到颜色。而SetPixel非常慢,如果可能的话应该避免使用它。 - Ani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接