2013-03-26 64 views
2

所以,我已经在网上尝试了一些解决方案,但每个都会返回一个不同的错误。最近,我决定尝试类似:PyGame加载cStringIO作为图像

import cStringIO, pygame, os 
from pygame.locals import * 

pygame.init() 
mainClock = pygame.time.Clock() 
WINDOWWIDTH = 640 
WINDOWHEIGHT = 480 
windowSurface = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT), 0, 32) 
pygame.display.set_caption('StringIO Test') 

with open("image.png", "rb") as infile: 
    outfile = cStringIO.StringIO() 
    outfile.write(infile.read()) 


class DummyFile: 
    def __init__(self, data): 
     self.data = data 
     self.pos = 0 

    def read(self, size=None): 
     start = self.pos 
     end = len(self.data) - 1 

     if size is not None: 
      end = min(len(self.data), self.pos + size) 

     self.pos = end 
     return self.data[start:end] 

    def seek(self, offset, whence=0): 
     if whence == 0: 
      self.pos = offset 
     elif whence == 1: 
      self.pos = self.pos + offset 
     elif whence == 2: 
      self.pos = len(data) + offset  

    def write(self): 
     pass 

while True: 
    windowSurface.fill((0,0,0)) 
    testIm = pygame.image.load(DummyFile(outfile.getvalue())) 
    testImRect = testIm.get_rect() 
    testImRect.topleft = (0,0) 
    windowSurface.blit(testIm, testImRect) 
    pygame.display.flip() 

刚刚返回:

error: Can't seek in this data source 

从本质上讲,我的计划是要加密/解密的图像文件,并允许用户查看,却没有将解密的副本保存到硬盘驱动器。在另一个问题中,我被告知stringIO对象用于这个目的,python文档建议cStringIO,如果你要广泛使用它。 pygame的问题不希望把对象当成图像。有任何想法吗?

回答

5

一下添加到DummyFile

def tell(self): 
    return self.pos 

它认为你的类文件对象是不可搜索,因为它缺少的是方法。通过在DummyFile中添加一个__ getattr __方法并查看调用哪种方法。

+2

这很好。很难相信两行代码会导致或破坏我的代码!非常感谢,Bemmu – John 2013-03-26 18:09:19