Четверг, 23 ноября 2017, 23:26

Приветствую Вас Гость

Меню сайта
Категории каталога
Создание игр [306]
Статьи об общих понятиях связанных с созданием игр.
Программирование [69]
Гайды по программированию на разных ЯП.
Движки и Гейммейкеры [123]
Статьи о программах для создания игр, уроки и описания.
Софт [27]
Различные программы, в том числе в помощь игроделам.
2D-графика [11]
Уроки по рисованию, растр, пиксель-арт, создание спрайтов и пр.
3D-графика [10]
Уроки по моделированию, ландшафт, модели, текстурирование и пр.
Моддинг игр [4]
Модификация компьютерных игр, создание дополнений, перевод, хакинг.
Игры [70]
Статьи об играх, в том числе и сделанных на гейммейкерах.
Разное [56]
Статьи, которые не вошли в определённые разделы.
Наш опрос
На какие из этих игровые системы вы разрабатываете игры?
Всего ответов: 1419
Главная » Статьи » Создание игр

Основы PyGame. Загрузка, сохранение и обработка изображений
Основы PyGame. Загрузка, сохранение и обработка изображений в PyGame.
Доброго времени суток, уважаемые участники ресурса GcUp!
Сегодня мы с вами рассмотрим загрузку изображений с файла и сохранение в файл, а также простые методы обработки изображений.

