【问题标题】:Why is bmp loading faster than png为什么bmp加载速度比png快
【发布时间】:2015-12-05 15:32:49
【问题描述】:

我在这里有一个示例 wpf 应用程序,我想知道为什么 BMP 的加载速度比 PNG 快。这是确切的设置:

- Windows 7
- Visual Studio 2013
- landscape.png, 1920x1080, 2.4mb
- landscape.bmp, 1920x1080, 5.6mb
- wpf-app, class MainWindow.xaml.cs constructor, no other code before

代码:

var sw = Stopwatch.StartNew();
var Bitmap1 = new Bitmap("landscape.bmp");
long t1 = sw.ElapsedMilliseconds;

sw.Restart();
var Bitmap2 = new Bitmap("landscape.png");
long t2 = sw.ElapsedMilliseconds;

所以 BMP 加载大约需要 6 毫秒,PNG 需要 40 毫秒。

为什么会这样?

【问题讨论】:

  • 你在调试器中运行过这个吗?你烧伤了吗?这些都会影响时间。此外,Bitmap 类可能必须解码 png,而它可以获取 bmp 的本来面目。
  • 要执行严格的测试,您应该设置一个测试环境。代码必须烧录,测试必须重复多次,并且您必须考虑缓存(在这种情况下磁盘缓存将发挥巨大作用)。毕竟已经正确完成......你可能会看到一个非常小的差异......png要复杂得多,它必须被解压缩。这可能需要几毫秒(对于足够大的图像来衡量这种差异)。
  • 检查简单地将文件读入内存的速度 - 如果仍然显示类似的时间差,则可能与文件存储有关。如果加载速度是原来的两倍,那么问题可能出在解码上。
  • 检查 Bitmap 类的作用。 PNG的优点:要读取的数据要少得多。缺点:解码部分可能写得不好。我们不知道。
  • 另请注意,您的测试可能与您的 WPF 应用程序完全无关,因为在 WPF 中您将通过 Uri 或 FileStream 创建 BitmapImage 或 BitmapFrame,而不是使用 WinForms Bitmap 类。

标签: c# wpf performance bitmap png


【解决方案1】:

首先,我们需要了解数字图像是如何存储和显示的,数字图像表示为一个矩阵,其中矩阵的每个元素都是像素的颜色,如果你有灰度图像,那么每个元素都是一个 uint8 (无符号 8 位整数)介于 0 和 255 之间的数字,在某些情况下,它是介于 -128 和 127 之间的 int8(有符号 8 位整数)数字。如果元素为 0(或 int8 版本中的 -128),则颜色为纯黑色,如果元素为 255(或 int8 版本中的 127),则颜色为纯白色。

对于 RGB 图像,所述矩阵的每个元素需要 24 位或 3 字节来存储(每种颜色一个字节),数码相机和智能手机的一个非常常见的分辨率是 3264 x 2448 的 8 兆像素相机,现在想象一下我们想保存一个 3264 行矩阵,其中每行有 2448 个元素,每个元素是 3 字节,我们需要大约 24 兆字节来存储该图像,这对于在互联网上发布或传输或大多数其他目的不是很有效。这就是我们应该压缩图像的原因,我们可以选择 JPEG,这是一种有损压缩方法,这意味着我们确实会损失一些质量,或者我们可以选择像 PNG 这样的无损压缩方法,它会给我们带来更少的压缩比,但我们不是会失去质量。

无论我们选择不压缩图片,当我们想看图片的时候,只能显示未压缩版本的图片,如果图片完全不压缩,没有问题,我们显示什么是的,但如果是压缩的,我们必须先解码(解压缩)。

说了这么多,让我们来回答这个问题。 BMP 是一种用于有些原始图像的格式,根本没有压缩,或者使用的压缩技术比 PNG 或 JPEG 少得多,但文件大小更大。当你想显示一个 BMP 图像时,因为它更大,有更多的数据要读入内存,但是当它被读取时,你可以更快地显示它,因为要么不需要解码,要么需要的解码少得多,on另一方面,当您想要显示 PNG 图像时,图像会更快地读入内存,但与 BMP 相比,解码需要更多时间。

如果您的存储速度非常慢,则 BMP 图像的显示速度会很慢。 如果你的 CPU 很慢或者你的解码软件效率不高,PNG 图像会显示很慢。

【讨论】:

  • 感谢您的回复。只是想说我读过,所以你不只是为自己写的。一切都说得通,我只是在 6 年前感到惊讶。幸运的是,我 90% 的时间都在使用后端 :)
  • @FrankToast 你应该accept the answer 那么这个问题被标记为已回答。
猜你喜欢
  • 1970-01-01
  • 2015-10-27
  • 2011-08-27
  • 2012-03-29
  • 1970-01-01
  • 2014-04-13
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多