This part of the program converts a 'target image' (the one that will be made up of small source images) to smaller blocks of color that other source images will try to match and then replace eventually. But for some reason, the size of the blocks keeps increasing with every iteration. I've tried so many different things that I've had to go through the script and delete out a bunch of things and add a couple more comments before posting.
The target img is attached (a 1280x800 random google image), but any other picture should work just the same. Watch as the Y size of the blit increases with every block going down, and the X size increases as new rows are made. I hard coded in a set size for the solid color rectangle (2 pixels across, much smaller than I'll use), but for whatever reason this keeps increasing. The first row of blits is so small right now that it's hard to see. That quickly changes.
**OK, image is not attaching. Here's the link to what I am using (www.travelimg.org/wp-content/uploads/2012/01/iceland-golden-falls-druffix-europe-golden-falls-golden-falls-iceland-natur-waterfall-waterfalls-1024x768.jpg), but any other pic/size renamed to target.jpg should do the same.
If anyone can point me in the right direction it would be much appreciated. I want to cover this whole source pic in nice 12x12 blocks of solid color to start with. I can't figure out what is changing these block sizes as it goes.
import pygame import os from time import sleep okformats = ['png','jpg','bmp','pcx','tif','lbm','pbm','pgm','ppm','xpm'] targetimg = 'C:\\Python27\\mosaic\\target.jpg' #sorry linux users, I got lazy here if targetimg[-3:] not in okformats: print 'That format is unsupported, get ready for some errors...' else: print 'Loading...' pygame.init() screen = pygame.display.set_mode((100,100)) #picked a size just to start it out clock = pygame.time.Clock() #possibly not needed in this script targetpic = pygame.image.load(targetimg).convert() targetrect = targetpic.get_rect() #returns something like [0,0,128,128] targetsize = targetrect[2:] targetw = targetrect targeth = targetrect numpicsx = 100 #number of pictures that make up the width sourceratio = 1 #testing with square pics for now picxsize = targetw/numpicsx numpicsy = targeth/(picxsize*sourceratio) picysize = targeth/numpicsy print 'Blitting target image' screen = pygame.display.set_mode(targetsize) screen.fill((255,255,255)) #set to white in case of transparency screen.blit(targetpic,(0,0)) #update screen pygame.display.update() pygame.display.flip() clock.tick(30) SLOWDOWN = .1 #temp slow down to watch it print numpicsx #here are some print statements just to show all the starting values are correct print numpicsy print '---' print picxsize print picysize sleep(1) for x in xrange(numpicsx): for y in xrange(numpicsy): currentrect = [x*picxsize,y*picysize,x*picxsize+picxsize,y*picysize+picysize] avgc = pygame.transform.average_color((targetpic), currentrect) #average color avgc = avgc[:3] #drops out the alpha if there is one #pygame.draw.rect(screen, avgc, currentrect) pygame.draw.rect(screen, avgc, (currentrect,currentrect,currentrect+2,currentrect+2)) #hard coded 2s (rather than 12s in this case) to help pin point the problem pygame.display.update() pygame.display.flip() clock.tick(30) #probably not needed sleep(SLOWDOWN) print 'Done./nSleeping then quitting...' sleep(3) pygame.quit()