簡體   English   中英

DecodePixelWidth Vs.有什么區別 ScaleTransform?

[英]What is the difference between DecodePixelWidth Vs. ScaleTransform?

我想從一個來自Stream的byte []圖像制作縮略圖。 我有兩個選項,DecodePixelWidth或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;
}

謝謝您的幫助。

經過一些研究,我得出了這個結論。

ScaleTransform

根據ScaleTransform使用變換矩陣來計算點。 它還具有諸如此類的功能

Freezable功能 :ScaleTransform對象可以聲明為資源,在多個對象之間共享,只讀以提高性能,克隆並使線程安全。

與DecodePixelWidth不同,您還可以使用ScaleTransform旋轉,翻轉,創建鏡像等。 看看這些例子

何時使用:

  1. 要旋轉圖像。
  2. 調整圖像大小。
  3. 翻轉圖像。
  4. 創建鏡像。
  5. 使用線程的應用程序。
  6. 使用圖像作為資源。

何時不使用:

  1. 使圖像太大。 它會破裂。 您的應用程序將使用如此多的內存,您將獲得內存異常。 看看這里

DecodePixelWidth

DecodePixelWidth是調整圖像大小的另一個選項。 唯一的問題是它似乎只處理JPEG / PNG編解碼器。

JPEG和便攜式網絡圖形(PNG)編解碼器本地將圖像解碼為指定的大小; 其他編解碼器以原始大小解碼圖像並將圖像縮放到所需大小。

實際上,如果您嘗試將其與其他類型的圖像一起使用,則會導致奇怪的行為 你最好在XAML中修改寬度。 此外,如果您使用JPEG / PNG編解碼器以外的格式,它將扭曲您的圖像。 對我來說,似乎在其他格式中,它會以原始大小對圖像進行解碼,因此很可能會使像素太靠近並使圖像失真。

何時使用:

  1. JPEG / PNG編解碼器內的圖像。
  2. 將大圖像調整為小圖像以節省內存。

何時不使用:

  1. 當您的圖像使用與JPEG / PNG不同的編解碼器時。

結論

它們只是調整圖像大小的兩種不同方式,除了ScaleTransform具有其他功能,並且是更好的選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM