создать пустой BitmapSource в C # - PullRequest
8 голосов
/ 26 августа 2010

Какой самый быстрый (несколько строк кода и низкое использование ресурсов) способ создания пустого (0x0 px или 1x1 px и полностью прозрачного) BitmapSource экземпляра в c #, который используется, когда ничего не следует отображать .

Ответы [ 6 ]

14 голосов
/ 26 августа 2010

Благодаря Arcutus hint У меня есть это сейчас (что работает отлично):

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

Если я уменьшу это изображение, я получу ArgumentException.Я понятия не имею, почему я не могу создать уменьшенное изображение размером 2x2px.

12 голосов
/ 26 августа 2010

Используйте метод Создать .

Пример, украденный из 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);
3 голосов
/ 02 февраля 2016

Способ создания такого образа без выделения большого массива управляемых байтов состоит в использовании 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));
1 голос
/ 13 мая 2018

Самый минимальный BitmapSource может быть сгенерирован следующим образом:

    public static BitmapSource CreateEmptyBitmap()
    {
        return BitmapSource.Create(1, 1, 1, 1, PixelFormats.BlackWhite, null, new byte[] {0}, 1);
    }
0 голосов
/ 05 марта 2019

Другой способ - создать экземпляр класса BitmapImage, производный от BitmapSource:

BitmapSource emptySource = new BitmapImage();

0 голосов
/ 17 апреля 2015

Просто взгляните на это. Работает для любого 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;
    }
...