Как загрузить изображение в RichTextBox более эффективно? - PullRequest
4 голосов
/ 10 апреля 2019

Я перетаскиваю тяжелое изображение (95729 КБ) в моем RichTextBox. Но использование памяти настолько непостижимо: memory usage Почему хранится более 700 МБ?

Мой код перетаскивания:

private void RtbEditor_PreviewDrop(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.FileDrop))
    {
        string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
        if (files != null && files.Length > 0)
        {
            foreach (var file in files)
            {
                // Filter out non-image files.
                if (IsValidImageFile(file))
                {
                    BitmapImage bitmap = new BitmapImage();
                    bitmap.BeginInit();            
                    bitmap.UriSource = new Uri(file, UriKind.Absolute);            
                    bitmap.EndInit();
                    Image image = new Image();            
                    image.Source = bitmap;            
                    var container = new InlineUIContainer(image, rtbEditor.CaretPosition);
                    rtbEditor.CaretPosition = container.ElementEnd;
                }
            }
        }
    }
}

Для проверки изображения я взял только заголовок изображения: Проверьте только заголовок Что я делаю не так?

Ответы [ 2 ]

4 голосов
/ 10 апреля 2019

Это тяжелое изображение, вероятно, имеет огромное разрешение и использует такой формат, как PNG или JPEG.Эти форматы сжимают данные пикселей, чтобы уменьшить конечный размер файла.Однако для визуализации изображения средство визуализации должно распаковать изображение в фактические пиксели со значениями (A) RGB.

Несжатое изображение 3000x3000 с 32 битами на пиксель весит ~ 36 МБ.Таким образом, ваше изображение должно быть еще больше.

Почему вы все равно хотите отобразить такое большое изображение в текстовом поле?

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

Вам определенно не нужно столько пикселей. Просто установите BitmapImage.DecodePixelHeight или BitmapImage.DecodePixelHeight на соответствующее значение от BitmapImage.BeginInit() до BitmapImage.BeginInit(). И не устанавливайте оба, если вы не заботитесь об исходном соотношении сторон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...