Python / Pygame将.jpg转换为字符串并返回.jpg:腐败问题

时间:2013-09-01 22:08:56

标签: python image jpeg pygame corruption

我正在使用Pygame在Python中创建一个程序,它会将图像加载到屏幕上,打开原始数据(如果你将jpg作为文本文件打开就会看到的字符),抛出一些随机字符使用数据,然后将其重新保存为jpg以再次加载到pygame中。这会产生很酷的毛刺效果。

我对所需的故障没有任何问题,但我发现尽管放置了什么样的随机字符,但对于某些图像,每次图像都经过我的毛刺功能,我结束了在图像底部有一个灰色条。我简化了我的功能,所以它所做的只是加载图像,打开图像作为读取二进制文件(即使我在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()

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

enter image description here

值得注意的是,灰条的大小取决于图片。有些图片甚至可以通过我的功能显而易见地保持原样。此外,如果我使用图像查看软件(如预览)打开我的程序编写的jpg的新版本,则不会出现灰色条。我怀疑它是pygame图像加载函数的一个怪癖,或者在我从jpg到string的转换中有一些奇怪的字符(或可能是空格)被丢弃,反之亦然。我确实比较了两个文本文件(一个带有灰色条,一个没有),并且在使用在线“差异查找器”时没有发现任何差异。

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

1 个答案:

答案 0 :(得分:0)

您永远不会关闭使用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()