Приложение WPF .NET Core — загрузка растрового изображения в изображение пользовательского интерфейса без его предварительного сохранения — С#

Я пытаюсь переключиться на новый стиль приложения WPF, и пока я очень не впечатлен.

Есть ли способ загрузить растровое изображение, созданное приложением, в PictureBox без его предварительного сохранения? На данный момент я нашел следующее решение (которое хочу улучшить):
Пользовательский интерфейс: введите здесь описание изображения

XAML-код:

<Image x:Name="CurrentFrame_image" HorizontalAlignment="Left" Height="110" Margin="10,10,0,0" VerticalAlignment="Top" Width="190" Grid.ColumnSpan="2"/>

Код обновления пользовательского интерфейса:

public void UpdateProgressFrame(Bitmap currentScreen)
{
    currentScreen.Save(@".\progressframe.png");
    BitmapImage image = new BitmapImage(new Uri("/progressframe.png", UriKind.Relative));
    CurrentFrame_image.Source = image;
}

Однако мне очень не нравится сохранять изображение каждые несколько мс на диск, чтобы я мог отображать его в своем приложении. Есть ли прямой, быстрый способ?

старый, Winform Style

public void UpdateProgressFrame(Bitmap currentScreen)
{
    CurrentFrame_pictureBox.Image = currentScreen;
}

Вы можете себе представить, что операции ввода-вывода на диске для преобразования видео не оптимальны для производительности жесткого диска, особенно на старых вращающихся жестких дисках.


person julian bechtold    schedule 28.09.2020    source источник


Ответы (2)


если вы не хотите загружать, это означает, что вы хотите создать растровое изображение во время выполнения. если это, вы можете использовать этот код:

PictureBox pictureBox1 = new PictureBox();
public void CreateBitmapAtRuntime()
{
    pictureBox1.Size = new Size(210, 110);
    this.Controls.Add(pictureBox1);

    Bitmap flag = new Bitmap(200, 100);
    Graphics flagGraphics = Graphics.FromImage(flag);
    int red = 0;
    int white = 11;
    while (white <= 100) {
        flagGraphics.FillRectangle(Brushes.Red, 0, red, 200,10);
        flagGraphics.FillRectangle(Brushes.White, 0, white, 200, 10);
        red += 20;
        white += 20;
    }
    pictureBox1.Image = flag;
}

вы можете заполнить растровое изображение чем угодно, например, вы можете создать растровое изображение по значению битов, которое вы сохранили в базе данных

person mohammad khanjani    schedule 28.09.2020
comment
pictureBox1.Image Не существует в приложении WPF — кажется, единственный вариант pictureBox.Source - person julian bechtold; 28.09.2020
comment
Похоже на недоразумение. Я не хочу создавать растровое изображение во время выполнения. У меня уже есть битмап. Я хочу загрузить растровое изображение в PictureBox без его предварительного сохранения. Вы имеете в виду winforms, откуда я родом. Моя проблема относится к приложению формы wpf - person julian bechtold; 28.09.2020

Решение: сохранить растровое изображение в поток памяти и загрузить поток

BitmapImage BitmapToImageSource(ref Bitmap input)
{
    BitmapImage bitmapimage = new BitmapImage();
    using (MemoryStream memory = new MemoryStream())
    {
        input.Save(memory, System.Drawing.Imaging.ImageFormat.Bmp);
        memory.Position = 0;

        bitmapimage.BeginInit();
        bitmapimage.StreamSource = memory;
        bitmapimage.CacheOption = BitmapCacheOption.OnLoad;
        bitmapimage.EndInit();
    }

    return bitmapimage;
}
person julian bechtold    schedule 28.09.2020
comment
Различные объекты изображения в C#/WPF немного раздражают, в итоге у меня есть некоторые служебные функции для преобразования между ними. Вы хотите Bitmap в BitmapSource или BitmapImage. Вот хороший ответ. Вот еще кое-что документация - person Peter Boone; 28.09.2020