В чем разница между DecodePixelWidth и DecodePixelWidth. Масштабное преобразование?

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

Мои вопросы:

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

Первый:

Я предпочитаю этот метод. Он использует немного больше памяти, но, кажется, работает быстрее. Однако, ИДК, почему? Использует ли он матрицу и использует ли графический процессор для выполнения работы? В этом случае мой клиент может или не может сделать это так быстро, как я.

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;
}

Спасибо за помощь.


person AzzamAziz    schedule 26.01.2015    source источник
comment
Причина существования DecodePixelWidth в основном связана с производительностью.   -  person usr    schedule 26.01.2015
comment
Можете ли вы уточнить это? Производительность каким образом? Это быстрее Vs. Масштабное преобразование?   -  person AzzamAziz    schedule 27.01.2015
comment
Я не знаю, но это кажется единственной логичной целью дизайна. Зачем модифицировать декодер, если пользовательский интерфейс уже способен масштабироваться. Perf - единственная причина, поскольку функциональной причины нет.   -  person usr    schedule 27.01.2015


Ответы (1)


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

Масштабное преобразование:

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

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

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

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

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

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

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

Ширина декодирования в пикселях:

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

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

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

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

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

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

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

Вывод:

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

person AzzamAziz    schedule 14.02.2015