【问题标题】:How can I pack images? -Pygame -PyInstaller如何打包图片? -Pygame -PyInstaller
【发布时间】:2016-04-19 13:22:23
【问题描述】:

所以我得到了main.py,我通过PyInstaller --onefile 变成了main.exe,但是main.exe 仍然需要\data 文件夹中的图像文件img.png,该文件夹与main.py/main.exe 位于同一文件夹中。 .

img_l = pygame.image.load(os.path.join('data', 'img.png'))
screen.blit(img_l, (0, 0))

如何正确打包这些图片?我已经用pygame.image.tostring 搞砸了一段时间,然后尝试将其保存到.txt 文件中,这样我就可以使用data 文件夹中的.txt 文件而不是img.png,然后我可以使用pygame.image.fromstring(也许),但我还没有弄清楚如何让它工作。

我什至不确定这是否是正确/好的方法。

任何想法/建议真诚地表示赞赏。

【问题讨论】:

  • 将图像转换为十六进制字节数组或列表,将它们包含在python文件或实际游戏文件中,并在需要时将它们转换为二进制数据?
  • 我也试过了,找到了一些例子,但由于某种原因,from PIL import Image 得到了import error: no module named PIL。 . ://
  • 您不需要PIL。以二进制模式读写即可。

标签: python python-3.x pygame


【解决方案1】:

我对 fromstringtostring 方法了解不多,但您始终可以包括 图像作为base64数据。 Pygame 似乎需要一个实际的图像文件,而不仅仅是一个 blob 二进制数据,所以在下面的示例中,我包含了 3 个小图标作为 base64 字符串 写入名为“data”的子文件夹中的文件。然后传递文件名 到pygame.image.load()

我使用pyinstaller --onefile filename.py 和 它工作正常,无需对设置/规格/路径等进行任何手动更改。

import os
import hashlib
import pygame
import time
import base64

def create_assets(asset_dict, asset_dir):

    """ 
    hand this function a dictionary of assets (images, mp3s, whatever)
    and an absolute path to the data/asset folder. 
    The function creates the folder and files from the base64 strings
    if they don't exist. If the files exist, an md5 check is run
    instead to ensure integrity 
    """

    first_run = False
    if not os.path.isdir(asset_dir):
        os.mkdir(asset_dir)
        first_run = True
    for label in asset_dict:
        asset = asset_dict[label]
        filename = os.path.join(asset_dir, asset["filename"])
        rewrite = False
        # no need to check file if we just created the data folder
        if not first_run:
            if not os.path.isfile(filename):
                # the file doesn't exist
                rewrite = True
            else:
                # file exists - make sure it's intact via md5
                with open(filename, "rb") as f:
                    if not hashlib.md5(f.read()).hexdigest() == asset["md5"]:
                        # the filename exists but the contents is wrong
                        rewrite = True
        if first_run or rewrite:
            # one of our checks failed or first run - write file
            print ("Writing file: ",filename)
            with open(filename, "wb") as f:
                f.write(base64.b64decode(asset["data"]))
        else:
            print ("File exists: ",filename)


""" 
This the data dictionary. It's very easy to save 
the whole thing as json should you feel like it.
The images are just small, random icons at the moment 

"""

