0

我在使用 Pygame 时遇到了一个非常奇怪的问题,这让我在过去的几个小时(好吧,更像是 5 个)小时都感到困惑。那里有制作照片马赛克的免费程序,但自从我早期使用 VB5 修补以来,我就一直想编写自己的版本。你知道那是怎么回事。我编写了各种很酷的部分,用于加载源图像、查找颜色平均值和所有内容。但在这里我被困住了,很困惑。所以非常卡住和困惑。

这部分程序将“目标图像”(由小源图像组成的图像)​​转换为其他源图像将尝试匹配并最终替换的更小的颜色块。但是由于某种原因,块的大小随着每次迭代而不断增加。我已经尝试了很多不同的东西,以至于我不得不通过脚本删除一堆东西并在发布之前添加更多评论。

目标 img 是一张 1280x800 的随机谷歌图片,但任何其他图片都应该是一样的。观察 blit 的 Y 大小随着每个块的下降而增加,而 X 大小随着新行的产生而增加。我为纯色矩形硬编码了一个固定大小(2 个像素,比我将使用的要小得多),但无论出于何种原因,它都在不断增加。第一排 blit 现在太小了,很难看到。这很快就改变了。**这是我正在使用的图像的链接(http://www.travelimg.org/wallpapers/2012/01/iceland-golden-falls-druffix-europe-golden-falls-golden-falls- iceland-natur-waterfall-waterfalls-800x1280.jpg),但任何其他重命名为 target.jpg 的图片/尺寸都应该这样做。

如果有人能指出我正确的方向,将不胜感激。我想以漂亮的 12x12 纯色块覆盖整个源图片。我不知道是什么在改变这些块的大小。

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'

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,1280,800]
targetsize = targetrect[2:]
targetw = targetrect[2]
targeth = targetrect[3]

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[0],currentrect[1],currentrect[0]+2,currentrect[1]+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()
4

1 回答 1

0

我的一个朋友查看了我的代码并向我展示了这个问题。我在想绘图的矩形格式是(x1,y1,x2,y2),但实际上是(x,y,宽度,高度)。这是新行:

currentrect = [x*picxsize,y*picysize,picxsize,picysize]

我还删除了 clock.tick(30) 行以加快速度。

于 2013-01-13T04:39:55.480 回答