2013-01-05 7 views
5

Używam PIL do przekształcania części ekranu w sposób perspektywiczny. Pierwotne dane obrazu to pygame Powierzchnia, którą należy przekonwertować na obraz PIL.Jak przekonwertować powierzchnię pygame do obrazu PIL?

Dlatego znalazłem funkcję śledzącą pygame, która istnieje w tym celu.

Jednak wynik wygląda dość dziwnie (patrz załączony zrzut ekranu). Co jest nie tak z tym kodem:

rImage = pygame.Surface((1024,768)) 

#draw something to the Surface 
sprite = pygame.sprite.RenderPlain((playboard,)) 
sprite.draw(rImage) 

pil_string_image = pygame.image.tostring(rImage, "RGBA",False) 
pil_image = Image.fromstring("RGBA",(660,660),pil_string_image) 

Co robię źle?

pygame surface to pil image conversion

+1

Jak to wygląda, jeśli umieścisz (1024,768) zamiast (660,660) lub na odwrót? –

+0

To działa, ale dlaczego? – Hedge

+0

[pygame docs] (http://www.pygame.org/docs/ref/image.html#pygame.image.fromstring) o pygame.image.fromstring (ciąg, rozmiar, format, odwrócone = fałsz) powiedz "The rozmiar i format obrazu musi obliczyć dokładnie taki sam rozmiar, jak w przypadku podanego bufora ciągów. W przeciwnym razie zostanie zgłoszony wyjątek ", ale poza tym nie wiem, jak to działa. –

Odpowiedz

5

Jak zauważono w komentarzu, pygame documentation dla pygame.image.fromstring(string, size, format, flipped=False) mówi „Rozmiar obrazu i format musi obliczyć dokładnie ten sam rozmiar co przeszedł buforze strun. W przeciwnym razie zostanie zgłoszony wyjątek ". Zatem użycie (1024,768) zamiast (660,660) lub na odwrót - ogólnie rzecz biorąc, te same wymiary dla dwóch połączeń - jest bardziej prawdopodobne. (Mówię "bardziej prawdopodobne, że zadziała" zamiast "zadziała", ponieważ nie testowałem żadnych przypadków.)

Powód takiego problemu: dziwny wygląd części obrazu przypomina obraz ekran ustawiony na szybkość rastra, którego nie można zsynchronizować; tzn. linie obrazu zaczynają się wyświetlać w punktach innych niż na lewym marginesie; w tym przypadku, ponieważ długości linii obrazu są dłuższe niż wyświetlane długości linii. Zakładam, że płatki śniegu to sprite generowane oddzielnie od zniekształconego obrazu.