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
расположение в памяти для загрузки изображения, или null (0) для копирования изображения на текущую рабочую страницу графического экрана
pal
ячейка памяти для загрузки палитры, или нуль (0), чтобы изменить текущую палитру графического экрана, если он использует ее

Возвращаемое значение

Возвращает нуль (0) в случае успеха, или ненулевой код ошибки для обозначения сбоя. (выдает ошибку времени выполнения)

Описание

BLoad может использоваться для загрузки данных изображения или любых других данных из файла, созданного с помощью BSave, и сохранить эти данные в массив, или нарисовать их в окно. Если dest отсутствует или имеет значение null (0), данные изображения копируется в текущую рабочую страницу графического экрана. В противном случае данные будут загружены как данные изображения по адресу, указанному в dest.

BLoad может загрузить 3 различных типа файлов:
    • Старые QB-подобные данные файла, сохраненные с помощью BSAVE из кода QB, содержащие "raw" данные , которым предшествует 7-байтовый заголовок, начинающий с &HFD, до 64 КБ в размере
    • Новые FB-подобные данные файла, сохраненные с помощью BSave из кода FB, содержащие "raw" данные , которым предшествует 5-байтовый заголовок, начинающий с &HFE. Нет 64 КБ предела с этим форматом
    • BMP файлы изображений, поддерживающие подмножество действительных ("Windows") .BMP файлов, начинающиеся с "BM", сохраненные из FB кода с помощью BSave, или созданные\сохраненные в совместимом формате с помощью графического редактора / конвертера.
QB-подобные данные и файлы BMP преобразуются в FB-совместимый формат изображения при открытии.

8-битовые файлы изображений или ниже содержат палитру, которая описывает значения цвета, используемое в изображениях. Если pal не нуль (0), палитра копируется в память, начиная с указанного адреса. В противном случае если текущий графический экран использует палитру , тогда его палитра заменяется на палитру из файла изображения.

При использовании одного из 2 "не-BMP" форматов файлов для сохраненнных изображений, файлы изображения должны быть созданы с помощью BSave в том же режиме графического экрана как она загружена. При использовании формата файла BMP, это ограничение не применяется.

При загрузке файла BMP с помощью BLoad, изображения должны быть полноцветными (15-, 16-, 24- или 32-бит на пиксель ) или палитризованные / индексируемые (8-бит или ниже). Данные изображения будут преобразованы в необходимый формат пикселя для текущей глубины цвета, за исключением того, что полноцветные не могут быть преобразованы в палитризованные изображения. BLoad не поддерживает файлы BMP с помощью сжатия RLE или другой тип файла изображения (PNG, JPG, GIF, ...). BLoad загрузит данные альфа-канала, если таковые имеются из 32-битного BMP файла с BITMAPV4HEADER или BITMAPV5HEADER файловым заголовком.

Runtime ошибки:
BLoad создает одну из следующих runtime ошибок:

(1) Illegal function call
    • dest не был указан или null (0), и графический экран не был установлен.
    • Растровое изображение использует неподдерживаемый тип сжатия файла BMP (BI_RLE4, BI_RLE8)
    • Растровое изображение является полноцветным (16, 24, или 32 бит на пиксель) , а текущий графический экран использует палитру (8 бит на пиксель или ниже).
(2) File not found
    • Файл filename не может быть найден.
(3) File I/O error
    • Файл не имеет любой из поддерживаемых типов
    • Произошла общая ошибка чтения.

Примечание: При использовании BLoad для загрузки файла BMP в буфер изображения, оригинальные размеры изображения не изменяются. Если вы хотите иметь буфер изображения с такими же размерами, что и файл BMP, вы должны заранее подобрать размеры, и создать изображение нужного размера самостоятельно. Смотрите ниже пример как это сделать.

Пример

'Загрузить графический объект на текущую рабочую страницу
Screen 18, 32
Cls
BLoad "picture.bmp"
Sleep


'Загрузить изображение растрового изображения 48 x 48
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 "Old palette"
Sleep

'' Установка новой палитры из массива pal()
Palette Using pal(0)

WindowTitle "New palette"
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 failed"

Else

    Put (10, 10), img

    ImageDestroy( img )

End If

Sleep

Отличия от QB

  • Поддержка загрузки файлов BMP является новой для FreeBASIC.
  • Поддержка получения палитры из BMP-файлов является новой для FreeBASIC.
  • FreeBASIC использует другой формат файла, который не имеет предела 64 КБ,  в отличие от внутреннего формата QBASIC.

См. также