Перед изучением статьи читатель должен знать следующие вещи:

  • Знание синтаксиса и семантики языка Python ветки 2.х. (Если знаете С/С++, Java, PHP и т.д но не знаете Python то лучше не начинать изучать эти статьи, это разные языки и ничего общего у Python’a с ними нет).
  • Знание основ работы в IDLE(Python GUI) или умение запускать и редактировать программы на языке Python в других средах разработки.
  • Знание основных типов данных языка Python ветки 2.х. (числа, строки, последовательности/списки, словари, кортежи).
  • Умение работать в операционной системе Windows.

    Логически эта статья будет разделена на следующие части:

  • Краткий обзор методов модуля pygame.image.
  • Использование модуля pygame.image на практике.
  • Заключение.
    На этом все, приступим к изучению библиотеки PyGame.

    Часть первая. Краткий обзор методов модуля pygame.image.

    В PyGame есть модуль pygame.image, который содержит в себе методы для загрузки/сохранения/обработки изображений, а также передачи изображений другим пакетам. Модуль не очень большой и имеет всего шесть методов. Вот полный список методов и их короткое описание к ним:

  • pygame.image.load - загружать изображение из файла
  • pygame.image.save - сохраняет изображение на диск
  • pygame.image.get_extended – Показывает возможность загрузки изображений из файла
  • pygame.image.tostring – Конвертирует изображение в строку
  • pygame.image.fromstring – Создает изображение из строки
  • pygame.image.frombuffer – Создает изображение из строки, но делает это быстрее чем pygame.image.fromstring

    Самого класса Image в PyGame нет, для изображений используется класс Surface. В предыдущих статьях мы с вами уже использовали класс Surface. Про класс Surface мы с вами поговорим в следующих статьях. А сейчас разберем то что может делать модуль pygame.image. Модуль pygame.image может загружать следующие типы форматов изображений:

  • JPG
  • PNG
  • GIF (без анимации)
  • BMP
  • PCX
  • TGA (без компресии)
  • TIF
  • LBM (PBM)
  • PBM (PGM, PPM)
  • XPM
    Также pygame.image может сохранять изображения в следующие форматы:
  • BMP
  • TGA
  • PNG
  • JPEG
    Форматы PNG и JPEG доступны для сохранения начиная с версии PyGame 1.8. Мы же с вами пользуемся версией 1.9.1, так что переживать незачем.
    Ну а теперь давайте разберем все методы модуля pygame.image на маленьком примере.

    Часть вторая. Использование модуля pygame.image на практике.

    Давайте для начала подготовим файл, в котором будем писать программу. Открываем написанный нами раньше шаблон “pygame_template.py”, сохраняем теперь его под именем “pygame_image.py” и изменяем заголовок окна на “Image Loading”. Теперь нам понадобится вот этот архив, в нем есть папка “images”, в которой хранится восемь изображений различных форматов (это набор графических изображений различных форматов поддерживаемых pygame, которых я смог собрать, используя графический редактор GIMP). Распакуйте архив и папку “images” переместите в папку, где находится файл “pygame_image.py”. Ну вот, теперь все, все приготовления готовы и мы можем начинать писать код.
    Первый метод ,который мы рассмотрим, это метод pygame.image.get_extended(): return bool, этот метод определяет возможность загружать изображения различных форматов, по умолчанию pygame.image поддерживает только загрузку несжатых BMP изображений. Но этот параметр можно изменить, если во время сборки pygame передать флаги дополнительных графических форматов. По сути метод pygame.image.get_extended определяет собран pygame с расширенными форматами изображений или нет. Давайте теперь проверим, собран наш pygame с расширенными форматами и ли нет, если собран - то выведем соответствующее сообщение, иначе – закроем программу. Для этого в блоке инициализации данных пишем следующий код:

    Code
    if pygame.image.get_extended():
      print 'My pygame the best'
    else:
      raise SystemExit, 'Sorry, extended image module required'

    Если у нас установлена версия PyGame которая не поддерживает дополнительных графических форматов то приложение закроется и выведет соответствующее сообщение.
    Ну а теперь пришло время для загрузки изображений, которые хранятся в файлах, для этого есть метод pygame.image.load(filename): return Surface, где filename – путь к файлу, Surface – возвращаемое изображение. Как видно метод pygame.image.load возвращает объект класса Surface, надеюсь на то, что вы уже поняли, что за изображения в PyGame отвечает класс Surface. Указывать путь к файлу рекомендуется через метод os.path.join, но для этого придется импортировать модуль “os”.
    Давай загрузим все изображений, которые хранятся в папке “images”, для этого определим восемь переменных, в которые загрузим соответствующие изображений. Так что в блоки инициализации добавляем следующий код:
    Code
    image1 = pygame.image.load(os.path.join('images','img1.jpg'))
    image2 = pygame.image.load(os.path.join('images','img2.png'))
    image3 = pygame.image.load(os.path.join('images','img3.gif'))
    image4 = pygame.image.load(os.path.join('images','img4.bmp'))
    image5 = pygame.image.load(os.path.join('images','img5.pcx'))
    image6 = pygame.image.load(os.path.join('images','img6.tga'))
    image7 = pygame.image.load(os.path.join('images','img7.tif'))
    image8 = pygame.image.load(os.path.join('images','img8.png'))

    Можно сейчас запустить программу на выполнение, но мы ничего не увидим, так как мы не отображаем загруженные изображения. Давайте отобразим эти изображений. Самый простой способ – нарисовать эти изображения на другом изображении. Мы так и поступим. Но для этого нам понадобится изображение. Сейчас мы создадим изображение с размером как у главного окна. Как я уже говорил – изображения это объекты класса Surface. Используя конструктор pygame.Surface((width, height)), где width – высота изображения, height – ширина, создадим пустое изображение, для этого в блок инициализации дописываем следующий код:
    Code
    newSurf = pygame.Surface((windows_width, windows_height))

    Теперь пришло время нарисовать все восемь изображений на только что созданном изображении, для этого будем использовать метод Surface.blit(source, dest), где source – изображение которое хотим нарисовать, dest – координаты от куда начитаем рисовать. Так что в блок инициализации пишем код рисования всех загруженных изображений на созданном выше изображении:
    Code
    newSurf.blit(image1, (0,0))
    newSurf.blit(image2, (128,0))
    newSurf.blit(image3, (256,0))
    newSurf.blit(image4, (384,0))
    newSurf.blit(image5, (0,128))
    newSurf.blit(image6, (128,128))
    newSurf.blit(image7, (256,128))
    newSurf.blit(image8, (384,128))

    Сейчас мы также можем проверить метод сохраняющий изображения на диск, это метод pygame.image.save(Surface, filename): return None, где Surface – изображение которое требуется сохранить, filename – путь, куда требуется сохранить изображение. Давайте сохраним изображение “newSurf” в файл. Для этого пишем следующий код в блок инициализации:
    Code
    pygame.image.save(newSurf,os.path.join('images','save_image_1.BMP'))
    print "save image_1"

    Как видно, мы сохраняем изображение в папку “images” под именем “save_image_1.BMP”, а также выводим сообщение.
    Ну а теперь осталось только нарисовать само изображение в кадре, для этого в блок формирования кадра пишем следующую строчку:
    Code
    screen.blit(newSurf, (0,0))

    Ну, вот и все, теперь можем запустить программу и посмотреть на то, что у нас получилось:

    Как видно все восемь изображений загружаются и отображаются в кадре, также если зайти в папку “images” то мы увидим там файл с изображением.
    Если посмотреть на список методов в модуле pygame.image, то можно понять что мы уже рассмотрели половину методов этого модуля. Теперь осталось рассмотреть методы, которые конвертируют изображения в строку и обратно. Вам может показаться, что эти методы вообще не нужны, многие могут сказать – зачем вообще конвертировать изображения в строки? На самом деле это одни из самых полезных методов. Многие графические библиотеки и библиотеки обработки изображений могут конвертировать изображения в строки и обратно. Например, есть какая-то очень мощная библиотека обработки изображений, которая содержит методы, которых нет в PyGame, мы можем загрузить изображение с помощью модуля pygame.image, преобразовать его в строку, передать эту строку другой библиотекb, там обработать изображение, потом конвертировать его с помощью методов той библиотеки в строку, создать изображение из строки в PyGame. Так мы можем использовать другие библиотеки, функционал которых больше чем у PyGame.
    Давайте на простом примере рассмотрим метод конвертирования изображения в строку. За это отвечает метод pygame.image.tostring(Surface, format): return string, где Surface – изображение которое надо конвертировать, format – формат изображения. Ну а сам метод возвращает строку. Формат – это строковое значение, вот полный список форматов:
  • P - 8bit формат
  • RGB - 24bit формат
  • RGBX - 32bit формат
  • RGBA - 32bit формат
  • ARGB - 32bit формат
  • RGBA_PREMULT - 32bit формат
  • ARGB_PREMULT - 32bit формат
    Теперь давайте конвертируем некоторые загруженные изображения в строку, и будем использовать разные форматы изображений. Например, давайте конвертируем первое изображение в формате “RGB”, восьмое в формате “RGB”, опять восьмое но только в формат “RGBA”, и шестое в формате “RGB”. Так что в блок инициализации данных пишем следующий код:
    Code
    stringImage0 = pygame.image.tostring(image1, 'RGB')
    stringImage1 = pygame.image.tostring(image8, 'RGB')
    stringImage2 = pygame.image.tostring(image8, 'RGBA')
    stringImage3 = pygame.image.tostring(image6, 'RGB')

    Можно попытаться вывести изображения через команду print, но вывод такой большой строки займет долгое время, и заберет нужные нам ресурсы.
    Теперь осталось рассмотреть два метода, которые конвертируют строку в изображения, первый метод это - pygame.image.fromstring(string, size, format): return Surface, где string –строка с изображением, size – размер нового изобраения, format – формат изображения. Ну а второй метод это pygame.image.frombuffer(string, size, format): return Surface, где string – строка, size – размер нового изображения, [b]format [/b]– формат изображения. Разницы как видно в этих методов нет, просто второй метод работает быстрее, вот их главное отличие. Давайте теперь создадим новые изображения из строк, которые мы получили выше. Просто в блок инициализации данных добавим следующий код:
    Code
    newImage0 = pygame.image.fromstring(stringImage0, (128,128), 'RGB')
    newImage1 = pygame.image.fromstring(stringImage1, (128,128), 'RGB')
    newImage2 = pygame.image.fromstring(stringImage2, (128,128), 'RGBA')
    newImage3 = pygame.image.frombuffer(stringImage3, (128,128), 'RGB')

    Теперь у нас есть четыре новых изображения, осталось нарисовать их на изображении newSurf, для этого просто добавим в блок инициализации следующий код:
    Code
    newSurf.blit(newImage0, (0,256))
    newSurf.blit(newImage1, (128,256))
    newSurf.blit(newImage2, (256,256))
    newSurf.blit(newImage3, (384,256))

    И на всякий случай добавим туда же код сохранения изображений в файл:
    Code
    pygame.image.save(newSurf,os.path.join('images','save_image_2.JPG'))
    print "save image_2"

    Вот и все, теперь запустим программу и посмотрим что получилось:

    В итоге файл “pygame_image.py” должен содержать следующий код:

    Как видно, конвертированные изображения рисуются согласно своему формату, например одно изображение было конвертировано с формата “RGBA” в формат “RGB”, и теперь оно не поддерживает прозрачность, также в папке “images” есть еще одно новое изображение.

    Часть третья. Заключение.

    В последнее время мне часто приходят письма на e-mail, в котором меня просят рассказать, как загружать изображения, которые хранятся в файлах, надеюсь на то, что я детально рассказал вам как это делается с помощью модуля pygame.image. В итоге в этой статье мы рассмотрели все методы модуля pygame.image. Научились загружать изображения, сохранять их в файл, преобразовывать изображения в строки и обратно. Ну а в следующей статье мы с вами рассмотрим курсор и мышь в PyGame и методы для управления этим устройством.
    Все всем пока, желаю удачи в геймдеве. Спасибо за внимание с вами был noTformaT.

    P.S.

    Если вы просто скопируете программный код с этой статьи то он, возможно, не запустится, связано это с тем, что табуляций и пробелы в Python имеют определенный смысл. Если это произошло, и программа зависла, то требуется перезагрузить терминал интерпретатора, открыв в терминале меню «Shell» и выбрав пункт «Restart Shell».

  • Категория: Создание игр | Добавил: noTformaT (28 марта 2011) | Автор: Карпенко Евгений
    Просмотров: 10896 | Комментарии: 2 | Рейтинг: 5.0/3 |
    Теги: Основы Pyame, Pygame, Загрузка в Pygame, Уроки по PyGame, noTformaT, Изображения в PyGame
    Дополнительные опции:
    Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:

    Игровые объявления и предложения:
    Если вас заинтересовал материал «Основы PyGame. Загрузка, сохранение и обработка изображений», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела. Предлагаются такие схожие материалы: Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.

    Всего комментариев: 2
    +0-
    2 caufman   (15 августа 2013 16:40)
    caufmanСерия крайне толковых уроков. Жаль умерла. Хотелось бы продолжения.

    +2-
    1 noTformaT   (28 марта 2011 19:08)
    noTformaTСтатья вышла немного раньше, чем надо было smile

    Добавлять комментарии могут только зарегистрированные пользователи.
    [ Регистрация | Вход ]
    Поиск по сайту
    10 случ. движков
  • GameBryo
  • EasyRPG
  • Neobook
  • HoZ Engine
  • Zelda Classic
  • Leadwerks Engine
  • Game Hammer 2
  • Havok Vision
  • Yake
  • Silent Walk FPS Creator
  • Друзья сайта
    Игровой форум GFAQ.ru Перевод консольных игр
    GameDev, Уроки OpenGL, Программирование, Создать Minecraft
    Все права сохранены. GcUp.ru © 2008-2017 Рейтинг