0

私は Pygame で非常に奇妙な問題を抱えており、過去数時間 (OK、5 時間程度) 困惑しています。フォト モザイクを作成するための無料のプログラムがありますが、VB5 をいじくり回した初期の頃から、独自のバージョンを書きたいと思っていました。あなたはそれがどのように知っています。ソース画像の読み込み、色平均の検索など、あらゆる種類のクールなパーツが書かれています。しかし、ここで私は立ち往生し、混乱しています。とても行き詰まり、混乱しています。

プログラムのこの部分は、「ターゲット イメージ」(小さなソース イメージで構成されるイメージ) を小さな色のブロックに変換します。このブロックは、他のソース イメージが一致させようとし、最終的に置換されます。しかし、何らかの理由で、ブロックのサイズは反復ごとに増加し続けます。私は非常に多くの異なることを試したので、スクリプトを調べて、投稿する前にいくつかのものを削除し、さらにいくつかのコメントを追加する必要がありました.

ターゲットの画像は 1280x800 のランダムな Google 画像ですが、他の画像でも同じように機能するはずです。ブロックが下がるたびにブリットの Y サイズが大きくなり、新しい行が作成されると X サイズが大きくなるのを見てください。無地の四角形のセット サイズ (幅 2 ピクセル、使用するよりもはるかに小さい) でハード コードしましたが、何らかの理由でこれは増加し続けています。ブリットの最初の行は、今は非常に小さいため、見るのが困難です。それはすぐに変わります。**私が使用している画像へのリンクは次のとおりです (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

私の友人が私のコードを見て、問題を教えてくれました。描画の rect 形式は (x1,y1,x2,y2) だと思っていましたが、実際には (x,y,width,height) です。これは新しい行です:

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

また、全体を高速化するために clock.tick(30) 行を削除しました。

于 2013-01-13T04:39:55.480 に答える