1. 程式人生 > 實用技巧 >RGB MIXER三原色混色器的製作

RGB MIXER三原色混色器的製作

我們都知道三原色紅綠藍(RGB)可以混合出所有的顏色,為什麼不作一個三原色混色器呢?查了一下資料,搞了一下午終於做好了

你可以用滑鼠移動三個白點,代表了三原色的量,下面就是不同混合得到的結果,在標題上你可以看到RGB三個數值。

code

# RGB MIXER
# author:XXXSANS 2020/8/4

import sys
import pygame
from pygame.locals import *

pygame.init()

screen = pygame.display.set_mode((640, 480), 0, 32)

pygame.display.set_caption(
'RGB MIXER') def create_scales(height): red_scale_surface = pygame.surface.Surface((640, height)) green_scale_surface = pygame.surface.Surface((640, height)) blue_scale_surface = pygame.surface.Surface((640, height)) for x in range(640): c = int((x / 640.) * 255.) red = (c, 0, 0) green
= (0, c, 0) blue = (0, 0, c) line_rect = Rect(x, 0, 1, height) pygame.draw.rect(red_scale_surface, red, line_rect) pygame.draw.rect(green_scale_surface, green, line_rect) pygame.draw.rect(blue_scale_surface, blue, line_rect) return red_scale_surface, green_scale_surface, blue_scale_surface red_scale, green_scale, blue_scale
= create_scales(80) color = [127, 127, 127] while True: for event in pygame.event.get(): if event.type == QUIT: exit() screen.fill((0, 0, 0)) screen.blit(red_scale, (0, 00)) screen.blit(green_scale, (0, 80)) screen.blit(blue_scale, (0, 160)) x, y = pygame.mouse.get_pos() if pygame.mouse.get_pressed()[0]: for component in range(3): if component * 80 < y < (component + 1) * 80: color[component] = int((x / 639.) * 255.) pygame.display.set_caption("RGB MIXING - " + str(tuple(color))) for component in range(3): pos = (int((color[component] / 255.) * 639), component * 80 + 40) pygame.draw.circle(screen, (255, 255, 255), pos, 20) pygame.draw.rect(screen, tuple(color), (0, 240, 640, 240)) pygame.display.update()

簡單的補充一些知識

顏色的縮放

就是上面所說的把顏色變亮或者變暗. 一般來說,把顏色的RGB每一個數值乘以一個小於1的正小數,顏色看起來就會變暗了(記住RGB都是整數所以可能需要取整一下)。很自然的可以想到,如果乘以一個大於1的數,顏色就會變亮,不過同樣要記住每個數值最多255,所以一旦超過,你得把它歸為255!如果你乘的數字偏大,顏色很容易就為變成純白色,就失去了原來的色調。而且RGB也不可能是負數,所以謹慎選擇你的縮放係數!

顏色的混合

我們用一種叫做“線性插值(linear interpolation)”的方法來做這件事情。為了找到兩種顏色的中間色,我們將這第二種顏色與第一種顏色的差乘以一個0~1之間的小數,然後再加上第一種顏色就行了。如果這個數為0,結果就完全是第一種顏色;是1,結果就只剩下第二種顏色;中間的小數則會皆有兩者的特色。

很簡單但確實有很多要點,第一次搞這些東西還是很有成就感的