2015-01-26 111 views
3

我想从来自Stream的byte []图像制作缩略图。我有两个选项,DecodePixelWidth或ScaleTransform。DecodePixelWidth Vs.有什么区别? ScaleTransform?

我的问题:

  1. 哪一个是更快?
  2. 哪一种更合适?
  3. 他们每个人都做什么?
  4. 哪一个使用较少的内存/ 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; 
} 

谢谢你的帮助。

+0

DecodePixelWidth存在的原因主要是性能。 – usr 2015-01-26 19:27:36

+0

你能详细说明一下吗?以什么方式表现?它速度更快吗? ScaleTransform? – AzzamAziz 2015-01-26 21:14:53

+0

我不知道,但似乎是唯一合乎逻辑的设计目标。为什么修改解码器,如果用户界面已经能够缩放。 Perf是唯一的原因,因为没有功能原因。 – usr 2015-01-26 21:16:36

回答

3

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

ScaleTransform

thisScaleTransform使用transformation matrix来计算点。它也有这样的特点

可冻结功能:ScaleTransform对象可以声明为资源,多个对象之间共享,设置为只读以提高性能 ,克隆和线程安全的。

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

何时使用:

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

当不使用:

  1. 为了使图像过大。它会中断。你的应用程序将使用太多的内存,你会得到一个内存异常。看看here

DecodePixelWidth

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

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

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

何时使用:

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

当不使用:

  1. 当你的图像使用不同的编解码器比JPEG/PNG。

结论

他们只是两个不同的缩放图像,除了ScaleTransform具有其他功能,是更好的选择,一起去的方式。

相关问题