Qual è il modo più veloce (poche righe di codice e basso utilizzo delle risorse) per creare un'istanza vuota (0x0 px o 1x1 px e completamente trasparente) BitmapSource in C# che viene utilizzata quando non esegue il rendering.crea un BitmapSource vuoto in C#
8
A
risposta
10
Utilizzare il metodo Create.
Esempio rubata da 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);
13
Grazie a Arcutus hint ho questo ora (goduto funziona bene):
var i = BitmapImage.Create(
2,
2,
96,
96,
PixelFormats.Indexed1,
new BitmapPalette(new List<Color> { Colors.Transparent }),
new byte[] { 0, 0, 0, 0 },
1);
Se faccio questa immagine più piccola ottengo un ArgumentException. Non ho idea del perché non riesco a creare un'immagine più piccola di 2x2px.
0
Basta dare un'occhiata a questo. Funziona per qualsiasi 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;
}
3
Il modo per creare una tale immagine senza allocare una grande matrice di byte gestito è utilizzare 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));
È possibile, utilizzando un formato diverso (i formati indicizzati sono più specifici, ma non conosco la ragione esatta). Ad esempio: BitmapSource.Create (1, 1, 96, 96, PixelFormats.Bgra32, null, new byte [] {0, 0, 0, 0}, 4) (in questo esempio, il passo è quattro perché ci sono quattro byte per pixel in Bgra32 ei quattro byte nella matrice descrivono l'un pixel). modifica: In realtà, penso che anche il tuo esempio dovrebbe funzionare, se abbassi l'array di byte a un elemento per un pixel. –
utilizzando i parametri (1, 1, 96, 96, PixelFormats.Bgra32, null, new byte [] {0, 0, 0, 0}, 4) impedirà il rendering dell'intera UI WPF. – bitbonk