Загрузка картинки из файла - QBasic

Узнай цену своей работы

Формулировка задачи:

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

Решение задачи: «Загрузка картинки из файла»

textual
Листинг программы
  1.    ' Структуры данных для *.BMP*
  2. TYPE BMFile
  3.    BmID AS INTEGER
  4.    FileSize AS LONG
  5.    Reserved AS LONG
  6.    BmOFFSET AS LONG
  7. END TYPE
  8. TYPE BMHead
  9.    HeadSize AS LONG
  10.    BmpSizeX AS LONG
  11.    BmpSizeY AS LONG
  12.    BmSlices AS INTEGER
  13.    BitDepth AS INTEGER
  14.    Compress AS LONG
  15.    DataSize AS LONG
  16.    BmHorRes AS LONG
  17.    BmVerRes AS LONG
  18.    UseColor AS LONG
  19.    SingColr AS LONG
  20. END TYPE
  21.  
  22.    '  Заголовки
  23.  DIM FHead AS BMFile, BMPHead AS BMHead
  24.    '  Тех. переменные
  25.  DIM FrF AS INTEGER, FilePL AS LONG, i AS INTEGER
  26.  DIM Plus AS LONG, xp AS LONG, yp AS LONG, Adr AS LONG
  27.  DIM R AS INTEGER, G AS INTEGER, B AS INTEGER
  28.  DIM SHARED Ld AS STRING * 1, OffLd AS LONG
  29.  
  30.     BmName$ = "C:\img"
  31.     SCREEN 12
  32.  
  33.    '  Загрузка
  34.  FrF = FREEFILE                                      '  Своб. файл
  35.  OPEN "B", #FrF, BmName$ + ".BMP"                    '  Откроем *.BMP
  36.      GET #FrF, , FHead: GET #FrF, , BMPHead          '  Загрузим заголовки
  37.         IF BMPHead.BitDepth = 8 THEN                 '  Если 256 цветов - то откроем
  38.           FOR i = 0 TO 2 ^ BMPHead.BitDepth          '  Читаем палитру
  39.             GET #FrF, , FilePL
  40.             R = ((FilePL AND &HFF0000) \ 262144) AND 63
  41.             G = ((FilePL AND &HFF00) \ 1024) AND 63
  42.             B = ((FilePL AND &HFF) \ 4) AND 63
  43.             IF i < 16 THEN
  44.               OUT 968, i: OUT 969, R: OUT 969, G: OUT 969, B
  45.             END IF
  46.           NEXT
  47.           SEEK #FrF, FHead.BmOFFSET                  '  На начало данных картинки
  48.           DEF SEG = VARSEG(Ld): OffLd = VARPTR(Ld)   '  Сегмент&смещение ячейки загрузки
  49.             Plus = -BMPHead.BmpSizeX AND 3           '  Хинт(оптимизация)
  50.             FOR yp = 0 TO BMPHead.BmpSizeY - 1
  51.                '  Адрес пикселя
  52.                Adr = (BMPHead.BmpSizeY - yp - 1) * (BMPHead.BmpSizeX + Plus)
  53.                Adr = Adr + FHead.BmOFFSET + 1
  54.                '  Внутренний цикл
  55.                FOR xp = 0 TO BMPHead.BmpSizeX - 1
  56.                   GET #FrF, Adr + xp, Ld             '  Загрузка 1-го байта
  57.                   PSET (xp, yp), PEEK(OffLd)         '  Вывод пикселя
  58.                NEXT xp
  59.                IF INKEY$ <> "" THEN END              '  Прерывание вывода по клавише
  60.             NEXT yp
  61.           DEF SEG
  62.         END IF
  63.  CLOSE FrF

Объяснение кода листинга программы

QBasic код загружает изображение из файла BMP. Вот список действий, которые выполняются в коде:

  1. Объявление переменных и структур данных для работы с файлом BMP.
  2. Указание пути к файлу BMP.
  3. Открытие файла BMP с помощью функции OPEN.
  4. Загрузка заголовков файла BMP в соответствующие переменные с помощью функции GET.
  5. Проверка глубины цвета изображения (BitDepth). Если она равна 8, то выполняется следующий блок кода.
  6. Чтение палитры изображения с помощью цикла FOR и функции GET.
  7. Вывод палитры на экран с помощью функции OUT.
  8. Переход к началу данных изображения с помощью функции SEEK.
  9. Определение сегмента и смещения ячейки загрузки с помощью функции VARSEG и VARPTR.
  10. Вычисление значения переменной Plus для оптимизации работы с четным размером изображения.
  11. Внутренний цикл обработки каждого пикселя изображения с помощью двух вложенных циклов FOR.
  12. Загрузка каждого байта изображения с помощью функции GET и обработка его с помощью функции PSET.
  13. Проверка нажатия клавиши с помощью функции INKEY$. Если клавиша нажата, то цикл прерывается.
  14. Закрытие файла BMP с помощью функции CLOSE. Значения переменных и структур данных, а также названия функций и инструкций, указаны в коде.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.786 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы