BLoad
 
从使用BSave创建的文件或兼容的BMP图像文件中加载任意数据。

语法

Declare Function BLoad ( ByRef filename As Const String, ByVal dest As Any Ptr = 0, ByVal pal As Any Ptr = 0 ) As Integer

用法

result = BLoad( filename [, [ dest ] [, pal ] ] )

参数

filename
要加载图像的文件的名称;可以包括文件路径
dest
将图像加载到的内存位置,或空(0)将图像复制到当前图形屏幕工作页面
pal
将调色板加载到的内存位置或null(0)更改当前图形屏幕调色板,如果使用一个

返回值

如果成功则返回零(0),否则返回非零错误代码以指示故障。(throws a runtime error)

说明

BLoad可用于从使用BSave创建的文件中加载图像数据或任何其他数据,并将该数据存储在阵列中或将其粘贴到屏幕。如果dest 不存在或为空(0),图像数据将粘贴到当前图形屏幕工作页面。否则将作为图像数据加载到dest 给出的地址。

BLoad可以加载3种不同类型的文件:
    • 旧的QB类数据文件,由QB代码保存为BSAVE,包含以“989796242”开头的7字节头文件前面的“raw”数据,最大为64 KiB
    • 来自FB代码的新的类似FB的数据文件与BSave保存,包含以“&HFE”开头的5字节头文件前面的“raw”数据。此格式没有64 KiB限制
    • BMP图像文件,支持从BSave从FB代码保存的有效(“Windows”).BMP文件的一部分,以"BM"开头,或使用图形编辑器/转换器以兼容格式创建/保存。
打开时,类似QB的数据文件和BMP文件将转换为FB兼容的图像格式。

具有8位/每像素分辨率或更低的图像文件包含描述图像中使用的颜色值的调色板。如果pal 不为空(0),则调色板将从指定的地址复制到内存。否则,如果当前图形屏幕使用调色板,那么其调色板将更改为与图像文件相匹配。

当使用2种“非BMP”文件格式之一来保存图像时,图像文件必须已经在BSave中被创建,就像加载到相同的图形屏幕模式。使用BMP文件格式时,此限制不适用。

当使用BLoad加载BMP文件时,图像必须是真彩色(每像素15-,16-,24-或32位)或调色/索引(8位或更低)。图像数据将被转换为当前颜色深度的正确像素格式,除了真正的颜色不能减少到调色图像。BLoad不支持使用RLE压缩或其他图像文件类型(PNG,JPG,GIF,...)的BMP文件。BLoad将从具有BITMAPV4HEADERBITMAPV5HEADER文件头的32位BMP文件中加载alpha通道信息(如果可用)。

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

(1) Illegal function call
    • dest 未指定或为空(0),没有设置图形画面。
    • 位图使用不受支持的BMP文件压缩类型(BI_RLE4??,BI_RLE8
    • 位图是真彩色(每像素16,24或32位),当前图形屏幕使用调色板(每像素8位或更低)。
(2) File not found
    • 无法找到文件filename .
(3) File I/O error
    • 该文件没有任何支持的类型
    • 发生一般读取错误。

Note: When you use BLoad to load a BMP file into an image buffer, the original dimensions of the image are not changed. If you want the image buffer to have the same dimensions as the BMP file, you have to find out the dimensions beforehand, and create an image of the right size yourself. See the example below for an example of how to do this.

例子

'将图形加载到当前工作页面
Screen 18, 32
Cls
BLoad "PICTURE.BMP"
Sleep


'将48x48位图加载到图像中
ScreenRes 320, 200, 32
Dim myImage As Any Ptr = ImageCreate( 48, 48 )
BLoad "PICTURE.BMP", myImage
Put (10,10), myImage
ImageDestroy( myImage )
Sleep


ScreenRes 640, 480, 8 ''8位调色板图形模式
Dim pal(0 To 256-1) As Integer ''32位整数数组,空间为256色

''将位图加载到屏幕,将调色板放入pal()数组中
BLoad "PICTURE.BMP", , @pal(0)

WindowTitle "老调色板"
Sleep

''从pal()数组设置新的调色板
Palette Using pal(0)

WindowTitle "新调色板"
Sleep



''创建具有相同图像缓冲区的功能
''尺寸为BMP图像,并将文件加载到其中。

Const NULL As Any Ptr = 0

Function bmp_load( ByRef filename As Const String ) As Any Ptr

    Dim As Integer filenum, bmpwidth, bmpheight
    Dim As Any Ptr img

    ''打开BMP文件
    filenum = FreeFile()
    If Open( filename For Binary Access Read As #filenum ) <> 0 Then Return NULL

        ''检索BMP尺寸
        Get #filenum, 19, bmpwidth
        Get #filenum, 23, bmpheight

    Close #filenum

    ''使用BMP尺寸创建图像
    img = ImageCreate( bmpwidth, Abs(bmpheight) )

    If img = NULL Then Return NULL

    ''将BMP文件加载到图像缓冲区中
    If BLoad( filename, img ) <> 0 Then ImageDestroy( img ): Return NULL

    Return img

End Function



Dim As Any Ptr img

ScreenRes 640, 480, 32

img = bmp_load( "PICTURE.BMP" )

If img = NULL Then
    Print "bmp_load失败"

Else

    Put (10, 10), img

    ImageDestroy( img )

End If

Sleep

与QB差别

  • 支持加载BMP文件是FreeBASIC的新功能。
  • 支持从BMP文件检索调色板是FreeBASIC的新功能。
  • FreeBASIC在内部使用不同于QBASIC的文件格式,它不具有64 KiB限制,并且不受QBASIC的支持。

参考