5

我想从来自 Stream 的 byte[] 图像制作缩略图。我有两个选择,DecodePixelWidth 或 ScaleTransform。

我的问题:

  1. 哪个更快?
  2. 哪种方式更合适?
  3. 他们每个人都做什么?
  4. 哪一个使用更少的内存/CPU?

第一的:

我更喜欢这种方法。它使用稍多的内存,但似乎更快。但是,我知道为什么?是否使用 Matrix 并使用 GPU 来完成工作?在这种情况下,我的客户可能会也可能不会尽可能快地做到这一点。

using (var stream = new MemoryStream(rasterizedPage.ImageData, false))
{
    var bitmap = DocHelper.ConvertToBitmapImage(stream);
    var transform = new ScaleTransform(0.1, 0.1);
    var thumbnail = new WriteableBitmap(new TransformedBitmap(bitmap, transform));

    byte[] byteImage = DocHelper.ConvertToBytes(thumbnail);

    return byteImage;
}

第二:

这种方法使用较少的内存,但看起来速度较慢,图像模糊,但它们是缩略图,所以没关系。不过,ScaleTransform 更好吗?

using (var stream = new MemoryStream(rasterizedPage.ImageData, false))
{
    byte[] byteImage;
    var bitmap = new BitmapImage();
    bitmap.BeginInit();
    bitmap.DecodePixelWidth = 120;
    bitmap.StreamSource = stream;
    bitmap.EndInit();
    bitmap.Freeze();
    byteImage = DocHelper.ConvertToBytes(bitmap);

    return byteImage;
}

感谢您的帮助。

4

1 回答 1

4

经过一番研究,我得出了这个结论。

比例变换

据此 ScaleTransform使用变换矩阵来计算点。它还具有以下功能

Freezable 特性:ScaleTransform 对象可以声明为资源,在多个对象之间共享,设置为只读以提高性能,克隆,并使线程安全。

与 DecodePixelWidth 不同,您还可以使用 ScaleTransform 旋转、翻转、创建镜像等。看看这些例子

何时使用:

  1. 旋转图像。
  2. 调整图像大小。
  3. 翻转图像。
  4. 创建镜像。
  5. 使用线程的应用程序。
  6. 使用图像作为资源。

何时不使用:

  1. 使图像过大。它会破裂。您的应用程序将使用如此多的内存,您将获得内存异常。看看这里

解码像素宽度

DecodePixelWidth是调整图像大小的另一个选项。唯一的问题是它似乎只处理 JPEG/PNG 编解码器。

JPEG 和便携式网络图形 (PNG) 编解码器本机将图像解码为指定大小;其他编解码器以原始大小解码图像并将图像缩放到所需大小。

事实上,如果您尝试将它与其他类型的图像一起使用,它会导致奇怪的行为。您最好修改 XAML 中的宽度。此外,如果您使用 JPEG/PNG 编解码器以外的格式,它会扭曲您的图像。在我看来,由于在其他格式中它会以原始尺寸解码图像,因此很可能会将像素靠得太近并扭曲图像。

何时使用:

  1. JPEG/PNG 编解码器中的图像。
  2. 将大图像调整为小图像以节省内存。

何时不使用:

  1. 当您的图像使用与 JPEG/PNG 不同的编解码器时。

结论

它们只是调整图像大小的两种不同方式,除了 ScaleTransform 具有其他功能并且是更好的选择。

于 2015-02-14T17:03:41.067 回答