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

我的问题:

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

  • 第一的:

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

    感谢您的帮助。

    最佳答案

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

    ScaleTransform :

    根据thisScaleTransform使用transformation matrix计算分数。它还具有诸如



    与DecodePixelWidth不同,您还可以使用ScaleTransform旋转,翻转,创建镜像以及更多功能。看看这些examples

    何时使用:

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

  • 何时不使用:
  • 使图像太大。会破裂的。您的应用程序将使用大量内存,您将获得内存异常。看看here


  • DecodePixelWidth :

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



    实际上,如果您尝试将odd behavior与其他类型的图像一起使用,则会生成distort。最好在XAML中修改宽度。此外,如果您使用的是JPEG/PNG编解码器以外的格式,它还会将您的图像添加到您的图片中。在我看来,由于在其他格式下,它将以原始大小解码图像,因此很可能会使像素彼此靠得太近,从而使图像失真。

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

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


  • 结论:

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

    10-06 08:40