Get (Graphics)
 
Получает копию части текущей рабочей страницы или буфера изображения

Синтаксис

Get [source,] [STEP](x1, y1) - [STEP](x2, y2), dest

Параметры

source
Адрес буфера изображения.
STEP
Указывает, что следующие координаты не абсолютны.
[STEP](x1, y1)
координаты верхнего левого угла вложенного изображения для копирования. STEP указывает что (x1, y1) имеют смещения по отношению к текущей позиции курсора графики.
[STEP](x2, y2)
координаты нижнего правого угла вложенного изображения для копирования. STEP указывает что x2 и y2 являются относительными по отношению к x1 и y1, соотвественно.
dest
адрес ранее выделенного буфера для хранения данных изображения.

Описание

Get копирует прямоугольную часть текущей рабочей страницы с заданными координатами (x1, y1) и (x2, y2), которые представляют левый верхний и правый нижний углы прямоугольника, соответственно. STEP указывает, что координаты левого верхнего угла, относительны текущему местоположению графического пера, или что координаты правого нижнего угла задаются относительно координат левого верхнего угла. Новый буфер изображения форматируется в соответствии с текущим пиксельным форматом режима экрана.

dest может быть адресом в массиве, или ссылкой на первый элемент в массиве , который получит новый буфер изображения. Эта память должна выделяться достаточного размера, чтобы получить буфер изображения; количество необходимых байт варьируется в зависимости от -lang dialect , используемого при компиляции программы.

source может быть адресом в массиве, или ссылкой на первый элемент в массиве , который содержит буфер изображения для извлечения части.

Координаты прямоугольника имеют эффект от самых последних вызовов Window и View (Графика), и они должны быть в пределах текущей вырезанной области, установленной View (Графика), в противном случае будет срабатывать ошибка runtime, а функция не будет иметь никакого эффекта.

Runtime ошибки:
Get создает одну из следующих runtime ошибок:

(1) Illegal function call
    • dest имеет массив недостаточно большой, чтобы содержать буфер изображения.
    • Координаты верхнего левого или правого нижнего угла находятся за пределами текущей вырезанной области. См. View (Графика).

Различия диалектов

Существует 2 типа буферов (подробнее см. GfxInternalFormats) в зависимости от использованного диалекта FB:

  • В диалекте -lang fb, dest получает буфер изображения нового стиля, который состоит из 32 байтного заголовка изображения, за которым следуют пиксельные данные,  строки которых дополняются до границы следующего пункта (16 байт). Используйте следующую формулу для вычисления общего размера в байтах, необходимого для хранения буфера изображения, где w и h являются соответственно шириной и высотой прямоугольной части текущего буфера рабочей страницы или исходного изображения, а bpp - это количество байт на пиксель текущего режима экрана:
size = 32 + (((w * bpp + &hF) and not &hF) * h)

  • В диалектах -lang qb и -lang fblite, dest получает буфер изображения QB-стиля, который состоит из 4-байтового заголовка изображения, за которым следуют пиксельные данные, строки которых не дополняются. Используйте следующую формулу для вычисления общего размера в байтах, необходимого для хранения буфера изображения, где w и h являются соответственно шириной и высотой прямоугольной части текущего буфера рабочей страницы или исходного изображения, а bpp - это количество байт на пиксель текущего режима экрана:
size = 4 + (w * h * bpp)

Пример

#include once "fbgfx.bi"

'' Установка экрана 400x300 32 бит
ScreenRes 400, 300, 32

'' Сначала нарисуем забавные вещи...
Line (10,10)-(140,30), RGB(255,255,0), bf
Draw String (20, 20), "Hello there!", RGB(255,0,0)

'' Теперь захватим блок 150 x 50 от левого верхнего края экрана в изображении
'' с помощью GET...
Dim As fb.Image Ptr image = ImageCreate(150, 50)
Get (1,1)-(150,50), image

'' И дублируем его повсюду!
Put (1,50), image
Put (1,100), image
Put (1,150), image
Put (1,200), image
Put (1,250), image
Put (150,1), image
Put (150,50), image
Put (150,100), image
Put (150,150), image
Put (150,200), image
Put (150,250), image

'' Рамка вокруг всего экрана..
Line (1,1)-(400-1,300-1), RGB(255,255,0), b

'' Теперь получить весь экран...
Dim As fb.Image Ptr big = ImageCreate(400, 300)
Get (1,1)-(400-1,300-1), big

'' И отобразить "скриншот" как будто прокручивая...
Dim As Integer x = -350
While ((Inkey() = "") And (x < 350))
    ScreenLock
        Cls
        Put (x,1), big
    ScreenUnlock

    Sleep 100, 1

    x += 10
Wend


См. также