Skip to content

GET(图形)


获取当前工作页面或图像缓冲区的一部分副本

语法

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

参数

source

图像缓冲区的地址。如果省略,则复制当前工作页面。

STEP

表示后续坐标不是绝对坐标。

[STEP](x1, y1)

要复制的子图像左上角坐标。STEP 表示 (x1, y1) 偏移量相对于当前图形光标位置。

[STEP](x2, y2)

要复制的子图像右下角坐标。STEP 表示 x2y2 分别相对于 x1y1

dest

用于存储图像数据的预先分配缓冲区地址。

说明

Get 复制由坐标 (x1, y1) 和 (x2, y2) 指定的当前工作页面矩形区域,分别代表矩形的左上角和右下角。STEP 指定左上角坐标相对于当前图形笔位置,和/或右下角坐标相对于左上角坐标。新图像缓冲区格式与当前屏幕模式像素格式匹配。

dest 可以是地址、数组(名称后不跟空括号)或数组中第一个元素的引用,将接收新图像缓冲区。此内存必须足够大以容纳图像缓冲区(所需字节数因编译程序所用的 -lang 方言 而异)。有效的图像缓冲区可以通过优先使用 ImageCreate 语句简单创建。

source 可以是地址、数组(名称后不跟空括号)或数组中第一个元素的引用,其中保存图像缓冲区以检索其中的一部分。在这种情况下,x1y1x2y2Stepdest 含义相同。

矩形坐标受最近的 WindowView (Graphics) 语句影响,且必须都在 View (Graphics)(或默认视口)设置的当前裁剪区域内,否则将触发非法函数调用运行时错误,函数将不起作用。

运行时错误: Get 抛出以下运行时错误之一:

(1) 非法函数调用

  • dest 是数组,但不足以容纳图像缓冲区。
  • 矩形的左上角或右下角坐标超出当前裁剪区域(设置的或默认的)。参见 View (Graphics)

方言差异

有 2 种类型的缓冲区(详情参见 GfxInternalFormats),取决于使用的 FB 方言:

  • -lang fb 方言中,dest 接收新式图像缓冲区,由 32 字节图像头加上按下一个段(16 字节)对齐行填充的像素数据组成。使用以下公式计算存储图像缓冲区所需的总字节数,其中 wh 分别是当前工作页面或源图像缓冲区矩形区域的宽度和高度,bpp 是当前屏幕模式的每像素字节数:
  • -lang qb-lang fblite 方言中,dest 接收 QB 式图像缓冲区,由 4 字节图像头加上未行填充的像素数据组成。使用以下公式计算存储图像缓冲区所需的总字节数,其中 wh 分别是当前工作页面或源图像缓冲区矩形区域的宽度和高度,bpp 是当前屏幕模式的每像素字节数:

示例

start GeSHi

vb
#include once "fbgfx.bi"

'' Setup a 400x300 32bit screen
ScreenRes 400, 300, 32

'' First draw funny stuff...
Line (10,10)-(140,30), RGB(255,255,0), bf
Draw String (30, 20), "Hello there!", RGB(255,0,0)

'' Now capture a 150x50 block from the top-left of the screen into an image
'' buffer with GET...
Dim As fb.Image Ptr image = ImageCreate(150, 50)
Get (0,0)-(150-1,50-1), image

'' And duplicate it all over the place!
Put (0,50), image
Put (0,100), image
Put (0,150), image
Put (0,200), image
Put (0,250), image
Put (150,0), image
Put (150,50), image
Put (150,100), image
Put (150,150), image
Put (150,200), image
Put (150,250), image

ImageDestroy(image)

'' And a frame around a whole screen..
Line (0,0)-(400-1,300-1), RGB(255,255,0), b

'' Now get the whole screen...
Dim As fb.Image Ptr big = ImageCreate(400, 300)
Get (0,0)-(400-1,300-1), big

'' And display that "screenshot" as if it was scrolling by...
Dim As Integer x = -350
While ((Inkey() = "") And (x < 350))
    ScreenLock
        Cls
        Put (x,0), big
    ScreenUnlock

    Sleep 100, 1

    x += 10
Wend

ImageDestroy(big)

end GeSHi

另请参阅

  • Put (Graphics)
  • ImageCreate
  • Get (File I/O)
  • Screen (Graphics)
  • Window
  • View (Graphics)
  • 内部图形格式

返回 目录

基于 FreeBASIC 官方文档翻译 如有侵权请联系我们删除
FreeBASIC 是开源项目,与微软公司无隶属关系