DecodePixelWidth与ScaleTransform有什么区别?(这是一个关于IT技术的提问标题)

5
我想从一个来自Stream的byte[]图像中制作缩略图。我有两个选择:DecodePixelWidth或ScaleTransform。
我的问题:
1.哪一个更快? 2.哪一个是更合适的方法? 3.它们各自是做什么的? 4.哪一个使用更少的内存/CPU?
首先:
我更喜欢这种方法。它使用的内存略多,但似乎更快。然而,我不知道为什么?它是否使用了矩阵并利用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;
}

感谢您的帮助。

DecodePixelWidth 存在的主要原因是为了提高性能。 - usr
你能详细说明一下吗?在哪方面表现更好?是比ScaleTransform更快吗? - AzzamAziz
我不知道,但那似乎是唯一合乎逻辑的设计目标。如果UI已经能够缩放,为什么要修改解码器呢?除了性能原因外,没有其他功能上的理由。 - usr
1个回答

4

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

ScaleTransform:

根据这里这里的介绍,ScaleTransform使用变换矩阵来计算点。它还具有以下特点:

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

与DecodePixelWidth不同,您还可以通过ScaleTransform旋转、翻转、创建镜像等。请看这些示例

何时使用:

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

何时不使用:

  1. 使图像过大。这将导致程序崩溃,因为它会使用太多内存并抛出内存异常。请看这里

DecodePixelWidth:

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

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

实际上,如果您尝试将其与其他类型的图像一起使用,它将导致奇怪的行为。最好在XAML中修改宽度。此外,如果您使用除JPEG/PNG编解码器以外的格式,则会扭曲您的图像。在其他格式中,它似乎会将像素放得太近并扭曲图像。

何时使用:

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

不适用于以下情况:

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

结论:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接