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 )
在源缓冲区中指定一个矩形区域来绘制。如果省略,则绘制整个缓冲区。STEP表示x2 y2 分别与x1 y1 相关。
method
指定用于将图像绘制到目标缓冲区的方法,并且可以是以下任何一种(默认方法为XOR):

背景无关的方法
PSet:源像素值被复制而不进行修改。
PRESET:源像素值在被复制之前为1的补数取反。
Trans:源像素值被复制而无需修改。不绘制掩码颜色的源像素。见下文。
背景相关的方法
And:目标像素与源像素按位And.见下文。
Or:目标像素与源像素按位Or.见下文。
Xor:目标像素与源像素按位Xor.见下文。
Alpha:源与value 参数或图像的单个像素中指定的透明度因子混合。见下文。
Add:源被乘以一个值,并向目标添加饱和度。见下文。
Custom:使用用户定义的函数来执行将源与目的地混合。见下文。

value
是一个0..255值,指定ADDALPHA方法blit的透明度值。
blender
指定要在CUSTOM方法blit中调用的用户定义函数的地址。见下文。
param
指定要传递给自定义搅拌机的参数。

说明

Put语句可用于将图像绘制到另一个图像上。x y 坐标受最后一次调用ViewWindow语句的影响,并且绘制的图像与上一次调用View语句设置的当前裁剪区域相关。如果源图像被绘制在目标缓冲区之外,则会剪切源图像。

有效图像缓冲区
source target 图像缓冲区必须是有效的图像缓冲区。使用GetImageCreate语句创建有效的图像缓冲区。可以使用带有可选索引的数组名称或带有可选索引的指针在Put语句中指定有效的映像缓冲区。

绘图方法
根据使用的方法,目的缓冲区中的现有像素值用于计算实际绘制的像素值。PSETPRESETTRANS方法不使用目标缓冲区来计算最终像素值,而ANDORXORALPHAADD方法。使用这些后一种方法绘制的图像将根据目标缓冲区的内容而不同。

不同的像素格式
图像缓冲区的像素格式必须与当前图形模式的颜色深度兼容;也就是说,如果您使用Get获取图像,并且稍后通过Screen语句更改屏幕模式,图像数据可能在新图形模式下可能无效,并且您可能无法在屏幕上绘制。但是,您应该注意到,只要这些缓冲区以相同的深度创建,您将始终能够通过Put将图像缓冲区绘制到其他图像缓冲区上。

ANDORXOR方法根据当前颜色深度产生不同的结果,因为像素以不同的格式存储;详见内部像素格式.

面具颜色
TRANSALPHAADD方法不会在使用掩码颜色的源图像中绘制像素。掩码颜色取决于目标(它是图像缓冲区或屏幕)深度:深度达8 bpp(调色模式),它等于颜色索引0,而在高/深度深度(16和32 bpp)它等于洋红色,这是RGB(255, 0, 255).请注意,在32个bpp模式中,颜色的alpha值不影响透明颜色的识别;只有较低的24位用于识别它。有关详细信息,请参阅内部像素格式.

半透明画
ALPHA方法可以在两种模式下使用。如果指定value 参数,则用于指定要绘制的整个图像的透明度级别;值为0将绘制完全透明的图像,而255的值将绘制完整的图像。此模式仅在绘制到hi / truecolor目标(16和32 bpp)时有效。
如果value 参数被省略,则ALPHA方法将以每像素为基础获取Alpha级别值,允许使用Alpha通道绘制图像(图像的某些部分可以或多或少地透明于其他图像)。此模式仅适用于32个bpp图像缓冲区,因为这是唯一允许在每个像素中嵌入Alpha值的颜色深度。

处理alpha通道
通常Put只允许将图像缓冲区绘制到具有相同深度的目标上,但是有一个异常。将8 bpp图像缓冲区绘制到32 bpp目标上时,使用ALPHA方法,将8 bpp源图像绘制到32 bpp目标的alpha通道。这允许容易地设置图像的整个半透明通道,而不必处理其像素数据的低级别访问。

自定义混合功能
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命令传递的参数。它应该是一个数据Pointer.如果省略,其值将为零。

例子

以下程序给出了一个简单的例子,说明如何图像到屏幕,包括设置图像缓冲区,并释放其内存。
''设置屏幕并填充背景颜色
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 (160 - 16, 100 - 16), img, Trans

''释放图像内存
ImageDestroy img

''等待按键
Sleep




以下示例显示如何为图像赋值内存,使用各种方法(包括自定义混合器)绘制该图像,并释放图像的内存:
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), "< - 预设"
   Draw String Step (0, 20), "< - 和"
   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(每像素)"
   Draw String Step (0, 20), "< - 添加"
   Draw String Step (0, 20), "< - 自定义"
   
   ImageDestroy( sprite )                          ''为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的新功能
  • FreeBASIC的新功能TRANS ALPHA ADD 自定义
  • FB在内部使用不同的图像格式,不受QB的支持
  • QB会抛出一个运行时错误,而不是剪切超出边界的图像
  • 在QB中,只能将数组指定为源图像

参考