【问题标题】:What is the difference between DecodePixelWidth Vs. ScaleTransform?DecodePixelWidth Vs 之间有什么区别?比例变换?
【发布时间】:2015-01-26 19:11:07
【问题描述】:

我想从来自 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;
}

感谢您的帮助。

【问题讨论】:

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

标签: c# .net decode pixel scaletransform


【解决方案1】:

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

比例变换

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

Freezable Features:ScaleTransform 对象可以声明为资源,在多个对象之间共享,设置为只读以改进 性能、克隆和线程安全。

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

何时使用:

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

何时不使用:

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

解码像素宽度

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

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

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

何时使用:

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

何时不使用:

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

结论

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多