assets = {
    "background": {
        "filename": "bg1.png", 
        "data": "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAACOUlEQVQ4je2VQUhTcRzHP3szJyHiwbH5aCzpMCJ6NHIjWmzFtCBwKkEX7RYN2g4eAyF2jLRLzE5GoIegOgQNEarJCBwtYeQgPEQ0dC+fDNK5yFD3OuR7zL13WNCx7/ED3x8/vr8/379FVVWVA5WVZZY/TCEXMxxtdxLou082PU61sgpgYKI7hFzM4BD99A/PACBog9KpKPMvruvDwpEnlJUC4YFp2jtcpkzyxQBQ5BxKKQeANdj7LZHPTrK9VQTA7vTiD95lfe09+ewEtrZOTp29xbHjlwysyyFR3iiwvVXkR6XEiZPDtMjFjD5I8sfpdgV4OdtPeGCa/b2f9HgGWUhFqdV2DSwyMofkiyEXM/qWgt3pJRx5zJVrT+l2BQCoVlZ5++omojvIQipKZfOLKQPockiI7hAAy7kkltmkRzU7QLNq9ApmYQMIwhEkXxyr1aabG5mZ1/ow+SzRGPbnT8853XsbyR9HEFpZX1sEMLCLVx8ZDmUNnPma8J4bw9bWSY9nkHfzY/za+U5Z+YggtFJYmqJW2z14p4fZhrxEo9cym/So7R0uLlx+wOKbO3rYzarRKwDUarvs7+3om/yNGr3/j/IPjiK6Q1Qrq+QXJ4mMzDEaW9Hz6R+a0TM1Y6OxFYZuvKbLIXG+7x6iO4RgVkHN1tefGA5Xn0VVVTWdih4qSqWUo6wUyGcnkHxxRHeQ/b0dA9PKWJPd6aUFMFRQNj3eVH1peddXn0X7Auq3VOScIWyzA9QP0vQbENbTigXxO1gAAAAASUVORK5CYII=",
        "md5": "12f7eb2eea8992a2644de649dfaf00b3"
        },
    "player_sprite": {
        "filename": "player_img.png", 
        "data": "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAACh0lEQVQ4jZWUS2gTURiFv5lkmiZpk5KmNWmbIFratLWlCiq2blwILly4EFSsG3EjCK5EFITiQhFXbgRBXbXgouBe3GkRKTaYvtLWR01sa5M0j8nDpK9xEWZIwqStZ3nuzLmX/7v3CIE7HxR5KobvwUkaB9wApAIx7H1O5h5+Jv5pFYAjT05r3maygHfIR8OxZlTJs+uERoKI3iEf1kN2HKdc2mJoJEjme1ILK/WyP1IcvNFTFpZfy7H0coaUP4qgKIqSC6exeOrJr2YxuSxM3x1nM5Hn7+8MpTK31Wme/WgTnsud2Puc2npyMlIMVI3p++O0XDiM44SLVCDGt2d+8itZdpOt10n77X7MrXUAGEtnkPJH2c5uItlNLI8t7hlW19FA68V2alusmickv0aVSgD7lR4oUQ8AgGAU8Vz1IdaIVT09UIabg9eHo+9DbMkbZYGeK514h3wIkkjKH9X1CpEcciBGfjVL5F0IeXa9CEUPgFgj4rnWRXg0yE5+u6pXKUEOxpXwaJDExNp/za+ahI/n3ip7f7a36rscRShVd9oHFFWmZosGxWjrdSJPxYoLLguFPzkA2i51FHesNfDr1UxVD6AQybHw9AtmtxXD8/HXw/Y+J/LsOu23+tlKb5BfyZKZjyNIIuHRIMpWcSp6nirfveNkFpIY0/MJlscWkRpMxXtklUhMrLGzsVN2CkDXU+en/lv2ltUKUu9dNakAwm8WqKw+7S2rFZSei+8apgKwdTciGEV+vpgqqz7tLatKTka0naEclBbqsmB2W+l5NEhl9RnOLw0MpwIxbN0OJFsNtW4rB8560QOlSgXQdMaDZDcBEHw8gWSrwahXQdVAVQIonb1aff8A8A1zY9iTMCcAAAAASUVORK5CYII=",
        "md5": "79f25f0784a7849415f9c3d0d9d05267"
        },
    "weapon": {
        "filename": "sword1.png", 
        "data": "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAACzUlEQVQ4jZWVX0hTYRjGfydHZJb5J03SrIarrQaNEhKERgT25yaiIjEGQUWB0U03BUHWRVS3BUUOHGkUFg2LjW5bQkUjs6bNHcskJZRVplHTzs7bxdphy0Ot5+Ycnu99n3O+5/l4P+Q32u7FxO0JyOWOPvkbWjujouu68e72BOTqrX5j3UIG9mxdQXOTA4BI7AvB0Aca6itxOUoNruPBW5y2Yupc5RzauxoALakbGkrbvZgA1FQXUr++HEVR8PlVfH7VKGrcYeVoo51L3lcEQyNsql3CueMbjPWnL8eJDn0FIG9i7raWmuWF7G5YgaIoALgcpThtRWiacGSfnZ1bqlEUhYJ8Cw+7Rzm8dzXVSxcYglUVBYQjcW50DcLljj7Dk1zwt/rWzqgoIiL8gSs3+4m+myCiTmC3LqJ27WISM8lZXNpD750BDu5ZldqhiMjrgc9ysbVXevrjIiJy5Ey36Louw6NTouu6nLjwzJRL97o9AXnSM5ZKOTOAYGiExh1Wou++MjQyhXVZIeOffhDuiwOYcsHQB+NZ5yrHcmCXDaetiOCjERrqK9m4roxwJM7KqoWMf/pBeWk+LnsJ375rsziAhvpKgqFUL4Cph9duv2FweIpwXxyXvQSXo5TEtDaLO7DLZnje3ORAURTmpEW8dwZIa2tJITGjAZCYSaJpuimXxrH9a4wjh5mx/xtKZqAWM2NzDcUsUIuZsTXVhTmFYhaoEUqmsf8bShZaO6M5japc0N6lSt7kvO0tmqazfu3irA9FYl+44H2Fw1pEVUWBwfn8KgX5FirK5mfVd9wfxHs3Rt7JU6dbdBE0TYxGAJ9fRR2eZOZnks0bl+Lzq5y/3os6PMnD7lES00lqnamfCEfivB+dwmkrTh0bkdTEztx+T39c3J6APA5/NLjnr8fl7JUX8qRnzLCivUvNmthZgm5PIEv0X6OtvUuddQX8Ag5COzDf7kUwAAAAAElFTkSuQmCC",
        "md5": "92485d36b8ac414cc758d9a6c6f28d23"
        },
}

