BLOAD
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=KeyPgBload
- 最后更新: 2021-12-05
从 Bsave 创建的文件或兼容的BMP图像文件中加载任意数据。
语法
declare function Bload ( byref filename as const string, byval dest as any ptr = 0, byval pal as any ptr = 0 ) as long用法
result = Bload( filename [, [ dest ] [, pal ] ] )参数
filename
要加载图像的文件名;可以包含文件路径
dest
加载图像的内存位置,或 null(0)表示将图像复制到当前图形屏幕工作页面
pal
加载调色板的内存位置,或 null(0)表示更改当前图形屏幕调色板(若有)
返回值
成功时返回零(0),失败时返回非零错误码。(触发运行时错误)
说明
Bload 可用于从 Bsave 创建的文件中加载图像数据或任何其他数据,并将数据存储到数组中或粘贴到屏幕上。若 dest 缺省或为 null(0),图像数据将粘贴到当前图形屏幕工作页面;否则将作为图像数据加载到 dest 指定的地址。
Bload 只能在初始化图形模式后调用,否则程序会崩溃(在文本模式下工作请参阅 BLOAD/BSAVE 文本模式变通方案)。
Bload 可加载3种不同类型的文件:
- 旧QB风格的数据文件,以QB代码中的
BSAVE保存,包含以&HFD开头的7字节头部前缀的"原始"数据,大小限于64KiB - 新FB风格的数据文件,以FB代码中的
Bsave保存,包含以&HFE开头的5字节头部前缀的"原始"数据,此格式无64KiB限制 - BMP图像文件,支持部分有效的("Windows").BMP文件,以
"BM"开头,可以是FB代码用Bsave保存的,或使用图形编辑器/转换器以兼容格式创建/保存的。
打开时,QB风格的数据文件和BMP文件将转换为FB兼容的图像格式。
8位每像素或更低分辨率的图像文件包含描述图像中使用的颜色值的调色板。若 pal 不为 null(0),调色板将被复制到指定地址开始的内存中;否则若当前图形屏幕使用调色板,其调色板将被更改以匹配图像文件的调色板。
使用2种"非BMP"文件格式保存图像时,图像文件必须在与加载时相同的图形屏幕模式下用 Bsave 创建。使用BMP文件格式时,此限制不适用。
使用 Bload 加载BMP文件时,图像必须为真彩色(每像素15、16、24或32位)或调色板/索引(8位或更低)。图像数据将转换为当前颜色深度的适当像素格式,但真彩色不能缩减为调色板图像。Bload 不支持使用RLE压缩的BMP文件或其他图像文件类型(PNG、JPG、GIF等)。Bload 将从带有 BITMAPV4HEADER 或 BITMAPV5HEADER 文件头的32位BMP文件中加载alpha通道信息(如有)。
Bload 返回的错误码可以在下一行用 Err 检查。函数版本的 Bload 直接以32位 Long 返回错误码。
运行时错误: Bload 触发以下运行时错误之一:
(1) 非法函数调用
- 未指定
dest或为 null(0),且未设置图形屏幕。 - Bitmap 使用了不支持的BMP文件压缩类型(
BI_RLE4、BI_RLE8) - Bitmap 为真彩色(每像素16、24或32位),而当前图形屏幕使用调色板(每像素8位或更低)。
(2) 找不到文件
- 找不到文件
filename。
(3) 文件I/O错误
文件不属于任何支持的类型
发生了一般性读取错误。
注意:当你使用
BLoad将BMP文件加载到图像缓冲区时,图像的原始尺寸不会改变。如果你想让图像缓冲区与BMP文件尺寸相同,你必须事先找出尺寸,并自行创建正确大小的图像。请参阅下面的示例了解具体做法。
示例
start GeSHi
'Load a graphic to current work page
Screen 18, 32
Cls
BLoad "picture.bmp"
Sleepend GeSHi
start GeSHi
'Load a 48x48 bitmap into an image
ScreenRes 320, 200, 32
Dim myImage As Any Ptr = ImageCreate( 48, 48 )
BLoad "picture.bmp", myImage
Put (10,10), myImage
ImageDestroy( myImage )
Sleepend GeSHi
start GeSHi
ScreenRes 640, 480, 8 '' 8-bit palette graphics mode
Dim pal(0 To 256-1) As Integer '' 32-bit integer array with room for 256 colors
'' load bitmap to screen, put palette into pal() array
BLoad "picture.bmp", , @pal(0)
WindowTitle "Old palette"
Sleep
'' set new palette from pal() array
Palette Using pal(0)
WindowTitle "New palette"
Sleepend GeSHi
start GeSHi
'' A function that creates an image buffer with the same
'' dimensions as a BMP image, and loads a file into it.
Const NULL As Any Ptr = 0
Function bmp_load( ByRef filename As Const String ) As Any Ptr
Dim As Long filenum, bmpwidth, bmpheight
Dim As Any Ptr img
'' open BMP file
filenum = FreeFile()
If Open( filename For Binary Access Read As #filenum ) <> 0 Then Return NULL
'' retrieve BMP dimensions
Get #filenum, 19, bmpwidth
Get #filenum, 23, bmpheight
Close #filenum
'' create image with BMP dimensions
img = ImageCreate( bmpwidth, Abs(bmpheight) )
If img = NULL Then Return NULL
'' load BMP file into image buffer
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 failed"
Else
Put (10, 10), img
ImageDestroy( img )
End If
Sleepend GeSHi
与 QB 的差异
- 加载BMP文件的支持是FreeBASIC的新功能。
- 从BMP文件中检索调色板的支持是FreeBASIC的新功能。
- FreeBASIC内部使用与QBASIC不同的文件格式,该格式没有64KiB限制,且QBASIC不支持。
另请参阅
BsavePaletteImageCreateImageDestroy- 内部图形格式
返回 目录