Pygameで画像処理10

モザイク化です。
 
画面遷移時に使えますね。

import pygame
import math

# Mosaic
# @param tBuf サーフェス
# @param RECT モザイクをかける範囲
# @param SIZE モザイクの大きさ
def transMosaic(tBuf, RECT, SIZE):
	if(SIZE < 1): return None
	retBuf = pygame.transform.scale(tBuf, tBuf.get_size())
	for j in range(RECT.top, RECT.bottom, SIZE):
		for i in range(RECT.left, RECT.right, SIZE):
			colorSum = 0, 0, 0
			for b in range(SIZE):
				for a in range(SIZE):
					rgba = tBuf.get_at((i+a, j+b))
					colorSum = (
						colorSum[0] + rgba[0],
						colorSum[1] + rgba[1],
						colorSum[2] + rgba[2])
			colorSum = (
				colorSum[0] / ((SIZE)**2),
				colorSum[1] / ((SIZE)**2),
				colorSum[2] / ((SIZE)**2),
				255)
			for b in range(SIZE):
				for a in range(SIZE):
					retBuf.set_at((i+a, j+b), colorSum)
	return retBuf
# Main
def main():
	pygame.init()
	pygame.display.set_mode((250, 250), 0, 32)
	pygame.display.set_caption("モザイク")
	_gScr = pygame.display.get_surface()
	tBuf = pygame.image.load("nyan.bmp").convert()

	i = 1
	while True:
		dstBuf = transMosaic(tBuf, pygame.Rect(50, 50, 100, 100), i)
		i += 1
		if(i > 50): i = 1
		_gScr.blit(dstBuf, (0, 0), dstBuf.get_rect())
		pygame.display.update()
		for e in pygame.event.get():
			if e.type == pygame.QUIT: return
		pygame.time.wait(10)

if __name__ == '__main__':
	main()