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
2010-08-26 09:46:12
+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
2010-08-26 11:23:18
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
2010-08-26 15:55:31
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
2010-08-27 09:55:14