C# DecodePixelWidth和ScaleTransform之间有什么区别?

C# DecodePixelWidth和ScaleTransform之间有什么区别?,c#,.net,decode,pixel,scaletransform,C#,.net,Decode,Pixel,Scaletransform,我想从来自流的byte[]图像制作缩略图。我有两个选择,DecodePixelWidth或ScaleTransform 我的问题是: 哪一个更快 哪种方式更合适 他们每个人都做什么 哪一个使用更少的内存/CPU 第一: 我更喜欢这种方法。它使用的内存稍多,但似乎更快。然而,Idk为什么?是使用矩阵和GPU来做这项工作吗?在这种情况下,我的客户可能会也可能不会尽我所能快速完成 using (var stream = new MemoryStream(rasterizedPage.ImageData

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

我的问题是:

  • 哪一个更快
  • 哪种方式更合适
  • 他们每个人都做什么
  • 哪一个使用更少的内存/CPU
  • 第一:

    我更喜欢这种方法。它使用的内存稍多,但似乎更快。然而,Idk为什么?是使用矩阵和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;
    }
    

    谢谢你的帮助。

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

    缩放转换格式

    根据,使用计算点。它还具有以下功能:

    可自由化功能:ScaleTransform对象可以声明为资源,在多个对象之间共享,并设置为只读以改进 性能,克隆,并使线程安全

    您还可以使用ScaleTransform和PixelWidth进行旋转、翻转、创建镜像等操作。看看这些

    何时使用:

  • 旋转图像
  • 调整图像大小
  • 翻转图像
  • 创建镜像
  • 使用线程的应用程序
  • 使用图像作为资源
  • 不使用时:

  • 使图像太大。它会坏的。您的应用程序将使用如此多的内存,您将得到一个内存异常。看一看

  • 解码像素宽度

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

    JPEG和便携式网络图形(PNG)编解码器本机解码 将图像放大到指定的大小;其他编解码器在其初始位置对图像进行解码 原始大小并将图像缩放到所需大小

    事实上,如果您尝试将其与其他类型的图像一起使用,则会导致错误。最好在XAML中修改宽度。此外,如果您使用JPEG/PNG编解码器以外的格式,它将保护您的图像。在我看来,由于在其他格式中,它将以原始大小解码图像,因此很可能将像素放得太近,从而扭曲图像

    何时使用:

  • JPEG/PNG编解码器中的图像
  • 将大图像调整为小图像以节省内存
  • 不使用时:

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

  • 结论


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

    DecodePixelWidth存在的原因主要是性能。你能详细说明一下吗?表现如何?它比ScaleTransform更快吗?我不知道,但这似乎是唯一合乎逻辑的设计目标。如果UI已经能够进行缩放,为什么要修改解码器。性能是唯一的原因,因为没有功能原因。