views:

24

answers:

2

Waht is the fatest (few lines of code and low resource usage) way to create an empty (0x0px or 1x1px and fully transparent) BitmapSource instance in c# that wehn used renders nothing.

+2  A: 

Use the Create method.

Example stolen from MSDN: :)

        int width = 128;
        int height = width;
        int stride = width/8;
        byte[] pixels = new byte[height*stride];

        // Try creating a new image with a custom palette.
        List<System.Windows.Media.Color> colors = new List<System.Windows.Media.Color>();
        colors.Add(System.Windows.Media.Colors.Red);
        colors.Add(System.Windows.Media.Colors.Blue);
        colors.Add(System.Windows.Media.Colors.Green);
        BitmapPalette myPalette = new BitmapPalette(colors);

        // Creates a new empty image with the pre-defined palette

        BitmapSource image = BitmapSource.Create(
            width,
            height,
            96,
            96,
            PixelFormats.Indexed1,
            myPalette, 
            pixels, 
            stride);
Arcturus
+1  A: 

Thanks to Arcutus hint I have this now (wich works fine):

var i = BitmapImage.Create(
    2,
    2,
    96,
    96,
    PixelFormats.Indexed1,
    new BitmapPalette(new List<Color> { Colors.Transparent }),
    new byte[] { 0, 0, 0, 0 },
    1);

If I make this image smaller I get an ArgumentException. I have no clue why I can't create a smaller image that 2x2px.

bitbonk
You can, by using a different format (indexed formats are more peculiar, but I don't know the exact reason either).For example: BitmapSource.Create(1, 1, 96, 96, PixelFormats.Bgra32, null, new byte[] { 0, 0, 0, 0 }, 4)(in this example, the stride is four because there are four bytes per pixel in Bgra32, and the four bytes in the array describe the one pixel).edit: Actually, I think your example should work too, if you shorten the byte array to one element for one pixel.
Alex Paven
using your parameters (1, 1, 96, 96, PixelFormats.Bgra32, null, new byte[] { 0, 0, 0, 0 }, 4) will prevent the whole WPF UI from rendering.
bitbonk