Загрузка картинки из файла - 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. Вот список действий, которые выполняются в коде:

  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
Похожие ответы