2017-03-15 5 views
1

これは簡単なことですが、苦労しています。 私は "ゼロ"と呼ばれる透明な中心を持つ長方形のpng画像を持っています。私は画像の可視部分の色を変更したい。それを変更しようとすると、私は "zero.fill"を使用しようとしましたが、私は不透明部分だけを変更しようとするか、古い色と新しい色をマージしてそのようにしています。 完成したプログラムを持っていない友達にnumpyをインストールしたいと思っています。あらゆる簡単な提案を歓迎します。Pygameの画像の透明度を変更せずに色を変更するにはどうすればいいですか?

+1

場所に必要な色と同じ大きさの長方形の上に画像.. –

+0

私はそれを試みたが、いずれかの透明性が動作しないか、それが下に黒の背景に通過します色のついた矩形の画像 –

+1

コード内の色を変更する必要がありますか?そうでない場合は、イメージソフトウェアで他のイメージを作成し、ある条件に基づいてコード内で交互に使用することができます。 – The4thIceman

答えて

1

私は半透明のピクセルアルファサーフェスで動作する例があります。 fill関数は、サーフェスのピクセルをループして新しい色に設定しますが、アルファ値は保持します。おそらく多くのサーフェスを持つフレームごとにこれを行うことはお勧めできません。 (プレスF、G、Hは色を変更する。)

import sys 
import pygame as pg 


def fill(surface, color): 
    """Fill all pixels of the surface with color, preserve transparency.""" 
    w, h = surface.get_size() 
    r, g, b, _ = color 
    for x in range(w): 
     for y in range(h): 
      a = surface.get_at((x, y))[3] 
      surface.set_at((x, y), pg.Color(r, g, b, a)) 


def main(): 
    screen = pg.display.set_mode((640, 480)) 
    clock = pg.time.Clock() 

    # Uncomment this for a non-translucent surface. 
    # surface = pg.Surface((100, 150), pg.SRCALPHA) 
    # pg.draw.circle(surface, pg.Color(40, 240, 120), (50, 50), 50) 
    surface = pg.image.load('bullet2.png').convert_alpha() 
    surface = pg.transform.rotozoom(surface, 0, 2) 

    done = False 

    while not done: 
     for event in pg.event.get(): 
      if event.type == pg.QUIT: 
       done = True 
      if event.type == pg.KEYDOWN: 
       if event.key == pg.K_f: 
        fill(surface, pg.Color(240, 200, 40)) 
       if event.key == pg.K_g: 
        fill(surface, pg.Color(250, 10, 40)) 
       if event.key == pg.K_h: 
        fill(surface, pg.Color(40, 240, 120)) 

     screen.fill(pg.Color('lightskyblue4')) 
     pg.draw.rect(screen, pg.Color(40, 50, 50), (210, 210, 50, 90)) 
     screen.blit(surface, (200, 200)) 

     pg.display.flip() 
     clock.tick(30) 


if __name__ == '__main__': 
    pg.init() 
    main() 
    pg.quit() 
    sys.exit() 

bullet2.png

+0

答えに半透明の画像を追加しました。その効果をよりよく見ることができます。色のみが変更されますが、透明度は変わりません。 – skrx

+1

skrxに感謝します。これは、複雑な画像やテーマの画像ではより便利です。 –

+1

私がskrxの方法を必要とするのはずっと前です。はるかに柔軟性があります。再度、感謝します。 :-) –

1

このバージョンでは、可視光透明部品ははAnkurの提案の通り、元の質問に他の方法で円形です。 はここで不可欠な作業コードです:

import pygame, sys 
from pygame.locals import * 
pygame.init() 

def load_image(name): 
    image = pygame.image.load(name).convert() 
    return image 

def resize(obj, w, h): 
    global scale 
    return pygame.transform.scale(obj, (int(w * scale), int(h * scale))) 


pink = (255, 0, 160) 
red = (255, 0, 0) 
peach = (255, 118, 95) 
blue = (0, 0, 255) 
blue_1 = (38, 0, 160) 
dark_yellow = (255, 174, 0) 
green = (38, 137, 0) 
orange = (255, 81, 0) 
colour = [pink, red, peach, blue, blue_1, dark_yellow, green, orange, green] 
clock = pygame.time.Clock() 
scale = 4 
screen = pygame.display.set_mode((292 * scale, 240 * scale),0, 32) 
banner = load_image("banner.png") #292x35 
zero = load_image("zero.png") #5x7 
c = 0 
while True: 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      pygame.quit() 
      sys.exit() 
    rgb = colour[c] 
    c = c + 1 
    if c > 7: 
     c = 0 
    pygame.draw.line(banner, rgb, (53, 21), (53, 27), 5) #line the same size as zero image 
    banner.blit(zero, (51, 21)) #blit image with transparency over line 
    large_banner = resize(banner, 292, 35) 
    screen.blit(large_banner, (0, 0)) 
    clock.tick(120) 
    pygame.display.flip() 

pygame.quit() 
sys.exit() 
+0

ああ、ちょうどその下の矩形(またはこの場合は線)の色を変更し、上の透明部分でイメージを拡大します。これはあなたのために働くのは良いことですが、これは実際に質問に答えません。 – skrx

関連する問題