如何在RichTextBox中加载图像更有效?

时间:2019-04-10 04:35:44

标签: c# wpf image xaml

我在我的RichTextBox中拖放了一个沉重的图像(95729 kb)。但是内存使用是如此令人费解:memory usage为什么存储超过700 mb?

我的拖放代码:

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;
                }
            }
        }
    }
}

对于图像检查,我只使用了图像标题:Check only header我在做什么错了?

2 个答案:

答案 0 :(得分:4)

此沉重图像可能具有巨大的分辨率,并使用PNG或JPEG之类的格式。这些格式压缩像素数据以减小最终文件的大小。但是,为了渲染图像,渲染器需要将图像解压缩为具有(A)RGB值的实际像素。

每像素32位的未压缩3000x3000图像重约36 MB。因此,您的图像必须更大。

为什么您仍要在文本框中渲染如此大的图像?

答案 1 :(得分:1)

您绝对不需要那么多像素。只需将BitmapImage.DecodePixelHeightBitmapImage.DecodePixelHeight设置为BitmapImage.BeginInit()BitmapImage.BeginInit()之间的适当值即可。除非您不在乎原始的宽高比,否则请不要同时设置两者。