Difference between revisions of "Picture.Resize"

From SunFlurry wiki
Jump to: navigation, search
(Created page with "{{infobox function |name=Resize |object=Картинка |caption=Изменение размера картинки |type=1 |status=2 |db=0 |exception=Невозможн...")
 
m (1 revision imported)
 
(No difference)

Latest revision as of 08:52, 7 February 2021

  Resize (Изменение размера картинки)
Объект:Картинка
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Исключения:Невозможно превратить в число, неверные параметры
Визуальность:Нет

Функция изменяет размеры картинки до указанных. При изменении размеров будет применен требуемый алгоритм масштабирования (resampling). Скорость работы функции зависит не только от алгоритма масштабирования, но и количества точек в картинке-результате.

Синтаксис

Picture.Resize(<Ширина получаемой картинки (INT)>,<Высота получаемой картинки (INT)>,<Алгоритм масштабирования (INT)>=0)

Аргументы

  • <Ширина получаемой картинки (INT)> - Ширина картинки-результата в пикселях.
  • <Высота получаемой картинки (INT)> - Высота картинки-результата в пикселях.
  • <Алгоритм масштабирования (INT)> - (необязательный аргумент) Алгоритм масштабирования при повороте. Возможные следующие значения:
    • 0 (по умолчанию) - Без сглаживания. Самый быстрый режим, однако для текста и точных объектов создает неприглядный результат.
    • 1 - Метод ближайшего соседа (Nearest neighbor). Медленнее первого режима, однако создает почти такой же неприглядный результат.
    • 2 - Метод билинейной фильтрации (Bilinear). Режим создает гладкую картинку, однако работает медленнее, чем первые два режима.
    • 3 - Метод бикубической фильтрации (Bicubic). Режим создает гладкую картинку, при этом границы объектов (или текста) более выражены по сравнению с билинейной фильтрацией (меньше ощущаемое размытие). Режим работает значительно медленнее билинейной фильтрации и может создавать цветовые артефакты (неверные цвета, которые отсутствовали в оригинальном изображении) на границах резкого изменения цветов

Примеры

//Пример сравнивает скорость различных алгоритмов масштабирования для небольшой картинки
aPic:=Picture.Create(400,400);
aPic.Rectangle(1,1,200,200,,_CLR_RED);
aPic.Rectangle(201,1,400,200,,_CLR_BLUE);
aPic.Rectangle(1,201,200,400,,_CLR_GREEN);
aPic.Rectangle(201,201,400,400,,_CLR_YELLOW);
aPic.Text(1,1,"1","Tahoma|40|B|"+DecToBase(_CLR_YELLOW,16),,,,3);
aPic.Text(201,1,"2","Tahoma|40|B|"+DecToBase(_CLR_GREEN,16),,,,3);
aPic.Text(1,201,"3","Tahoma|40|B|"+DecToBase(_CLR_BLUE,16),,,,3);
aPic.Text(201,201,"4","Tahoma|40|B|"+DecToBase(_CLR_RED,16),,,,3);

ProfilerClear();
ProfilerStart();

Коэфф:=1.42;

For i:=1 to 100 Do
  aPic2:=aPic.Copy();
  aPic2.Resize(aPic.Width*Коэфф,aPic.Height*Коэфф,0);
EndDo;

For i:=1 to 100 Do
  aPic2:=aPic.Copy();
  aPic2.Resize(aPic.Width*Коэфф,aPic.Height*Коэфф,1);
EndDo;

For i:=1 to 100 Do
  aPic2:=aPic.Copy();
  aPic2.Resize(aPic.Width*Коэфф,aPic.Height*Коэфф,2);
EndDo;

For i:=1 to 100 Do
  aPic2:=aPic.Copy();
  aPic2.Resize(aPic.Width*Коэфф,aPic.Height*Коэфф,3);
EndDo;

ProfilerStop();
debugbreak;
Message("Done!");
//Результат для i5:
//Без сглаживания: 3.9 мс. на операцию
//Метод ближайшего соседа: 6.5 мс. на операцию
//Метод билинейной фильтрации: 15.8 мс. на операцию
//Метод бикубической фильтрации: 96.2 мс. на операцию