【问题标题】:Python/Pygame Converting a .jpg to a string and back to a .jpg: Corruption IssuePython/Pygame 将 .jpg 转换为字符串并返回 .jpg:损坏问题
【发布时间】:2013-09-04 23:38:26
【问题描述】:

我正在使用 Pygame 在 Python 中制作一个程序,该程序会将图像加载到屏幕上,打开原始数据(例如,如果您将 jpg 作为文本文件打开时会看到的字符),抛出一些随机字符与数据一起,然后将其重新保存为 jpg 以再次加载到 pygame 中。这会产生一个看起来很酷的故障效果。

我对 desired 故障没有任何问题,但我发现尽管放置了什么样的随机字符,对于某些图像,每次图像通过我的故障功能时,我都会结束在图像底部有一个灰色条。我简化了我的函数,它所做的只是加载图像,将图像作为读取二进制文件打开(即使我在 Mac 上),保存原始数据字符串,基于该字符串写入一个新文件,然后加载该文件。该图像没有以任何方式故意出现故障,并且数据据说没有受到影响,但我仍然遇到了这个灰色条。

以下是相关代码:

def initializeScreen(x, y):
    pygame.display.set_mode((x,y))
    return pygame.display.get_surface()

def importImage(fileName):
    imgText = open(fileName, 'rb')
    imgTextStr = imgText.read()
    imgText.close()
    return imgTextStr

screenSurf = initializeScreen(800,600)
textOfImg = importImage('/Users/Amoeba/Desktop/GlitchDriving/Clouds.jpg')
newFile = open('/Users/Amoeba/Desktop/GlitchDriving/tempGlitchFile.jpg', 'wb')
newFile.write(textOfImg)
newimgSurf = pygame.image.load('/Users/Amoeba/Desktop/GlitchDriving/tempGlitchFile.jpg')
screenSurf.blit(newimgSurf, (0,0))
pygame.display.flip()

这是通过我的函数之前和之后的图像之一的示例:

值得注意的是,灰条的大小取决于图片。有些图片甚至通过我的功能明显没有改变,因为它们应该是。另外,如果我用预览之类的图像查看软件打开我的程序编写的新版本的jpg,灰色条不会出现。我怀疑这是 pygame 图像加载功能的一个怪癖,或者在我从 jpg 到字符串的转换中删除了一些奇怪的字符(或可能是空格),反之亦然。我确实比较了两个文本文件(一个带有灰色条,一个没有),发现在使用在线“差异查找器”时没有区别。

这是我在这里的第一篇文章,但我已经潜伏了几十次。非常感谢任何帮助。

【问题讨论】:

    标签: python image jpeg pygame corruption


    【解决方案1】:

    您永远不会关闭使用open 创建的文件对象,因此可能并非所有数据都被写回(刷新)到您的新文件中。

    在尝试再次读取文件之前关闭文件对象,或者在处理文件时更好地开始使用with statement(它将为您关闭文件):

    def importImage(fileName):
        with open(fileName, 'rb') as imgText:
            return imgText.read()
    
    screenSurf = initializeScreen(800,600)
    textOfImg = importImage(r'path/to/file')
    
    with open(r'path/to/otherfile', 'wb') as newFile:
        newFile.write(textOfImg)
    
    newimgSurf = pygame.image.load(r'path/to/otherfile')
    screenSurf.blit(newimgSurf, (0,0))
    pygame.display.flip()
    

    【讨论】:

    • 这解决了这个问题。我将检查 with/as 函数,似乎我可以通过使用它来避免这个和许多其他问题。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 2013-05-10
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多