Загрузка картинки из файла - QBasic
Формулировка задачи:
Доброго времени суток!
Вчера начал делать на qbasic'e простенькую игрушку, но у меня возникла небольшая проблема. Я просто замучался рисовать картинки с помощью стандартных операторов. Можно ли как-то нарисовать их сначала в paint'e, а потом загружать в моей игре? Краем уха слышал о GET и PUT, но так и не понял, как их использовать. Буду очень благодарен тому, кто доходчиво объяснит!
Все бы хорошо, но на 5-ой строке qbasic выдает ошибку "Input past end of file" - что это значит?
Плюс еще в 10-ой строке какой-то непонятный для меня рассчет. Код не мой, т.е. я не знаю вообще подходит ли эта строка в моем случае.
Объясните, пожалуйста.
Проблема все еще актуальна.
Вот нашел тут у вас на форуме такой код(чуть-чуть подкорректировал, подставив имя своей картинки):
Листинг программы
- SCREEN 12
- OPEN "img.bmp" FOR INPUT AS #1
- FOR x = 1 TO 10
- FOR y = 1 TO 10
- INPUT #1, col
- PSET (x, y), col
- NEXT y
- NEXT x
- CLOSE #1
- BYTES = INT((55 * 2 + 7) / 8) * 60
- DIM img(BYTES)
- GET (1, 1)-(10, 10), img
- CLS
Решение задачи: «Загрузка картинки из файла»
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. Значения переменных и структур данных, а также названия функций и инструкций, указаны в коде.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д