Важная информация
Показано с 1 по 3 из 3

Тема: Пара вопросов (загрузка изображений)

  1. #1 Пара вопросов (загрузка изображений) 
    Супер модератор Аватар для Kakos_nonos
    Регистрация
    07.01.2011
    Адрес
    Кубань
    Сообщений
    1,535
    Сказал(а) спасибо
    126
    Поблагодарили 432 раз(а) в 293 сообщениях
    Записей в блоге
    6
    Хочу брата бейсику научить, выбрал FreeBasic.
    Появилась пара вопросов: Какой в FB наиболее простой метод загрузки картинок (из BMP или PNG). Чтоб можно было их загружать и выводить на экран в любом месте (и стирать). Можно ли это при синтаксисе QB?
    [Ссылки могут видеть только зарегистрированные пользователи. ]
    Ответить с цитированием  
     

  2. #2  
    Профи Аватар для stabud
    Регистрация
    05.01.2013
    Сообщений
    780
    Сказал(а) спасибо
    325
    Поблагодарили 346 раз(а) в 273 сообщениях
    Записей в блоге
    6
    Kakos_nonos! Че то я раньше и не видел этой темы. Больше месяца прошло, возможно уже не актуально. Но все равно отвечу, может другим пригодится.

    BMP поддерживается нативно. Там загрузка и сохранение изображения довольно просты с помощью BLOAD\BSAVE, вывод фоток с помощью PUT , получение любой части изображения с помощью GET, в общем все почти так же как в QB. PNG использовать несложно с помощью сторонних либ FbPng, LibPng и пр. Примеры есть и они понятны и просты даже для начинающего. А потом если будут вопросы, поможем чем сможем
    Ответить с цитированием  
     

  3. #3  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,919
    Сказал(а) спасибо
    1,842
    Поблагодарили 980 раз(а) в 838 сообщениях
    Записей в блоге
    1
    Kakos_nonos! Че то я раньше и не видел этой темы.
    Я тоже не видел(!!!), грёбаная реклама, чёб мы кокосу не подсобили, если бы увидели. Вообще бред.
    Kakos_nonos, ты уж извини, реально не понял как мог прозевать тему, вроде часто захожу читаю всё. Мистика...

    выбрал FreeBasic.
    Лучшее из бесплатных бейсиков на сегодня. Советую скачать сборку Стаса, круче ничего пока не видел, да и нету.
    Там редактор и компиль в одном флаконе, сам юзаю.

    Какой в FB наиболее простой метод загрузки картинок (из BMP или PNG).
    Самый простой BLOAD-ом из BMP. Причём BMP-шки можно как 8,16,24- битные, так и 32-битные с альфой(что очень круто).
    BLOAD универсален, там хороший встроенный загрузчик BMP, хавает почти всё.
    Прозрачность работает только в режиме экрана 24 и 32 бит.

    Сам например делаю следующим образом.

    1) Пишу директиву
    '$Lang: "FBLite"


    Она переводит код в диалект а ля QBasic\QuickBasic, т.е. это означает необязательное декларирование переменных
    и массивов. Однако мы таким макаром немного кастрируем диалект, т.е. нельзя юзать пространства имён и ещё ряд
    фич. Но взамен получаем немного больше удобства, строковые переменные можно писать с постфикс знаком $ ну и
    соотв. интеджер %, сингл !, дабл #, лонг &, всё как в QB.

    Можно не писать директиву, тогда декларируем всё жёстко до каждой переменной. По словам некоторых крутых
    программистов без этого режима не написать программу объём которой измеряется человекогодами. Не разделяю
    это т.к. без мозга в любом случае её не написать, а с мозгом - всё контролится в FBLite или без оного. Но моими мыслями
    можно пренебречь, т.к. не программист.

    Экран открываем так:

    SCREENRES Разрешение по X, Разрешение по Y, Битность, Кол-во страниц, Флаги


    Изображение грузим так:

    DIM MyImage AS BYTE POINTER
    MyImage = IMAGECREATE (65, 65, 0, 32) ' Размер X, Размер Y, цвет, битность
    BLOAD "Picture.bmp", MyImage ' Загрузим изображение (Курсор)

    Выводим с альфой так:
    PUT (x, y), MyImage, ALPHA

    Без альфы(побыстрее работает) так:
    PUT (x, y), MyImage, PSET

    Не забываем отображать или копировать страницы (FLIP или PCOPY) чтобы видеть результат если экранных
    буферов больше одного.

    Вот простая прога которая грузит и выводит курсор(в архиве есть):
    Код freebasic:
    '$Lang: "FBLite"
         '    Наше разрешение
    ScrXRez = 1024
    ScrYRez = 768
    FullSCR = 0   '  0 - окно,  1 - полноэкранный
     
         '    Установим экран
    SCREENRES ScrXRez, ScrYRez, 32, 2, FullSCR
     
         '    Рабочая страница, видимая страница
    SCREENSET 1, 0
     
         '    Заголовок окна
    WINDOWTITLE "Простая прога"
     
         '    Поинтер(указатель) на спец структуру(хедер изображения в памяти)
         '    Нужен для обращения к изображению
         '    По факту это стандартный 4-х байтовый указатель доступный к
         '    позиционированию побайтно, если написать INTEGER POINTER, то
         '    позиционироваться такой указатель будет по 4 байта, то есть
         '    штука MyImage = MyImage + 1 даст передвижку указателя на 4 байта
    DIM  MyImage  AS  BYTE POINTER
     
         '    Выделим память под изображение (только после установки режима экрана!!!)
    MyImage = IMAGECREATE (67, 65, 0, 32)   '  Размер X, Размер Y, цвет, битность
     
         '    Загрузим изображение (Курсор)
    BLOAD "Cur.bmp", MyImage
     
     
         '  Гасим мышь, запираем в окно
    SetMouse  , , 0, 1    '  3-й - погасить ли мышку на окне, 4-й - запереть ли мышь в окне
     
    DO   '    Цикл
        CLS
        GetMouse Mx, My   '  Берём координаты мышки
     
        PUT (Mx, My), MyImage, ALPHA   '  Рисуем загруженный курсор
     
        PCOPY        '  Копируем рабочую страницу на видимую 
        SLEEP 5, 1   '  5 миллисекунд отдаём другим прогам, 1 означает - нельзя прервать
                     '  этот процесс нажатием клавиши на клавиатуре
    LOOP UNTIL MULTIKEY(1)  '  Выход по ESC

    Для себя также сделал функцию, которая грузит BMP-хи элегантнее, сначала смотрит какой размер, потом
    отводит память и после этого уже загружает.

    Упрощённая функция загрузки BMP
    Код freebasic:
    FUNCTION LoadBMP (BmName AS STRING) AS ANY POINTER
    DIM NewIMG AS ANY POINTER, BmID AS SHORT
    DIM AS INTEGER NewIMG_XRez, NewIMG_YRez
    DIM SvBMF AS INTEGER
    SvBMF = FREEFILE
    IF NOT OPEN(BmName, FOR BINARY, ACCESS READ, AS #SvBMF) THEN
        GET #SvBMF, , BmID
        IF BmID = 19778 THEN
            GET #SvBMF, 19, NewIMG_XRez
            GET #SvBMF, , NewIMG_YRez
            IF NewIMG_XRez > 0 AND NewIMG_YRez > 0 THEN
               NewIMG = ImageCreate(NewIMG_XRez, NewIMG_YRez, , 32)
               BLOAD BmName, NewIMG
               LoadBMP = NewIMG
            END IF
        END IF
    CLOSE #SvBMF
    END IF
    END FUNCTION


    Т.е. общий код станет таким:
    Новый код
    Код freebasic:
    '$Lang: "FBLite"
     
    DECLARE FUNCTION LoadBMP (BmName AS STRING) AS ANY POINTER
     
         '    Наше разрешение
    ScrXRez = 1024
    ScrYRez = 768
    FullSCR = 0
     
         '    Установим экран
    SCREENRES ScrXRez, ScrYRez, 24, 2, FullSCR
     
         '    Рабочая страница, видимая страница
    SCREENSET 1, 0
     
         '    Заголовок окна
    WINDOWTITLE "Простая прога"
     
         '    Поинтер(указатель) на спец структуру(хедер изображения в памяти)
         '    Нужен для обращения к изображению
         '    По факту это стандартный 4-х байтовый указатель доступный к
         '    позиционированию побайтно, если написать INTEGER POINTER, то
         '    позиционироваться такой указатель будет по 4 байта, то есть
         '    штука MyImage = MyImage + 1 даст передвижку указателя на 4 байта
    DIM  MyImage  AS  BYTE POINTER
     
         '    Загрузить *.BMP (только после установки режима экрана!!!)
    MyImage = LoadBMP("Cur.bmp")
     
         '  Гасим мышь, запираем в окно
    SetMouse  , , 0, 1    '  3-й - погасить ли мышку на окне, 4-й - запереть ли мышь в окне
     
    DO   '    Цикл
        CLS
        GetMouse Mx, My   '  Берём координаты мышки
     
        PUT (Mx, My), MyImage, ALPHA   '  Рисуем загруженный курсор
     
        PCOPY        '  Копируем рабочую страницу на видимую 
        SLEEP 5, 1   '  5 миллисекунд отдаём другим прогам, 1 означает - нельзя прервать
                     '  этот процесс нажатием клавиши на клавиатуре
    LOOP UNTIL MULTIKEY(1)  '  Выход по ESC
     
    '  Простая функция загрузки изображений
     
    FUNCTION LoadBMP (BmName AS STRING) AS ANY POINTER
    DIM NewIMG AS ANY POINTER, BmID AS SHORT
    DIM AS INTEGER NewIMG_XRez, NewIMG_YRez
    DIM SvBMF AS INTEGER
    SvBMF = FREEFILE
    IF NOT OPEN(BmName, FOR BINARY, ACCESS READ, AS #SvBMF) THEN
        GET #SvBMF, , BmID
        IF BmID = 19778 THEN
            GET #SvBMF, 19, NewIMG_XRez
            GET #SvBMF, , NewIMG_YRez
            IF NewIMG_XRez > 0 AND NewIMG_YRez > 0 THEN
               NewIMG = ImageCreate(NewIMG_XRez, NewIMG_YRez, , 32)
               BLOAD BmName, NewIMG
               LoadBMP = NewIMG
            END IF
        END IF
    CLOSE #SvBMF
    END IF
    END FUNCTION
    Вложения
    • Тип файла: zip Cur.zip (2.4 Кб, Просмотров: 2)
    Последний раз редактировалось >Quiet Snow<; 20.03.2014 в 03:57.
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

Информация о теме
Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Загрузка DLL из памяти
    от stabud в разделе FreeBasic
    Ответов: 1
    Последнее сообщение: 05.01.2013, 12:57
  2. Ответов: 3
    Последнее сообщение: 15.06.2012, 20:29
  3. Загрузка PCXfile
    от Павел в разделе C/C++
    Ответов: 2
    Последнее сообщение: 01.04.2012, 14:53
  4. Пара вопросов по книге
    от Kakos_nonos в разделе Степлер
    Ответов: 26
    Последнее сообщение: 20.12.2011, 02:04
  5. Масштабирование изображений
    от triimeni в разделе Visual Basic
    Ответов: 3
    Последнее сообщение: 08.12.2011, 01:17
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •