Для фотореалистичных изображений лучше всего использовать JPEG, т.к. незначительные потери практически не скажутся на визуальном восприятии, но изображение будет хорошо сжато. Для искусственных изображений с большим наличием однотонных областей (например, клип-арт) где четкость границ и однотонность заливки имеет первостепенное значение, лучше выбирать формат PNG. Кроме того, этот формат хранит альфа-канал для прозрачного фона (в JPEG такой возможности нет).
Программа ниже инициализирует Pygame и выводит в консоль значение функции get_extended():
import pygame pygame.init() W, H = 600, 400 sc = pygame.display.
set_mode((600, 400)) pygame.display.set_caption(«Изображения») pygame.display.set_icon(pygame.
image.load(«app.bmp»)) clock = pygame.time.
Clock() FPS = 60 WHITE = (255, 255, 255) RED = (255, 0, 0) YELLOW = (239, 228, 176) print( pygame.image.
get_extended() ) while True: for event in pygame.event.get(): if event.type == pygame.
Pygame — Редактор двумерной карты с сохранением
QUIT: exit() clock.tick(FPS)
Как видите, в данном случае Pygame возвращает 1, значит, можно использовать форматы PNG и JPEG. Теперь загрузим в программе изображение машинки:
car_surf = pygame.image.load(«images/car.bmp»)
Здесь используется функция load(), в которой указывается путь к изображению (относительно исполняемого файла на Питоне) и на выходе она формирует поверхность с изображением машинки. Далее, мы можем отобразить содержимое этой поверхности уже знакомым нам способом:
car_rect = car_surf.get_rect(center=(W//2, H//2)) sc.blit(car_surf, car_rect) pygame.display.update()
После выполнения программы увидим в центре окна изображение машины: Выглядит не очень. Добавим фон в виде изображения песка:
bg_surf = pygame.image.load(«images/sand.jpg») sc.blit(bg_surf, (0, 0))
Стало лучше, но белый фон у машинки явно выделяется на фоне песка. Давайте укажем Pygame, что белый цвет следует воспринимать как прозрачный:
car_surf.set_colorkey((255, 255, 255))
Теперь намного лучше. Однако, если имеется файл с альфа-каналом (прозрачным фоном), то оно будет сразу отображаться нужным образом:
finish_surf = pygame.image.load(«images/finish.png») sc.blit(finish_surf, (0, 0))
Следующий важный момент, особенно при разработке динамических игр, перевод пикселей загруженных изображений в формат пикселей главной поверхности:
car_surf = pygame.image.load(«images/car.bmp»).convert() finish_surf = pygame.image.load(«images/finish.png»).
convert_alpha() bg_surf = pygame.image.load(«images/sand.jpg»).convert()
В этом случае, перерисовка поверхностей будет выполняться быстрее.
Причем, обратите внимание, изображение в формате PNG с альфа-каналом преобразуется методом convert_alpha(), а не convert(). Вообще, эти строчки равносильны следующей операции:
Программирование игр Pygame #26: Сохранение игры (библиотека shelve)
car_surf = pygame.image.load(«images/car.bmp») car_surf = car_surf.convert()
То есть, методы convert() и convert_alpha() – это методы класса Surface, которые возвращают новую поверхность с измененным представлением пикселей.
При этом прежняя поверхность остается без изменений. Например, если переписать последнюю строчку вот так:
car_surf2 = car_surf.convert()
то пиксели car_surf2 будут приведены к формату главной поверхности, а пиксели car_surf останутся прежними – без изменений.
Трансформация поверхностей
Предположим, что мы теперь хотели бы уменьшить масштаб изображения фона, чтобы песок был более мелкий. Это можно сделать с помощью модуля pygame.transform содержащий различные функции трансформации поверхностей. Подробное их описание можно посмотреть на странице официальной документации: https://www.pygame.org/docs/ref/transform.html Итак, мы воспользуемся функцией: pygame.transform.scale(Surface, (width, height), DestSurface = None) -> Surface Здесь первый параметр – преобразуемая поверхность; (width, height) – ее новые значения ширины и высоты. В нашей программе вызовем эту функцию так:
bg_surf = pygame.transform.scale(bg_surf, (bg_surf.get_width()//3, bg_surf.
get_height()//3))
Как сохранить окно pygame как изображение? (python3) (PyGame)
Я делаю редактор пикселей / мусорную версию ms paint на python с помощью pygame, и я хочу сохранить окно (холст?) Как png или jpg. Я видел pygame.image.save, но он сохраняет только определенную поверхность в виде изображения, я хочу сохранить все окно.
FluffyFlounder 16 Сен 2020 в 02:39
2 ответа
Лучший ответ
Используйте pygame.image.save (), который требуется PyGame 1.8 или новее. Если вы предоставите ему поверхность окна базового уровня, он действительно сохранит все содержимое окна.
pygame.image.save( window, ‘surface.png’ )
Тип изображения определяется суффиксом имени файла.
Kingsley 15 Сен 2020 в 23:45
pygame.image.save(window, «screenshot.png»)
Источник: question-it.com
Используем PyInstaller для создания exe-файла игры на Pygame
Я, как и многие новички в создании игр, столкнулся с проблемой как поделиться готовым проектом с друзьями, у которых не установлен Python.
На недостаток обучалок по созданию игр на Pygame не пожалуешься, но мне не удалось найти подробной инструкции как собрать единый exe-файл, для запуска которого не требуется держать рядом папку с изображениями и игровыми звуками.
Из множества библиотек, собирающих проекты в exe, выбрал PyInstaller. Его оказалось достаточно, чтобы справиться с задачей. Опишу все пошагово (для Windows).
Установка PyInstaller
В командной строке пишем:
pip install pyinstaller
Создание spec-файла (файла спецификации)
Pyinstaller создает приложение, выполняя содержимое файла спецификации.
Чтобы создать spec-файл, через командную строку в папке с проектом набираем:
pyi-makespec —onefile mygame.py
Флаг —onefile создает файл спецификации, который позволит упаковать всё необходимое в один exe-файл.
Получаем файл mygame.spec
Редактирование spec-файла
Теперь нужно правильно настроить spec-файл. Открываем spec-файл в текстовом редакторе.
block_cipher = None a = Analysis([‘mygame.py’], pathex=[‘C:/Users/1/Desktop/Python/test’], binaries=[], datas=[(‘Images/image.png’, ‘Images’), (‘Music/track.mp3’, ‘Music’), (‘font.ttf’, ‘.’)], hiddenimports=[], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE(pyz, a.scripts, a.binaries, a.zipfiles, a.datas, [], name=’mygame’, debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, console=False, icon=’C:/Users/1/Desktop/Python/test/icon.ico’)
В качестве первого атрибута для объекта класса Analysis передается имя py-файла, который нужно скомпилировать.
Атрибут pathex отвечает за путь к папке проекта.
В списке datas указываются файлы, которые нужно загрузить для работы приложения (изображения, музыка/звуки, шрифты). Datas — это список кортежей. Каждый кортеж имеет два элемента строкового типа:
- Первый — путь до файла, который нужно загрузить.
- Второй указывает имя папки для хранения файла во время выполнения программы
(‘.’ — означает, что файл будет помещен во временную папку без подкаталога).
Редактирование путей к файлам в коде
В коде до загрузки файлов необходимо добавить функцию, которая позволит программе найти необходимые для работы файлы независимо от своего расположения (подсмотрено тут).
def resource_path(relative): if hasattr(sys, «_MEIPASS»): return os.path.join(sys._MEIPASS, relative) return os.path.join(relative)
При запуске приложения PyInstaller распаковывает данные во временную папку и сохраняет путь к ней в переменной среды _MEIPASS.
Функция resource_path проверяет создана ли временная папка, и если да, то возвращает путь к ней для дальнейшей загрузки файлов. В противном случае (например, если запустить код через интерпретатор) функция вернет тот путь, который в неё передали (то есть путь к папке проекта с игрой).
Чтобы получить путь к файлу
- если файл лежит в той же папке, что и py-файл, пишем:
path = resource_path(‘image.png’)
- если файл вынесен в отдельную папку проекта, пишем:
path = resource_path(os.path.join(‘Folder’, ‘image.png’))
При этом, если файл вынесен в отдельную папку проекта, то и во временной папке нужно создавать соответствующий подкаталог (см. редактирование параметра datas).
Далее загружаем файл:
img = pygame.image.load(path)
С музыкой и шрифтами аналогично.
Создание exe
В командной строке вводим:
pyinstaller mygame.spec
Готово! Exe-файл находится в папке dist.
Замечание про функции quit() и exit()
Если в коде вашей игры в качестве функций выхода используются quit() или exit(), то скомпилированное приложение работать не будет.
Эти функции включены, чтобы новичкам было проще ориентироваться в коде, и предназначены только для использования в интерпретаторе. На самом деле для их корректной работы требуется загрузить модуль site.
Стандартным способом выйти из программы является использование sys.exit().
Источник: habr.com