我在我的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我在做什么错了?
答案 0 :(得分:4)
此沉重图像可能具有巨大的分辨率,并使用PNG或JPEG之类的格式。这些格式压缩像素数据以减小最终文件的大小。但是,为了渲染图像,渲染器需要将图像解压缩为具有(A)RGB值的实际像素。
每像素32位的未压缩3000x3000图像重约36 MB。因此,您的图像必须更大。
为什么您仍要在文本框中渲染如此大的图像?
答案 1 :(得分:1)
您绝对不需要那么多像素。只需将BitmapImage.DecodePixelHeight
或BitmapImage.DecodePixelHeight
设置为BitmapImage.BeginInit()
和BitmapImage.BeginInit()
之间的适当值即可。除非您不在乎原始的宽高比,否则请不要同时设置两者。