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.

¿Fue útil?

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();

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top