Picture.DrawPicture

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

Функция рисует текущую картинку в указанной области картинки-приемника. Функция позволяет задать режим рисования, угол поворота картинки, а также алгоритм масштабирования. Рисуемая картинка может иметь прозрачный слой (для BMP и PNG), прозрачность может быть задана определенным цветом, коэффициентом альфа или картинкой маски.
Прозрачность рисуемой картинки может быть задана несколькими способами:

  • Форматы BMP или PNG могут содержать данные о прозрачности, при этом:
    • BMP -- должен быть в формате 32 бита, для прозрачности будет использоваться 4 байт точки, состояния этого байта, равное нулю, будет означать непрозрачную точку, 255 -- невидимую точку, остальные значения представляют градиент между граничными.
    • PNG -- формат имеет встроенную информацию о прозрачности, которая и будет использована.
  • 7 аргумент может представлять собой цвет, который будет считаться прозрачным на рисуемой картинке. Это особый режим, используется для простых не фотографических изображений, прозрачность заданная таким образом, не вступает в преобразования в алгоритмах масштабирования.
  • 7 аргумент может представлять собой картинку-маску, при этом для прозрачности будет использован только синий цвет этой картинки (см. описание аргументов). Важно: прозрачность, заданная таким образом, инвертирована, по сравнению с прозрачностью, заданной 4 байтом BMP.
  • Последний аргумент функции задает коэффициент альфа, который будет влиять на каждую точку до ее вывода (возможно, увеличивая ее прозрачность).

Синтаксис

Picture.DrawPicture(<Картинка-приемник (PICTURE)>,<Координата X в приемнике (INT)>,<Координата Y в приемнике (INT)>,<Ширина рисуемой картинки (INT)>,<Высота рисуемой картинки (INT)>,<Операция рисования (INT)>=0,<Прозрачный цвет для режима рисования с маской или картинка-маска (PICTURE,INT)>=-1,<Координаты региона отсечения (LIST,STRING)>,<Угол поворота рисования (REAL)>=0,<Алгоритм масштабирования (INT)>=0,<Коэффициент альфа-сопряжения (INT)>=1000)

Аргументы

  • <Картинка-приемник (PICTURE)> - Картинка, на которой будет нарисована текущая.
  • <Координата X в приемнике (INT)>,<Координата Y в приемнике (INT)> - Аргументы задают координату начала рисования в приемнике. Вне зависимости от наличия поворота, изменения размеров или прозрачности, результат преобразования рисуется с этой точки вправо и вниз.
  • <Ширина рисуемой картинки (INT)>,<Высота рисуемой картинки (INT)> - (необязательный аргумент) Аргументы задают ширину и высоту рисуемой картинки. По умолчанию, будет использована ширина и высота исходной картинки, если ширина или высота отличается от текущей, размеры картинки будут изменены перед рисованием (картинка будет уменьшена или увеличена в размерах до начала рисования, как будто была выполнена функция Resize, однако, оригинальная картинка не изменится).
  • <Операция рисования (INT)> - (необязательный аргумент) Аргумент задает режим (операцию) рисования. Нужно понимать, что прозрачность или сглаживание совместно с режимами, отличными от "копирования", могут привести неожиданным результатам (однако, не запрещены). Возможны следующие значения аргумента:
    • 0 (по умолчанию) -- "копирование" точки в картинку результат (с учетом прозрачности).
    • 1 -- операция дизъюнкции (OR).
    • 2 -- операция исключающего или (XOR).
    • 3 -- операция конъюнкции (AND).
    • 4 -- операция сложения (ADD). Значение каждого из трех каналов (R,G и B) точки результата добавляется к значению каждого из трех каналов исходной точки, если результат сложения превышает 255, он уменьшается до 255.
    • 5 -- операция вычитания (SUB). Значение каждого из трех каналов (R,G и B) точки результата отнимается от значения каждого из трех каналов исходной точки, если результат вычитания меньше 0, он увеличивается до 0.
  • <Прозрачный цвет для режима рисования с маской или картинка-маска (PICTURE,INT)> - (необязательный аргумент) Аргумент может иметь следующий тип данных:
    • Картинка -- картинка, заданная аргументом, будет использована, как маска прозрачности рисуемой картинки. Для маски будет использоваться синий канал (в BMP младший байт). Если значение канала равно 255, исходная точка картинки считается непрозрачной, 0, -- исходная точка картинки не видна, остальные значения представляют градиент между граничными.
    • Число -- число задает цвет, который не будет выведен в картинку-результат. Таким образом можно получить простую прозрачность, мало подходящую для картинок фотографического качества. По умолчанию, аргумент равен -1, т.е. "прозрачный цвет" отсутствует.
  • <Координаты региона отсечения (LIST,STRING)> (необязательный аргумент) Аргумент задает прямоугольник в координатах картинки-приемника, внутри которого точки выводимой картинки будут видны, вне прямоугольника точки выведены не будут (прямоугольник ограничения). По умолчанию, регион отсутствует. Аргумент может представлять собой список координат, включающий последовательно 4 координаты: левую координату (x1), верхнюю координату (y1), правую координату (x2) и нижнюю координату (y2); либо строку в формате "<Левая координата региона>,<Верхняя координата региона>,<Правая координата региона>,<Нижняя координата региона>".
  • <Угол поворота рисования (REAL)> - Рисуемая картинка будет повернута против часовой стрелки на указанное количество градусов. Важно понимать, что указываются именно градусы, а не радианы. Число может быть дробным. По умолчанию, картинка не будет повернута.
  • <Алгоритм масштабирования (INT)> - (необязательный аргумент) Алгоритм масштабирования во время операции. Возможные следующие значения:
    • 0 (по умолчанию) - Без сглаживания. Самый быстрый режим, однако для текста и точных объектов создает неприглядный результат.
    • 1 - Метод ближайшего соседа (Nearest neighbor). Медленнее первого режима, однако создает почти такой же неприглядный результат.
    • 2 - Метод билинейной фильтрации (Bilinear). Режим создает гладкую картинку, однако работает медленнее, чем первые два режима.
    • 3 - Метод бикубической фильтрации (Bicubic). Режим создает гладкую картинку, при этом границы объектов (или текста) более выражены по сравнению с билинейной фильтрацией (меньше ощущаемое размытие). Режим работает значительно медленнее билинейной фильтрации и может создавать цветовые артефакты (неверные цвета, которые отсутствовали в оригинальном изображении) на границах резкого изменения цветов
  • <Коэффициент альфа-сопряжения (INT)> - (необязательный аргумент) Рисуемая картинка становится полупрозрачной, оставляя частично видимыми цвета, которые были под ней до ее рисования. Программа использует целочисленную нотация для указания коэффициента альфа. Сопряжение не используется при коэффициенте равном 1000 (по умолчанию), при 500 рисуемая картинка получает половину интенсивности, при 0, рисуемая картинка не видна. При использовании коэффициента не равного 1000, скорость рисования будет снижена.

