Bsaveで作成されたファイルや、互換性のある BMP 画像ファイルから、任意のデータを読み込む。
構文:
用法:
result = Bload( filename [, [ dest ] [, pal ] ] )
パラメタ:
filename
画像をロードする、ファイルの名前;
ファイル経路(パス)を含むことができます。
dest
画像のロード先の記憶域、または、現在の描画画面の作業ページに、画像をコピーするための、ヌル (0)
pal
パレットのロード先の記憶域、または、現在の描画画面のパレットを変えるためのヌル(0)。パレットを使う場合。
戻り値:
うまくいくと、戻り値は、ゼロ (
0) 。エラーの場合は、エラー内容を示す非ゼロの、エラー・コードになります。
エラー処理 を参照下さい。
説明:
Bload は、
Bsave で作成されたファイルから、画像データや、他のデータをロードするために、使用できます。
そして、そのデータを、配列に保存するか、または画面に貼り付けます。
dest を与えないか、またはヌル(
0)なら、画像データは、現在の描画画面の作業中のページに貼り付けられます。
それ以外では、データは、画像データとして、
dest で与えられたアドレスにロードされます。
Bload は、描画モードが初期化されている場合にだけ、呼び出す必要があります。そうでないと、プログラムがクラッシュします(テキストモードで機能するための
BLOAD/BSAVEテキストモードを使う を参照)。
Bload は、3つの異なったタイプのファイルを、ロードできます:
-
古い、QB 形式のデータファイル。
これは、QB コードの BSAVE で保存され、7バイトのヘッダーが先行する "raw" データを含んでいます。
&HFD で始まっていて、サイズは、64KiB までです。
-
新しい、FB 形式のデータファイル。
FB コードの Bsave で保存され、7バイトのヘッダーが先行する "raw" データを含んでいます。
&HFE で始まります。
この形式では、64 KiB の制限がありません。
-
BMP 画像ファイル。
有効な(「Windows」).BMPファイルの部分集合をサポートします。これは、FB コードの Bsave で保存されたか、あるいは、描画エディタ/コンバータを使って、コンパチブル形式で作成・保存された、"BM"で始まるファイルです。
QB 形式のデータ・ファイルとBMPファイルは、開かれると、FBコンパチブル画像形式に変換されます。
画素の解像度が、8ビット以下の画像ファイルは、画像で使う色の値を説明する「パレット」を含んでいます。
pal が、ヌル(0)でないなら、パレットは、メモリの指定されたアドレスで始まる部分に、コピーされます。
そうでない場合、現在の描画画面がパレットを使っているなら、そのパレットは、画像ファイルと合致するものに、変えられます。
画像を保存するのに、「非BMP」の2つのファイル形式のうちの1つを使うと、画像ファイルは、ロードされている同じ描画画面モードで、
Bsave で作成されたものになります。
BMPファイル形式を使うと、この制限は適用されません。
Bload を使って、BMP ファイルをロードするときには、画像は、トゥルー・カラー(1画素あたり、15、16、24または32ビット)か、パレット化/索引化(8ビット以下)でなければなりません。
画像データは、現在の色の濃さに適切な、ピクセル形式に変換されます。ただし、トゥルー・カラーは、パレット化画像に減色することはできません。
Bload は、RLE 圧縮を使う BMPファイルをサポートしません。また、他の画像ファイルの種類(PNG、JPG、GIF...)も、サポートしません。
Bload は、可能な場合は、アルファ・チャンネル情報をロードします。対象は、
BITMAPV4HEADER または
BITMAPV5HEADERファイル・ヘッダーを持った、32ビットのBMPファイルです。
Bload が返すエラーコードは、次の行での
Err を使って確認できます。
Bload の関数バージョンは、32ビット
Long のエラーコードを、直接返します。
ランタイム・エラー:
(1) 不法な関数呼び出し
- dest は、指定されなかったか、ヌル(0)でした。そして、描画画面は全く設定されませんでした。
-
Bitmap は、サポートされないBMPファイル圧縮タイプ(BI_RLE4, BI_RLE8)を、使っています。
-
Bitmap は、トゥルー・カラー(1画素あたり、16ビットか24ビットか32ビット)です。現在の描画画面は、パレット(1画素あたり、8ビット以下)を使っています。
(2)ファイルが見つからない
- filename を見つけることができませんでした。
(3)ファイル入出力誤り
- ファイルには、サポートしているいずれの形式もありません。
- 一般的な読み込みエラーが、発生しました。
-
注意:
画像バッファに、BMPファイルをロードするために BLoad を使うとき、画像の原寸は変えられません。
画像バッファを、BMPファイルと同じ寸法にしたい場合は、あらかじめ寸法を見つけて、自分で、正しいサイズの画像を作成しなければなりません。
このやり方については、以下の例 を参照下さい。
例:
注:FreeBASIC 1.08〜 で、SetEnviron を追加しなくても、日本語環境で描画画面が表示されるように改善されました。
' Sets the graphics method GDI
' 描画方法を GDI に設定
SetEnviron("fbgfx=GDI")
'現在作業中のページに、画像をロードします
Screen 18,
32
Cls
BLoad "picture.bmp"
Sleep
' Sets the graphics method GDI
' 描画方法を GDI に設定
SetEnviron("fbgfx=GDI")
'48 ×48 ビットマップを、画像にロードします
ScreenRes 320,
200,
32
Dim myImage
As Any Ptr =
ImageCreate( 48,
48 )
BLoad "picture.bmp", myImage
Put (10,
10), myImage
ImageDestroy( myImage
)
Sleep
' Sets the graphics method GDI
' 描画方法を GDI に設定
SetEnviron("fbgfx=GDI")
ScreenRes 640,
480,
8 '' 8-bit パレット描画モード
Dim pal
(0 To 256-
1) As Integer '' 256 色を使える、32ビットの整数配列
'' ビットマップを画面にロードして、パレットを pal() 配列に置きます
BLoad "picture.bmp", , @pal
(0)
WindowTitle "Old palette"
Sleep
'' 新しいパレットを pal() 配列から設定
Palette Using pal
(0)
WindowTitle "New palette"
Sleep
' Sets the graphics method GDI
' 描画方法を GDI に設定
SetEnviron("fbgfx=GDI")
'' 画像バッファーを、BMP 画像と同じ寸法で作成して、
'' そこにファイルをロードする関数。
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
'' 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 failed"
Else
Put (10,
10), img
ImageDestroy( img
)
End If
Sleep
QBからの違い:
- BMPファイルをロードできるのは、FreeBASIC の新しい機能です。
- BMPファイルからパレットを検索できるのは、FreeBASIC の新しい機能です。
- FreeBASIC は、内部的に QBASIC と異なったファイル形式を使用します。64 KiB の限界がありません。これは、QBASIC ではサポートされません。
参照: