Как мне сохранить непостоянный массив изображений для моего холста, чтобы получить фон? - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть изображение, которое может и должно существовать только в ОЗУ и не может быть напрямую получено из НИЧЕГО, полученного с моего жесткого диска или из Интернета.

Это потому, что я проверяю свое собственное (скорееужасно) функции сжатия и должны уметь читать мой собственный формат изображения.Это означает, что данные изображения должны храниться вне постоянной памяти.

В большинстве учебных пособий по настройке фоновых изображений для объектов холста требуется создание объекта Image (изображение является абстрактным), и единственные найденные мной подклассы имеют URIобъекты, которые для меня подразумевают, что они ссылаются на объекты, которые существуют в постоянном пространстве, что далеко от того, что я хочу сделать.

В идеале я хотел бы иметь возможность хранить непостоянным образом,изображения, представленные массивами пикселей шириной и длиной.

public partial class MyClass : Window {
    System.Drawing.Bitmap[] frames;
    int curFrame;
    private void Refresh()
    {
        //FrameCanvas is a simple Canvas object.
        //I wanted to set its background to reflect the data stored
        //in the 
        FrameCanvas.Background = new ImageBrush(frames[curFrame]);
            //this causes an error saying that it can't turn a bitmap
            //to windows.media.imagesource
            //this code won't compile because of that
    }
}

1 Ответ

1 голос
/ 01 апреля 2019

Существует два способа создания BitmapSource из данных в памяти.

Декодирование растрового кадра, например, PNG или JPEG:

byte[] buffer = ...
BitmapSource bitmap;

using (var memoryStream = new MemoryStream(buffer))
{
    bitmap = BitmapFrame.Create(
        memoryStream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
}

Или создание растрового изображения из необработанных данных пикселей:

PixelFormat format = ...
var stride = (width * format.BitsPerPixel + 7) / 8;

bitmap = BitmapSource.Create(
    width, height,
    dpi, dpi,
    format, null,
    buffer, stride);

Подробнее см. BitmapSource.Create .

Затем назначьте растровое изображение для ImageBrush следующим образом:

FrameCanvas.Background = new ImageBrush(bitmap);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...