如何打包图片?-Pygame -PyInstaller [英] How can I pack images? -Pygame -PyInstaller

查看:58
本文介绍了如何打包图片?-Pygame -PyInstaller的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

So I got main.py which I turn into main.exe through PyInstaller --onefile, but main.exe still needs image file img.png in \data folder which is located in same folder as 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 文件中,以便我可以使用该 .txtdata 文件夹中的 文件而不是 img.png,然后我可以使用 pygame.image.fromstring (也许)但是我还没有想出如何让它工作.

How can I pack these images correctly? I've been messing around for a while now with pygame.image.tostring and then trying to save that into .txt file so I can use that .txt file in data folder instead of img.png, from which then I could use pygame.image.fromstring (maybe) but I have not figured out how to make it work.

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

I am not even sure if it is the right/ok way to go about it.

任何想法/建议真诚赞赏.

推荐答案

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

I don't know much about the fromstring and tostring methods but you could always include the images as base64 data. Pygame seems to need an actual image file and not just a blob of binary data so in the example below, I've included 3 small icons as base64 strings that get written to files in a sub-folder named "data". The filenames are then passed to pygame.image.load().

我使用 pyinstaller --onefile filename.py 测试了这段代码,并且它运行良好,无需对设置/规格/路径等进行任何手动更改.

I tested this code with pyinstaller --onefile filename.py and it worked fine without any manual changes to settings/specs/paths etc.

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 字符串:

I turned the images into base64 strings like so:

import base64

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

这篇关于如何打包图片?-Pygame -PyInstaller的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