1. 程式人生 > >Python——pygame影象處理

Python——pygame影象處理

一. 單個畫素

有時我們並不想畫一個圓或矩形,而是希望畫單個的點或畫素。比如畫一條正弦曲線。

import pygame,sys,math
pygame.init()
screen = pygame.display.set_mode([640,480])
screen.fill([255,255,255])
for x in range(0,640):
    y = int(math.sin(x/640.0 * 4 * math.pi) * 200 + 240)
    pygame.draw.rect(screen, [0,0,0], [x,y,1,1], 1)
pygame.display.flip()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
pygame.quit()

圖中每個點都是寬和高均為1畫素的矩形。注意我們使用的線寬為1,而不是零。如果線寬為0,什麼都不會顯示,因為這樣的矩形沒有中間部分可以填充。 在這裡插入圖片描述

1.連線多個點

仔細看上圖,會發現這個正弦曲線並不是連續的,中間存在空格。我們畫的是單個的點,而不是線。

下邊要嘗試用一天短線把各點連線起來。Pygame有一個畫線的方法,另外還有一種方法可以在一系列點之間畫線。這個方法就是pygame.draw.lines( ),它需要5個引數:

  • 畫線的表面
  • 顏色
  • 是否要形狀閉合。若不希望閉合,這個引數是False,閉合引數為True
  • 要連線的點的列表
  • 線寬

所以正弦曲線例子中。pygame.draw.lines( )的方法是這樣的:

pygame.draw.lines(screen, [0,0,0], False, plotPoints, 1)

整個程式的程式碼:

import pygame,sys,math
pygame.init()
screen = pygame.display.set_mode([640,480])
screen.fill([255,255,255])
plotPoints = []
for x in range(0,640):
    y = int(math.sin(x/640.0 * 4 * math.pi) * 200 + 240)
    plotPoints.append([x,y])
pygame.draw.lines(screen, [0,0,0], False, plotPoints, 1)
pygame.display.flip()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
pygame.quit()

在這裡插入圖片描述 把線寬加寬為2試試,效果更好: 在這裡插入圖片描述

2.玩一個小花樣:

import pygame,sys
pygame.init()

dots = [[221,432],[225,331],[133,342],[141,310],
        [51,230],[74,217],[58,153],[114,164],
        [123,135],[176,190],[159,77],[193,93],
        [230,28],[267,93],[301,77],[284,190],
        [327,135],[336,164],[402,153],[386,217],
        [409,230],[319,310],[327,342],[233,331],
        [237,432]]

screen = pygame.display.set_mode([640,480])
screen.fill([255,255,255])
pygame.draw.lines(screen,[255,0,0],True,dots,5)
pygame.display.flip()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
pygame.quit()

在這裡插入圖片描述

二. 影象

在螢幕上畫圖形、線和單個畫素只是製作圖形的一種方法。有時我們還可以用從別處得來的圖片,在Pygame中,使用圖形最簡單的方法就是利用image函式。

1.開啟一個影象

首先把圖片(我的是“timg”)放到程式下的資料夾中,鍵入:

import pygame,sys
pygame.init()
screen = pygame.display.set_mode([640,480])
screen.fill([255,255,255])
my_dog = pygame.image.load("timg.jpg") 
screen.blit(my_dog,[50,50])
pygame.display.flip()


running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
pygame.quit()

在這裡插入圖片描述 上例第5行中,pygame.image.load( )函式從硬碟載入一個影象,並建立一個名為my_dog的物件。my_dog物件是一個表面。不過我們看不到這個表面,它只在記憶體中。我們唯一能看到的是顯示錶面,名為screen。而第六行把my_dog表面複製到screen表面上。然後通過display.flip( )呼叫使它可見。

2. 讓影象動起來

影象移動,其實就是把影象(畫素組)從一個地方移動到另一個地方。

先試試左右移動。先向右移動100畫素,還需要加上一個延時,以便看到動畫發生。

import pygame,sys
pygame.init()
screen = pygame.display.set_mode([640,480])
screen.fill([255,255,255])
my_dog = pygame.image.load("timg.jpg") 
screen.blit(my_dog,[50,50])
pygame.display.flip()
pygame.time.delay(2000)
screen.blit(my_dog,[150,50])
pygame.display.flip()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
pygame.quit()

在這裡插入圖片描述 我們確實做到把影象右移但是第一個仍然存在,我們下一步就是要把原圖擦掉。

3. 動畫

計算機上的圖形不像黑板上畫的畫,很容易就擦掉。要想“擦掉”某個東西,實際上要做的是把它“蓋住”。我們的背景色是白色,那我們就必須用白色覆蓋原來的小狗。 程式碼如下:

import pygame,sys
pygame.init()
screen = pygame.display.set_mode([640,480])
screen.fill([255,255,255])
my_dog = pygame.image.load("timg.jpg") 
screen.blit(my_dog,[50,50])
pygame.display.flip()
pygame.time.delay(2000)
screen.blit(my_dog,[150,50])
pygame.draw.rect(screen,[255,255,255],[50,50,90,90],0)
pygame.display.flip()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
pygame.quit()

在這裡插入圖片描述