2015-01-26 105 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具有其他功能,是更好的選擇,一起去的方式。

相關問題