2015-01-26 3 views
3

Я хотел бы сделать миниатюры из изображения byte [], которое появилось из Stream. У меня есть два варианта: DecodePixelWidth или ScaleTransform.В чем разница между DecodePixelWidth Vs. ScaleTransform?

Мои вопросы:

  1. Какой быстрее?
  2. Каков наиболее подходящий способ?
  3. Что делает каждый из них?
  4. Какой из них использует меньше памяти/процессора?

Первое:

Я предпочитаю этот метод. Он использует немного больше памяти, но, кажется, быстрее. Однако, Икк, почему? Использует ли Матрица и использует 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

+0

Можете ли вы подробно остановиться на этом? Каким образом? Это быстрее Vs. ScaleTransform? – AzzamAziz

+0

Я не знаю, но это единственная цель логического дизайна. Зачем изменять декодер, если пользовательский интерфейс уже способен масштабировать. Перф - единственная причина, поскольку нет функциональной причины. – usr

ответ

3

После некоторых исследований я пришел к такому выводу.

ScaleTransform:

Согласно this, ScaleTransform использует transformation matrix для расчета баллов. Он также имеет функции, такие как

Freezable Особенность: объекты ScaleTransform может быть объявлены как ресурсы, общие для нескольких объектов, сделал только для чтения, чтобы улучшить производительность , клонировал, и сделал потокобезопасным.

Вы также можете повернуть, свернуть, создать зеркальные изображения и многое другое с помощью ScaleTransform в отличие от DecodePixelWidth. Посмотрите на них examples.

Когда использовать:

  1. Чтобы повернуть изображение.
  2. Чтобы изменить размер изображения.
  3. Чтобы перевернуть изображение.
  4. Создание зеркальных изображений.
  5. Приложения, которые используют резьбу.
  6. Использование изображений в качестве ресурсов.

Если не использовать:

  1. Чтобы сделать изображение слишком велико. Он сломается.Ваше приложение будет использовать столько памяти, что вы получите исключение памяти. Взгляните here.

DecodePixelWidth:

DecodePixelWidth другой вариант, чтобы изменить размер изображения. Единственная проблема заключается в том, что, похоже, речь идет только о кодеках JPEG/PNG.

Кодеки JPEG и Portable Network Graphics (PNG) изначально декодируют изображение до указанного размера; другие кодеки декодируют изображение по своему размеру и масштабируют изображение до нужного размера.

Фактически, это приведет к odd behavior, если вы попытаетесь использовать его для других изображений. Вам лучше изменить ширину в XAML. Кроме того, ваши изображения будут distort, если вы используете форматы, отличные от кодеков JPEG/PNG. Мне кажется, что, поскольку в других форматах он будет декодировать изображение в оригинальном размере, он, скорее всего, поставит пиксели слишком близко друг к другу и исказит изображение.

Когда использовать:

  1. изображения, которые находятся в JPEG/PNG кодеками.
  2. Чтобы изменить размер больших изображений на мелкие изображения, чтобы сэкономить память.

Если не использовать:

  1. Когда изображение использует различные кодеки, чем JPEG/PNG.

Заключение:

Они просто два разных способа изменения размера изображения, за исключением того, что ScaleTransform имеет другие функции, и это лучший вариант, чтобы пойти с.