2012-04-21 3 views
3

В Pygame, у меня есть поверхность:Как я могу сделать полутоновую копию поверхности в pygame?

im = pygame.image.load('foo.png').convert_alpha() 
im = pygame.transform.scale(im, (64, 64)) 

Как я могу получить черно-белую копию изображения или преобразовать данные изображения в оттенках серого? У меня numpy.

ответ

4

Используйте Surfarray и фильтровать его с NumPy или Цифровую:

def grayscale(self, img): 
    arr = pygame.surfarray.array3d(img) 
    #luminosity filter 
    avgs = [[(r*0.298 + g*0.587 + b*0.114) for (r,g,b) in col] for col in arr] 
    arr = numpy.array([[[avg,avg,avg] for avg in col] for col in avgs]) 
    return pygame.surfarray.make_surface(arr) 
+0

Если вы используете .pixels3d вместо .array3d, вы можете избежать копирования всех данных на новую поверхность. – imallett

+0

Чтобы ускорить это, используя ту же логику: 'arr = arr.dot ([0.298, 0.587, 0.114]) [:,:, None] .repeat (3, axis = 2); return pygame.surfarrary.make_surface (arr) '. На моем (800x600) тестовом изображении это ускоряется более чем на 2 порядка. – Jason

2

Самый простой способ - перебрать все пиксели вашего изображения и вызвать .get_at (...) и .set_at (...).

Это будет довольно медленно, поэтому в ответ на ваше неявное предложение об использовании NumPy посмотрите на http://www.pygame.org/docs/tut/surfarray/SurfarrayIntro.html. Концепции и большая часть кода идентичны.

Смежные вопросы