crear un vacío BitmapSource en C #
-
01-10-2019 - |
Pregunta
¿Cuál es el más rápido (pocas líneas de código y bajo consumo de recursos) manera de crear un vacío (0x0 píxeles o 1x1 píxeles y totalmente transparente) BitmapSource ejemplo, en C # que se utiliza cuando no se dictarán.
Solución
Utilice el Crear método.
Ejemplo robado de 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);
Otros consejos
Gracias a Arcutus pista tengo esto ahora ( wich bien funciona):
var i = BitmapImage.Create(
2,
2,
96,
96,
PixelFormats.Indexed1,
new BitmapPalette(new List<Color> { Colors.Transparent }),
new byte[] { 0, 0, 0, 0 },
1);
Si hago esta imagen más pequeña consigo un ArgumentException. No tengo ni idea de por qué no puedo crear una imagen más pequeña que 2x2px.
La manera de crear una imagen tal sin la asignación de un gran conjunto de bytes conseguido es utilizar TransformedBitmap
.
var bmptmp = BitmapSource.Create(1,1,96,96,PixelFormats.Bgr24,null,new byte[3]{0,0,0},3);
var imgcreated = new TransformedBitmap(bmptmp, new ScaleTransform(width, height));
El BitmapSource más mínimo puede ser generada de esta manera:
public static BitmapSource CreateEmptyBitmap()
{
return BitmapSource.Create(1, 1, 1, 1, PixelFormats.BlackWhite, null, new byte[] {0}, 1);
}
Basta con echar un vistazo a esto. Funciona para cualquier PixelFormat
public static BitmapSource CreateEmtpyBitmapSource(int width, int height, PixelFormat pixelFormat)
{
PixelFormat pf = pixelFormat;
int rawStride = (width * pf.BitsPerPixel + 7) / 8;
var rawImage = new byte[rawStride * height];
var bitmap = BitmapSource.Create(width, height, 96, 96, pf, null, rawImage, rawStride);
return bitmap;
}
Otra forma es crear una instancia de una clase BitmapImage que se deriva de BitmapSource:
BitmapSource emptySource = new BitmapImage();