Я перетаскиваю тяжелое изображение (95729 КБ) в свой RichTextBox. А вот использование памяти такое непонятное:
Почему хранит больше 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;
}
}
}
}
}
Для проверки изображения я взял только заголовок изображения: Проверить только заголовок Что я делаю не так?





Это тяжелое изображение, вероятно, имеет огромное разрешение и использует такой формат, как PNG или JPEG. Эти форматы сжимают пиксельные данные, чтобы уменьшить конечный размер файла. Однако для рендеринга изображения модуль рендеринга должен распаковать изображение в фактические пиксели со значениями (A)RGB.
Несжатое изображение 3000x3000 с 32 битами на пиксель весит ~ 36 МБ. Так что ваше изображение должно быть еще больше.
Почему вы все равно хотите отображать такое большое изображение в текстовом поле?
100 МБ JPEG — это ОГРОМНО. Если вы хотите, чтобы ваши пользователи могли перетаскивать изображения в текстовый редактор, вам придется изменить размер изображения, сделав его более удобным.
Вам определенно не нужно столько пикселей. Просто установите BitmapImage.DecodePixelHeight или BitmapImage.DecodePixelHeight на соответствующее значение между BitmapImage.BeginInit() и BitmapImage.BeginInit(). И не устанавливайте оба, если только вас не волнует исходное соотношение сторон.
Я понимаю, что мне не нужно столько пикселей. Но я хочу реализовать функцию изменения размера изображения. После BitmapImage.DecorePixehHeight качество изображения ухудшится, не так ли? А знаете, почему он занимает так много памяти?
@Roman Как вы сказали, вы загружаете jpeg размером 100 МБ, и он будет декодирован в изображение RGBA в памяти. Итак, что еще вы можете ожидать?
Это значит, что я не понял, что происходит. Итак, получается, когда я загружаю 100 МБ jpeg, он будет декодироваться в RGBA, что в свою очередь больше, чем jpeg? Извините, но я не силен в форматировании изображений
@Roman Хорошо ... На самом деле, после EndInit() вы можете использовать Height * Width * Format.BitsPerPixel / 8, чтобы вычислить, сколько байтов занимает декодированное изображение. Или вы также можете пройти BitmapImage._finalSource.DUCECompatiblePtr._gcPressure._gcPressure, чтобы проверить, сколько памяти он хранит от GC.
Честно говоря, в большинстве случаев в этом нет необходимости. Но я не понимаю, почему он занимает так много памяти, в то время как я загружаю только ~100 мб jpeg изображения. Я хотел, чтобы RichTextBox работал как Microsoft Word. Может я идиот :) извините за мой английский