Hi, Found a problem with pygame.image.frombuffer and 8 bit images. The call to SDL_CreateRGBSurfaceFrom uses incorrect pitch, which causes the image to be be corrupted. pygame.image.fromstring does not have this problem so you can use that instead as a workaround. The bug is present in latest subversion code.
Demo script and patch are attached. -- Alistair Buxton [EMAIL PROTECTED]
from struct import unpack from imageop import mono2grey, scale import pygame from pygame.locals import * pygame.init() sx,sy = 320,320 screen = pygame.display.set_mode((sx,sy)) # 8x8 checkerboard pixels = "\x00\xff\x00\xff\x00\xff\x00\xff\xff\x00\xff\x00\xff\x00\xff\x00"*4 # scale to 320x320 newpixels = scale(pixels, 1, 8, 8, 320, 320) # this produces an image which is warped horizontally: surface = pygame.image.frombuffer(newpixels, (320, 320), "P") # this works ok: #surface = pygame.image.fromstring(newpixels, (320, 320), "P") surface.set_palette([(0,0,0), (255,255,255)]*128) running = True while running: screen.fill((0,0,0)) screen.blit(surface, (0,0)) for event in pygame.event.get(): if event.type == QUIT: running = 0 elif event.type == KEYDOWN: if event.key == K_ESCAPE: running = 0 pygame.display.flip() pygame.time.delay(10)
Index: src/image.c =================================================================== --- src/image.c (revision 1113) +++ src/image.c (working copy) @@ -938,7 +938,7 @@ (PyExc_ValueError, "Buffer length does not equal format and resolution size"); - surf = SDL_CreateRGBSurfaceFrom (data, w, h, 8, 3, 0, 0, 0, 0); + surf = SDL_CreateRGBSurfaceFrom (data, w, h, 8, w, 0, 0, 0, 0); } else if (!strcmp (format, "RGB")) {