【问题标题】:How to load image in RichTextBox more effective?如何更有效地在 RichTextBox 中加载图像?
【发布时间】:2019-04-10 04:35:44
【问题描述】:

我在我的 RichTextBox 中拖放了一个沉重的图像 (95729 kb)。但是内存使用是那么令人费解: 为什么它存储了超过 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我做错了什么?

【问题讨论】:

    标签: c# wpf image xaml


    【解决方案1】:

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

    每像素 32 位的未压缩 3000x3000 图像的重量约为 36 MB。所以你的图像必须更大。

    你为什么要在文本框中渲染这么大的图像?

    【讨论】:

    • 老实说,在大多数情况下没有必要。但我不明白为什么它在我只加载约 100 mb jpeg 图像时占用这么多内存。我想让 RichTextBox 像 Microsoft Word 一样工作。也许我是白痴:) 对不起我的英语
    • 100 MB JPEG 是巨大的。如果您希望您的用户能够将图像拖到您的文本编辑器中,则必须将图像大小调整为更易于处理的尺寸。
    【解决方案2】:

    您绝对不需要那么多像素。只需将BitmapImage.DecodePixelHeightBitmapImage.DecodePixelHeight 设置为BitmapImage.BeginInit()BitmapImage.BeginInit() 之间的适当值。除非您不关心原始纵横比,否则不要同时设置两者。

    【讨论】:

    • 我知道我不需要那么多像素。但我想实现图像调整大小功能。 BitmapImage.DecorePixehHeight 之后画质会下降,不是吗?你知道它为什么占用这么多内存吗?
    • @Roman 正如你所说,你加载了一个 100MB 的 jpeg,它将被解码为内存中的 RGBA 图像。那么,您还能期待什么?
    • 这意味着我不明白发生了什么。所以,当我加载 100 MB jpeg 时,它会被解码为 RGBA,而 RGBA 又比 jpeg 大?抱歉,我不擅长图像格式
    • @Roman Ok... 实际上,在EndInit() 之后,您可以使用Height * Width * Format.BitsPerPixel / 8 来计算解码图像需要多少字节。或者你也可以通过BitmapImage._finalSource.DUCECompatiblePtr._gcPressure._gcPressure查看它从GC保留了多少内存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 2019-04-01
    相关资源
    最近更新 更多