• 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()

    开发中遇到的问题,通过Google,

    stackoverflow(https://stackoverflow.com/questions/726549/algorithm-for-additive-color-mixing-for-rgb-values),

    wiki。。解决:

    颜色的缩放

    就是上面所说的把颜色变亮或者变暗. 一般来说,把颜色的RGB每一个数值乘以一个小于1的正小数,颜色看起来就会变暗了(记住RGB都是整数所以可能需要取整一下)。很自然的可以想到,如果乘以一个大于1的数,颜色就会变亮,不过同样要记住每个数值最多255,所以一旦超过,你得把它归为255!如果你乘的数字偏大,颜色很容易就为变成纯白色,就失去了原来的色调。而且RGB也不可能是负数,所以谨慎选择你的缩放系数!

    颜色的混合

    我们用一种叫做“线性插值(linear interpolation)”(https://en.wikipedia.org/wiki/Linear_interpolation)的方法来做这件事情。为了找到两种颜色的中间色,我们将这第二种颜色与第一种颜色的差乘以一个0~1之间的小数,然后再加上第一种颜色就行了。如果这个数为0,结果就完全是第一种颜色;是1,结果就只剩下第二种颜色;中间的小数则会皆有两者的特色。

    很简单但确实有很多要点,第一次搞这些东西还是很有成就感的

  • 相关阅读:
    快速幂,矩阵乘法,矩阵快速幂
    关于xor
    数位dp
    tarjan,割边,桥,割点
    RMQ,ST表,dp
    逆序对,树状数组,归并排序
    线段树
    dp,LCS
    清北 游
    青蛙的约会(扩展欧几里得)
  • 原文地址:https://www.cnblogs.com/xxxsans/p/13436578.html
Copyright © 2020-2023  润新知