2017-05-22 1 views
0

Ich möchte Bilder von der Server-Seite und zeigen sie auf der Client-Seite von Pygame und nicht jeden Frame auf der Festplatte speichern. Bilder werden mit base64 kodiert und dekodiert. Wenn Daten von der anderen Seite empfangen werden, wird es zum PIL-Bild dekodiert. Dann kann ich es erfolgreich in eine temporäre Datei speichern, mit Pygame öffnen und anzeigen. aber ich möchte es direkt mit image.tostring() tun, aber noting wird angezeigt Ich bin auch bemerkt, dass wenn ich in temporäre Datei Bilder Attribute speichern sind: Oberfläche (32x32x32 SW)konvertieren pil gif Bild zu pygame Oberfläche ohne es auf der Festplatte zu speichern

und wenn ich es direkt tun: Fläche (32x32x8 SW)

dank:

import base64 
from io import BytesIO 

import pygame 
from PIL import Image 


def gif__to_string(filePath): 
    gif_file = filePath 
    content = base64.encodestring(open(gif_file, 'rb').read()) 

    return content 


def string_to_gif(imageStr): 
    gif_image = Image.open(BytesIO(base64.b64decode(imageStr))) 

    return gif_image 


def show_gif_working(im): 
    black = (0, 0, 0) 
    white = (255, 255, 255) 
    pygame.init() 
    width = 350; 
    height = 400 
    imageX = 200; # x coordnate of image 
    imageY = 30; # 
    screen = pygame.display.set_mode((width, height)) 
    screen.fill(black) 
    im.save('temp.gif') 

    surface = pygame.image.load("temp.gif").convert() 

    screen.blit(surface, (imageY, imageY)) 
    pygame.display.flip() 


def show_gif_not_working(im): 
    black = (0, 0, 0) 
    white = (255, 255, 255) 
    pygame.init() 
    width = 350; 
    height = 400 
    imageX = 200; # x coordnate of image 
    imageY = 30; # 
    screen = pygame.display.set_mode((width, height)) 
    screen.fill(black) 

    mode = im.mode 
    size = im.size 
    data = im.tostring() 

    surface1 = pygame.image.fromstring(data, size, mode) 

    screen.blit(surface1, (imageX, imageY)) 

    pygame.display.flip() 


def main(): 
    content = gif__to_string('face5.gif') 

    print content 
    myImage = string_to_gif(content) 
    # show_gif_working(myImage) 
    show_gif_not_working(myImage) 


main() 
+0

Werfen Sie einen Blick [hier] (https://Stackoverflow.com/a/30727425/142637) für ein Beispiel. – sloth

Antwort

0

Haben Sie versucht pygame.image.load mit [1] mit einer Feile ähnlichen Objekt anstelle eines Strings?

Sie könnten ein StringIO [2] -Objekt anstelle einer Datei übergeben.

+0

Oberfläche = pygame.image.load1 (im) .convert() yealds Fehler –

+0

Oberfläche = pygame.image.load1 (im) .convert() AttributError: 'Modul' Objekt hat kein Attribut 'load1' –

+0

Die 1 und 2 Sie sehen nur Links zur Dokumentation. Wenn Sie auf den Link klicken, den Sie sehen, können Sie laden, indem Sie ein Dateiobjekt anstelle des Pfades zur Datei übergeben. Wenn Sie ein StringIO mit dem Inhalt des Bildes erstellen und zum Laden übergeben, sollte es funktionieren. – dyeray

Verwandte Themen