Примеры

Результат выполнения примера
  Function _RotX(x,y,alpha)  
    Exit x*Cos(radians(alpha))+y*Sin(radians(alpha));
  EndFunction

  Function _RotY(x,y,alpha)
    Exit -x*Sin(radians(alpha))+y*Cos(radians(alpha));
  EndFunction

//Картинка-результат
aPic:=Picture.Create(550,550,toRgb(155,212,0),32);

//4 квадрата (см. пример Picture.Rectangle)
aPic2:=Picture.Create(400,400);
aPic2.Rectangle(1,1,200,200,,_CLR_RED);
aPic2.Rectangle(201,1,400,200,,_CLR_BLUE);
aPic2.Rectangle(1,201,200,400,,_CLR_GREEN);
aPic2.Rectangle(201,201,400,400,,_CLR_YELLOW);
aPic2.Text(6,6,"1","Tahoma|40|B|"+DecToBase(_CLR_YELLOW,16),,,,3);
aPic2.Text(206,6,"2","Tahoma|40|B|"+DecToBase(_CLR_GREEN,16),,,,3);
aPic2.Text(6,206,"3","Tahoma|40|B|"+DecToBase(_CLR_BLUE,16),,,,3);
aPic2.Text(206,206,"4","Tahoma|40|B|"+DecToBase(_CLR_RED,16),,,,3);

//Синее слово "ВРАЩЕНИЕ" на белом фоне (см. пример Picture.Text)
aPic3:=Picture.Create(560,120,toRgb(255,255,255),32);
Стр:="ВРАЩЕНИЕ";
y:=5;
x:=5;
a:=0;
For i:=1 To Length(Стр) Do
  lx:=0;ly:=0;
  Стр1:=Mid(Стр,i,1);
  aPic3.TextWidthAndHeight(Стр1,"Tahoma|60|B|",lx,ly);
  lx2:=lx\2;
  ly2:=ly\2;
  dx:=_RotX(lx2,ly2,a)-lx2;
  dy:=_RotY(lx2,ly2,a)-ly2;
  
  aPic3.Text(x-dx,y-dy,Стр1,"Tahoma|60|B|"+DecToBase(ToRgb(0,0,255*i/Length(Стр)),16)+"|"+a);

  x:=x+lx+5;
  a:=Round(i/Length(Стр)*90);
EndDo;

//Изменим пропорцию слова, чтобы оно помещалось в картинку-результат
aPic3.Resize(aPic3.Width*0.7,aPic3.Height*2);
//Нарисуем 4 квадрата, повернутые на 339° с измененной пропорцией на картинке результате,
//  при этом, используем синее слово "ВРАЩЕНИЕ", как маску вывода
aPic2.DrawPicture(aPic,5,5,aPic2.Width*1.1,aPic2.Height/1.1,0,aPic3,,339,2,1000);
//Нарисуем 4 квадрата повторно, уменьшив их в 3 раза и повернув на 45° с помощью операции AND с прозрачностью 40%
aPic2.DrawPicture(aPic,10,350,aPic2.Width/3,aPic2.Height/3,3,,,45,3,600);

aPic.Save("c:\Result2","png");