Put (Графика)
 
Копирует изображение на другое изображение или экран

Синтаксис

Put [target, ] [ [STEP](x, y), source [, (x1, y1)-[STEP](x2, y2) ] [, method [, ( alphaval|value|blender [, param]) ] ]

Параметры

target
Адрес буфера, где изображение должно быть нарисовано. Если параметр опущен, то изображение выводится на экран. См. ниже.
[STEP](x, y)
Определяют смещение от верхнего левого угла целевого буфера, или экрана, на котором изображение рисуется. STEP указывает на то, что смещения(x, y) будут относительно текущей позиции графического курсора.
source
Адрес буфера изображения для рисования. Смотрите ниже.
(x1, y1)-[STEP](x2, y2)
Указывает прямоугольную область в буфере source для рисования. Если этот параметр опущен, рисуется весь буфер. STEP указывает на то, что x2 и y2 будут относительно x1 и y1, соотвественно.
method
Определяет метод, используемый для рисования изображения в целевой буфер . Может принимать одно из следующих действий. (метод по умолчанию XOR):

Фоно-независимые методы
PSet : Значения пикселов копируются без изменений.
PRESET : Значения пикселов копируются с инвертированием.
Trans : Значения пикселов копируются без изменений. Не рисуются пикселы исходного цвета маски. Смотрите ниже.
Фоно-зависимые методы
And : Смешивание пикселей по битовому методу And. Смотрите ниже.
Or : Смешивание пикселей по битовому методу Or. Смотрите ниже.
Xor : Смешивание пикселей по битовому методу Xor. Смотрите ниже.
Alpha : Пиксели смешиваются с прозрачностью коэффициента, указанного в параметре value, или смешивание идет в каждом отдельном пикселе изображения. Смотрите ниже.
Add: Пиксели умножаются на value и добавляются с насыщением. Смотрите ниже.
Custom : Для смешивания пикселей используется определяемая пользователем функция. Смотрите ниже.

value
Значение в диапазоне 0..255 , указывающее значение прозрачности для методов блитирования ADD или ALPHA.
blender
Указывает адрес определяемой пользователем функции, вызываемой в методе блитирования CUSTOM. Смотрите ниже.
param
Дополнительный параметр для передачи при смешивании custom.

Описание

Оператор Put может использоваться для рисования изображения на другом изображении. Координаты x и y затрагиваются от последнего вызова операторов View и Window, и рисуемое изображение признает текущую урезанную область , установленную последним вызовом оператора View. Исходное изображение обрезается, если оно оказывается за пределами конечного буфера.

Допустимые буферы изображения
Буферы изображения source и target должны быть допустимыми буферами изображения. Допустимые буферы изображения создаются с помощью операторов Get или ImageCreate. Допустимые буферы изображения могут быть указаны в операторе Put , используя имя массива с необязательным индексом или указатель с необязательным индексом.

Методы рисования
В зависимости от используемого метода, существующие значения пикселов в конечном буфере используются для расчета значений пикселов, которые рисуются. Методы PSET, PRESET и TRANS не используют конечный буфер для расчета окончательных значений пикселей, а методы AND, OR, XOR, ALPHA и ADD делают это. Изображение, которое рисуется с последними указанными методами будет выглядеть по-разному в зависимости от содержания конечного буфера.

Различные форматы пикселов
Формат пикселов буфера изображения должен быть совместим с текущей глубиной цвета графического режима; то есть, если вы получаете изображение с помощью Get и после изменили режим экрана с помощью оператора Screen, данные изображения не могут быть действительны в новом графическом режиме, и вы не сможете нарисовать изображение на экране. Следует отметить однако, что вы всегда будете иметь возможность рисовать буферы изображения на другие буферы изображения с помощью Put , конечно же если эти буферы имеют ту же глубину цвета.

Методы AND, OR и XOR дают разные результаты в зависимости от текущей глубины цвета так, как пиксели хранятся в различных форматах; смотрите Внутренний формат пикселей для детальной информации.

Маска цвета
Методы TRANS, ALPHA и ADD methods не рисуют пикселы исходного изображения, которые используют цвет маски. Цвет маски зависит от глубины цели (буфера изображения или буфера экрана): в глубине до 8 bpp (режимы палитры) маска равна индексу цвета 0, в полноцветных режимах глубины (16 и 32 bpp) она равна пурпурному цвету, то есть RGB(255, 0, 255). Обратите внимание, что в 32 bpp режимах значение альфа-канала цвета не влияет на определение прозрачного цвета; только нижние 24 бита используются для идентификации. Смотрите Внутренний формат пикселей для детальной информации.

Рисование с прозрачностью
Метод ALPHA может быть использован в двух режимах. Если указывается параметр value, то метод используется, чтобы определить уровень прозрачности для всего рисуемого изображения; Значение 0 нарисует полностью прозрачное изображение, а значение 255 полностью непрозрачное. Этот режим работает только тогда, когда рисунок полноцветный (16 и 32 bpp).
Если параметр value опущен, тогда метод ALPHA будет принимать уровень альфа-значения на основе пикселя, что позволяет рисовать изображения с альфа-каналом (некоторые части изображения могут быть сделаны более или менее прозрачными, чем другие). Этот режим работает только с буферами изобажений 32 бит на пиксель, так как это единственная глубина цвета, которая позволяет встроить значения альфа в каждом пикселе.

Работа с альфа-каналом
Обычно Put позволяет нарисовать изображение буфера только на цель с такой же глубиной, но есть исключения. При рисовании 8bpp буфера изображения на целевой объект 32bpp с методом ALPHA, исходное изображение 8 бит на пиксель рисуется в альфа-канал цели 32bpp. Это позволяет легко установить альфа-канал изображения без необходимости иметь дело с доступом низкого уровеня к данным пикселей.

Пользовательская функция смешивания
Метод CUSTOM использует пользовательскую функцию для расчета окончательных значений пикселей, которые можно рисовать в конечный буфер. Эта функция будет вызываться один раз для каждого пикселя исходного изображения, и получит исходные и конечные значения пикселей, а также указатель на данные, передаваемые в функцию Put. Будет возвращено значение пикселя, которое будет использоваться для рисования в конечный буфер. Функция имеет вид:

Declare Function identifier ( ByVal source_pixel As UInteger, ByVal destination_pixel As UInteger, ByVal parameter As Any Ptr) As UInteger

identifier  это имя функции. Может быть какое угодно.
source_pixel это текущее значение пикселя исходного изображения.
destination_pixel это текущее значение пикселя конечного изображения.
parameter является параметром, который передается в функции Put. Это должны быть данные, передаваемые по Указателю. Если параметр опущен, его значение будет равно нулю.

Пример

Следующая программа дает простой пример того, как Put(положить) изображение на экран, включая создание буфера изображения, и освобождение его памяти после.
'' настроим экран и зальем фоновым цветом
ScreenRes 320, 200, 32
Paint (0, 0), RGB(64, 128, 255)

'' настроим изображение и нарисуем кое-что в нем
Dim img As Any Ptr = ImageCreate( 32, 32, RGB(255, 0, 255) )
Circle img, (16, 16), 15, RGB(255, 255, 0),     ,     , 1, f
Circle img, (10, 10), 3,  RGB(  0,   0, 0),     ,     , 2, f
Circle img, (23, 10), 3,  RGB(  0,   0, 0),     ,     , 2, f
Circle img, (16, 18), 10, RGB(  0,   0, 0), 3.14, 6.28

'' PUT(рисуем) изображение в центре экрана
Put (160 - 16, 100 - 16), img, Trans

'' освободим память изображения
ImageDestroy img

'' ожидаем нажатия клавиши
Sleep




В следующем примере показано, как выделить память для изображения, нарисовать изображение, используя различные методы, в том числе пользовательское смешивание CUSTOM, и освободить память для изображения:
Declare Function checkered_blend( ByVal src As UInteger, ByVal dest As UInteger, ByVal param As Any Ptr ) As UInteger

   Screen 14, 32                                   '' Установим 320*240*32 gfx режим
   
   Dim As Any Ptr sprite
   Dim As Integer counter = 0
   
   sprite = ImageCreate( 32, 32 )                  '' Выделим память для спрайта 32x32
   
   Line sprite, ( 0, 0 )-( 31, 31 ), RGBA(255, 0, 0, 64), bf  '' рисуем спрайт ...
   Line sprite, ( 4, 4 )-( 27, 27 ), RGBA(255, 0, 0, 192), bf
   Line sprite, ( 0, 0 )-( 31, 31 ), RGB(0, 255, 0), b
   Line sprite, ( 8, 8 )-( 23, 23 ), RGBA(255, 0, 255, 64), bf
   Line sprite, ( 1, 1 )-( 30, 30 ), RGBA(0, 0, 255, 192)
   Line sprite, ( 30, 1 )-( 1, 30 ), RGBA(0, 0, 255, 192)
   
   Cls
   Dim As Integer i : For i = 0 To 63              '' отрисовка фона
      Line( i,0 )-( i,240 ), RGB( i * 4, i * 4, i * 4 )
   Next i
   
   '' демонстрация всех методов рисования ...
   Put( 8,14 ), sprite, PSet
   Put Step( 16,20 ), sprite, PReset
   Put Step( -16,20 ), sprite, And
   Put Step( 16,20 ), sprite, Or
   Put Step( -16,20 ), sprite, Xor
   Put Step( 16,20 ), sprite, Trans
   Put Step( -16,20 ), sprite, Alpha, 96
   Put Step( 16,20 ), sprite, Alpha
   Put Step( -16,20 ), sprite, add, 192
   Put Step( 16,20 ), sprite, Custom, @checkered_blend, @counter
   
   '' печатаем описание возле каждого метода
   Draw String (100, 26), "<- pset"
   Draw String Step (0, 20), "<- preset"
   Draw String Step (0, 20), "<- and"
   Draw String Step (0, 20), "<- or"
   Draw String Step (0, 20), "<- xor"
   Draw String Step (0, 20), "<- trans"
   Draw String Step (0, 20), "<- alpha (uniform)"
   Draw String Step (0, 20), "<- alpha (per pixel)"
   Draw String Step (0, 20), "<- add"
   Draw String Step (0, 20), "<- custom"
   
   ImageDestroy( sprite )                          '' освободим выделенную память для спрайта
   Sleep : End 0

'' функция пользовательского смешивания
Function checkered_blend( ByVal src As UInteger, ByVal dest As UInteger, ByVal param As Any Ptr ) As UInteger
   Dim As Integer Ptr counter
   Dim As UInteger pixel
   
   counter = Cast(Integer Ptr, param)
   pixel = IIf(((*counter And 4) Shr 2) Xor ((*counter And 128) Shr 7), src, dest)
   *counter += 1
   Return pixel
End Function




Отличия от QB

  • target является новым в FreeBASIC
  • Методы TRANS, ALPHA, ADD и CUSTOM являются новыми в FreeBASIC
  • FB использует другой внутренний формат изображения, который не подтверждается в QB
  • QB выводит ошибку во время выполнения, когда изображение выводится вне границ отсечения
  • В QB только массивы могут быть определены как исходные изображения

См. также