# get absolute path to asset directory
asset_dir = "data"
asset_dir_path = os.path.join(os.getcwd(), asset_dir)

# create files in asset directory using the assets dictionary
create_assets(assets, asset_dir_path)

pygame.init()

WIDTH = 800
HEIGHT = 600

SCREEN = pygame.display.set_mode((WIDTH, HEIGHT))

loaded_images = {}

# initalize/load all the newly created images
for label in assets:
    file_path = os.path.join(asset_dir_path,assets[label]["filename"])
    loaded_images[label] = pygame.image.load(file_path)

pos1 = 0
pos2 = 0
t_start = time.time()

while time.time() - t_start < 5:
    for img in loaded_images:
        SCREEN.blit(loaded_images[img], (pos1, pos2))
        time.sleep(0.2)
        pos1 += 20
        pos2 += 20
        pygame.display.update()

我将图像转换为 base64 字符串,如下所示:

import base64

with open(img_input, "rb") as f:
    with open(img_output_b64, "wb") as f2:
        f2.write(base64.b64encode(f.read()))

【讨论】:

  • 嘿,只是觉得在你得到的任何帮助下跑步而不给予任何回报是不礼貌的,即使它只是一些互联网点¯_(ツ)_/¯ 再次感谢并有一个好一个! ^_^
  • @EsaT.H.我已经准备好答案,以防你问这个问题,但不知道如果我只是给你代码,其他用户是否会抱怨。我觉得你的项目很有趣,所以我写它是为了好玩。无论如何,如果有人问,你没有做作业:D
  • 哇! 干杯!:作业?不,不是学生或任何东西,如果那是你的意思。只是想在空闲时间学习 Python :)
  • @EsaT.H.酷,这似乎也不是家庭作业。我也在做同样的事情。 - 只是尝试自己学习/改进,所以这是一个很好的方法,同时在这个过程中帮助人们。无论如何,希望代码有用。如果有不清楚的地方,请随时询问。
  • 嘿伙计们——在我创建了一个我称之为stringify 的库后几天偶然发现了这个,它几乎完成了同样的事情。我正在使用它,以便 PyInstaller 在构建包时将图像识别为本机 python 代码,但显然有很多用途。很酷的概念!
猜你喜欢
  • 1970-01-01
  • 2023-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多