Загрузка картинки из файла - QBasic
Формулировка задачи:
Доброго времени суток!
Вчера начал делать на qbasic'e простенькую игрушку, но у меня возникла небольшая проблема. Я просто замучался рисовать картинки с помощью стандартных операторов. Можно ли как-то нарисовать их сначала в paint'e, а потом загружать в моей игре? Краем уха слышал о GET и PUT, но так и не понял, как их использовать. Буду очень благодарен тому, кто доходчиво объяснит!
Проблема все еще актуальна.
Вот нашел тут у вас на форуме такой код(чуть-чуть подкорректировал, подставив имя своей картинки):
Все бы хорошо, но на 5-ой строке qbasic выдает ошибку "Input past end of file" - что это значит?
Плюс еще в 10-ой строке какой-то непонятный для меня рассчет. Код не мой, т.е. я не знаю вообще подходит ли эта строка в моем случае.
Объясните, пожалуйста.
Решение задачи: «Загрузка картинки из файла»
textual
Листинг программы
' Структуры данных для *.BMP* TYPE BMFile BmID AS INTEGER FileSize AS LONG Reserved AS LONG BmOFFSET AS LONG END TYPE TYPE BMHead HeadSize AS LONG BmpSizeX AS LONG BmpSizeY AS LONG BmSlices AS INTEGER BitDepth AS INTEGER Compress AS LONG DataSize AS LONG BmHorRes AS LONG BmVerRes AS LONG UseColor AS LONG SingColr AS LONG END TYPE ' Заголовки DIM FHead AS BMFile, BMPHead AS BMHead ' Тех. переменные DIM FrF AS INTEGER, FilePL AS LONG, i AS INTEGER DIM Plus AS LONG, xp AS LONG, yp AS LONG, Adr AS LONG DIM R AS INTEGER, G AS INTEGER, B AS INTEGER DIM SHARED Ld AS STRING * 1, OffLd AS LONG BmName$ = "C:\img" SCREEN 12 ' Загрузка FrF = FREEFILE ' Своб. файл OPEN "B", #FrF, BmName$ + ".BMP" ' Откроем *.BMP GET #FrF, , FHead: GET #FrF, , BMPHead ' Загрузим заголовки IF BMPHead.BitDepth = 8 THEN ' Если 256 цветов - то откроем FOR i = 0 TO 2 ^ BMPHead.BitDepth ' Читаем палитру GET #FrF, , FilePL R = ((FilePL AND &HFF0000) \ 262144) AND 63 G = ((FilePL AND &HFF00) \ 1024) AND 63 B = ((FilePL AND &HFF) \ 4) AND 63 IF i < 16 THEN OUT 968, i: OUT 969, R: OUT 969, G: OUT 969, B END IF NEXT SEEK #FrF, FHead.BmOFFSET ' На начало данных картинки DEF SEG = VARSEG(Ld): OffLd = VARPTR(Ld) ' Сегмент&смещение ячейки загрузки Plus = -BMPHead.BmpSizeX AND 3 ' Хинт(оптимизация) FOR yp = 0 TO BMPHead.BmpSizeY - 1 ' Адрес пикселя Adr = (BMPHead.BmpSizeY - yp - 1) * (BMPHead.BmpSizeX + Plus) Adr = Adr + FHead.BmOFFSET + 1 ' Внутренний цикл FOR xp = 0 TO BMPHead.BmpSizeX - 1 GET #FrF, Adr + xp, Ld ' Загрузка 1-го байта PSET (xp, yp), PEEK(OffLd) ' Вывод пикселя NEXT xp IF INKEY$ <> "" THEN END ' Прерывание вывода по клавише NEXT yp DEF SEG END IF CLOSE FrF
Объяснение кода листинга программы
QBasic код загружает изображение из файла BMP. Вот список действий, которые выполняются в коде:
- Объявление переменных и структур данных для работы с файлом BMP.
- Указание пути к файлу BMP.
- Открытие файла BMP с помощью функции OPEN.
- Загрузка заголовков файла BMP в соответствующие переменные с помощью функции GET.
- Проверка глубины цвета изображения (BitDepth). Если она равна 8, то выполняется следующий блок кода.
- Чтение палитры изображения с помощью цикла FOR и функции GET.
- Вывод палитры на экран с помощью функции OUT.
- Переход к началу данных изображения с помощью функции SEEK.
- Определение сегмента и смещения ячейки загрузки с помощью функции VARSEG и VARPTR.
- Вычисление значения переменной Plus для оптимизации работы с четным размером изображения.
- Внутренний цикл обработки каждого пикселя изображения с помощью двух вложенных циклов FOR.
- Загрузка каждого байта изображения с помощью функции GET и обработка его с помощью функции PSET.
- Проверка нажатия клавиши с помощью функции INKEY$. Если клавиша нажата, то цикл прерывается.
- Закрытие файла BMP с помощью функции CLOSE. Значения переменных и структур данных, а также названия функций и инструкций, указаны в коде.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д