Mixbox色彩混合库C版使用指南

Mixbox色彩混合库C版使用指南

还在为传统RGB线性混合产生的灰暗、不自然的颜色过渡而烦恼吗?Mixbox基于真实颜料物理原理,提供自然的色彩混合效果,让蓝色和黄色混合出鲜活的绿色,而不是沉闷的灰色。本文将详细介绍如何在C/C++项目中使用Mixbox库。

什么是Mixbox?

Mixbox是一种基于Kubelka-Munk理论的色彩混合方法,它模拟真实颜料的物理混合行为。与传统的RGB线性混合不同,Mixbox能够:

  • 🎨 产生饱和的色彩渐变
  • 🌈 实现自然的色调偏移
  • 🖌️ 生成逼真的二次色
  • 🔄 简单的RGB输入输出接口

快速开始

1. 获取Mixbox C++库

首先将Mixbox库文件添加到您的项目中:

// 下载或复制以下文件到您的项目目录:
// - mixbox.h   (头文件)
// - mixbox.cpp (实现文件)

2. 基本色彩混合

使用mixbox_lerp函数进行两色混合:

#include <stdio.h>
#include "mixbox.h"

int main() {
    // 定义两个颜色:蓝色和黄色
    unsigned char r1 =   0, g1 = 33,  b1 = 133; // 钴蓝色
    unsigned char r2 = 252, g2 = 211, b2 = 0;   // 汉莎黄色
    float t = 0.5;                              // 混合比例 (0.0-1.0)
    unsigned char r, g, b;                      // 结果颜色

    // 执行色彩混合
    mixbox_lerp(r1, g1, b1,   // 第一个颜色
                r2, g2, b2,   // 第二个颜色
                t,            // 混合比例
                &r, &g, &b);  // 输出结果

    printf("混合结果: %d %d %d\n", r, g, b);
    return 0;
}

3. 编译和运行

使用您喜欢的编译器进行编译:

# 使用gcc编译
gcc -o mixbox_demo mixbox.cpp main.c -lstdc++ -lm

# 或者使用g++
g++ -o mixbox_demo mixbox.cpp main.cpp -lm

# 运行程序
./mixbox_demo

高级功能

多颜色混合

Mixbox支持同时混合多个颜色:

#include "mixbox.h"

void mix_multiple_colors() {
    unsigned char r1 = 255, g1 = 39,  b1 = 2;   // 镉红色
    unsigned char r2 = 252, g2 = 211, b2 = 0;   // 汉莎黄色
    unsigned char r3 = 0,   g3 = 33,  b3 = 133; // 钴蓝色
    
    mixbox_latent z1, z2, z3, z_mix;
    unsigned char r, g, b;

    // 将RGB颜色转换为潜在空间表示
    mixbox_rgb_to_latent(r1, g1, b1, z1);
    mixbox_rgb_to_latent(r2, g2, b2, z2);
    mixbox_rgb_to_latent(r3, g3, b3, z3);

    // 在潜在空间中进行线性混合
    for (int i = 0; i < MIXBOX_LATENT_SIZE; i++) {
        // 混合比例:30% 红色, 60% 黄色, 10% 蓝色
        z_mix[i] = 0.3f * z1[i] + 0.6f * z2[i] + 0.1f * z3[i];
    }

    // 将混合结果转换回RGB空间
    mixbox_latent_to_rgb(z_mix, &r, &g, &b);
    
    printf("多色混合结果: %d %d %d\n", r, g, b);
}

浮点数颜色支持

Mixbox提供多种颜色格式支持:

void float_color_examples() {
    // 使用0-255整型颜色
    unsigned char r_byte = 255, g_byte = 100, b_byte = 50;
    
    // 使用0.0-1.0浮点颜色
    float r_float = 1.0f, g_float = 0.392f, b_float = 0.196f;
    
    // 使用线性空间浮点颜色
    float r_linear = 1.0f, g_linear = 0.141f, b_linear = 0.027f;
    
    mixbox_latent latent;
    unsigned char out_r, out_g, out_b;
    float out_rf, out_gf, out_bf;

    // 不同格式的转换函数
    mixbox_rgb_to_latent(r_byte, g_byte, b_byte, latent);
    mixbox_float_rgb_to_latent(r_float, g_float, b_float, latent);
    mixbox_linear_float_rgb_to_latent(r_linear, g_linear, b_linear, latent);
    
    // 相应的输出函数
    mixbox_latent_to_rgb(latent, &out_r, &out_g, &out_b);
    mixbox_latent_to_float_rgb(latent, &out_rf, &out_gf, &out_bf);
    mixbox_latent_to_linear_float_rgb(latent, &out_rf, &out_gf, &out_bf);
}

预定义颜料颜色

Mixbox基于13种真实颜料进行色彩建模:

颜料名称RGB值浮点RGB线性RGB颜色示例
镉黄色 (Cadmium Yellow)254, 236, 00.996, 0.925, 0.00.991, 0.839, 0.0🟨
汉莎黄色 (Hansa Yellow)252, 211, 00.988, 0.827, 0.00.973, 0.651, 0.0🟨
镉橙色 (Cadmium Orange)255, 105, 01.0, 0.412, 0.01.0, 0.141, 0.0🟧
镉红色 (Cadmium Red)255, 39, 21.0, 0.153, 0.0081.0, 0.02, 0.001🟥
喹吖啶酮洋红 (Quinacridone Magenta)128, 2, 460.502, 0.008, 0.180.216, 0.001, 0.027🟪
钴紫色 (Cobalt Violet)78, 0, 660.306, 0.0, 0.2590.076, 0.0, 0.054🟪
群青蓝 (Ultramarine Blue)25, 0, 890.098, 0.0, 0.3490.01, 0.0, 0.1🟦
钴蓝色 (Cobalt Blue)0, 33, 1330.0, 0.129, 0.5220.0, 0.015, 0.235🟦
酞菁蓝 (Phthalo Blue)13, 27, 680.051, 0.106, 0.2670.004, 0.011, 0.058🟦
酞菁绿 (Phthalo Green)0, 60, 500.0, 0.235, 0.1960.0, 0.045, 0.032🟩
永久绿 (Permanent Green)7, 109, 220.027, 0.427, 0.0860.002, 0.153, 0.008🟩
树汁绿 (Sap Green)107, 148, 40.42, 0.58, 0.0160.147, 0.296, 0.001🟩
熟赭色 (Burnt Sienna)123, 72, 00.482, 0.282, 0.00.198, 0.065, 0.0🟫

实际应用示例

创建色彩渐变

#include "mixbox.h"
#include <vector>

std::vector<unsigned char> create_gradient(
    unsigned char r1, unsigned char g1, unsigned char b1,
    unsigned char r2, unsigned char g2, unsigned char b2,
    int steps
) {
    std::vector<unsigned char> gradient;
    gradient.reserve(steps * 3);
    
    for (int i = 0; i < steps; i++) {
        float t = static_cast<float>(i) / (steps - 1);
        unsigned char r, g, b;
        
        mixbox_lerp(r1, g1, b1, r2, g2, b2, t, &r, &g, &b);
        
        gradient.push_back(r);
        gradient.push_back(g);
        gradient.push_back(b);
    }
    
    return gradient;
}

// 使用示例:创建从蓝色到黄色的渐变
auto gradient = create_gradient(0, 33, 133, 252, 211, 0, 10);

图像处理应用

#include "mixbox.h"
#include <stdint.h>

void apply_mixbox_to_image(
    uint8_t* image_data, 
    int width, 
    int height,
    unsigned char target_r, 
    unsigned char target_g, 
    unsigned char target_b,
    float strength
) {
    for (int y = 0; y < height; y++) {
        for (int x = 0; x < width; x++) {
            int index = (y * width + x) * 3;
            
            unsigned char r = image_data[index];
            unsigned char g = image_data[index + 1];
            unsigned char b = image_data[index + 2];
            
            unsigned char mixed_r, mixed_g, mixed_b;
            mixbox_lerp(r, g, b, target_r, target_g, target_b, 
                       strength, &mixed_r, &mixed_g, &mixed_b);
            
            image_data[index] = mixed_r;
            image_data[index + 1] = mixed_g;
            image_data[index + 2] = mixed_b;
        }
    }
}

性能优化技巧

1. 批量处理

void batch_mixbox_lerp(
    const unsigned char* colors1,
    const unsigned char* colors2,
    const float* ratios,
    unsigned char* results,
    int count
) {
    #pragma omp parallel for
    for (int i = 0; i < count; i++) {
        int idx = i * 3;
        mixbox_lerp(
            colors1[idx], colors1[idx+1], colors1[idx+2],
            colors2[idx], colors2[idx+1], colors2[idx+2],
            ratios[i],
            &results[idx], &results[idx+1], &results[idx+2]
        );
    }
}

2. 预计算潜在空间

void precompute_latents(
    const unsigned char* rgb_colors,
    mixbox_latent* latents,
    int count
) {
    for (int i = 0; i < count; i++) {
        int idx = i * 3;
        mixbox_rgb_to_latent(
            rgb_colors[idx], rgb_colors[idx+1], rgb_colors[idx+2],
            latents[i]
        );
    }
}

void fast_mixing(
    const mixbox_latent* latents1,
    const mixbox_latent* latents2,
    const float* ratios,
    unsigned char* results,
    int count
) {
    for (int i = 0; i < count; i++) {
        mixbox_latent mixed;
        for (int j = 0; j < MIXBOX_LATENT_SIZE; j++) {
            mixed[j] = (1 - ratios[i]) * latents1[i][j] + 
                       ratios[i] * latents2[i][j];
        }
        mixbox_latent_to_rgb(mixed, 
            &results[i*3], &results[i*3+1], &results[i*3+2]);
    }
}

常见问题解答

Q: Mixbox与传统RGB混合有何不同?

A: 传统RGB混合是线性操作,经常产生灰暗、不自然的结果。Mixbox基于物理颜料混合原理,产生更自然、饱和的色彩过渡。

Q: 性能如何?

A: Mixbox经过高度优化,单次混合操作只需微秒级别的时间。对于实时应用,建议预计算或使用批处理。

Q: 支持哪些颜色空间?

A: 支持标准RGB(0-255)、浮点RGB(0.0-1.0)和线性RGB空间。

Q: 是否可以商用?

A: Mixbox采用CC BY-NC 4.0许可证,非商业使用免费。商业使用需要联系作者获取商业许可证。

完整示例项目

// mixbox_demo.c - 完整的演示程序
#include <stdio.h>
#include <stdlib.h>
#include "mixbox.h"

void demo_basic_mixing() {
    printf("=== 基础色彩混合演示 ===\n");
    
    // 蓝色和黄色混合
    unsigned char blue[] = {0, 33, 133};
    unsigned char yellow[] = {252, 211, 0};
    
    for (float t = 0.0f; t <= 1.0f; t += 0.1f) {
        unsigned char r, g, b;
        mixbox_lerp(blue[0], blue[1], blue[2],
                   yellow[0], yellow[1], yellow[2],
                   t, &r, &g, &b);
        
        printf("比例 %.1f: RGB(%3d, %3d, %3d)\n", t, r, g, b);
    }
}

void demo_multicolor_mixing() {
    printf("\n=== 多颜色混合演示 ===\n");
    
    unsigned char red[] = {255, 39, 2};
    unsigned char yellow[] = {252, 211, 0};
    unsigned char blue[] = {0, 33, 133};
    
    mixbox_latent z_red, z_yellow, z_blue, z_mix;
    unsigned char r, g, b;
    
    mixbox_rgb_to_latent(red[0], red[1], red[2], z_red);
    mixbox_rgb_to_latent(yellow[0], yellow[1], yellow[2], z_yellow);
    mixbox_rgb_to_latent(blue[0], blue[1], blue[2], z_blue);
    
    // 尝试不同的混合比例
    float ratios[][3] = {
        {0.6f, 0.3f, 0.1f},  // 60%红, 30%黄, 10%蓝
        {0.3f, 0.6f, 0.1f},  // 30%红, 60%黄, 10%蓝
        {0.1f, 0.3f, 0.6f},  // 10%红, 30%黄, 60%蓝
    };
    
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < MIXBOX_LATENT_SIZE; j++) {
            z_mix[j] = ratios[i][0] * z_red[j] + 
                       ratios[i][1] * z_yellow[j] + 
                       ratios[i][2] * z_blue[j];
        }
        
        mixbox_latent_to_rgb(z_mix, &r, &g, &b);
        printf("比例 %.0f:%.0f:%.0f: RGB(%3d, %3d, %3d)\n",
               ratios[i][0]*100, ratios[i][1]*100, ratios[i][2]*100,
               r, g, b);
    }
}

int main() {
    printf("Mixbox C/C++ 库演示程序\n");
    printf("=======================\n");
    
    demo_basic_mixing();
    demo_multicolor_mixing();
    
    printf("\n演示完成!\n");
    return 0;
}

编译和运行说明

编译命令

# 使用gcc编译(需要链接C++标准库)
gcc -o mixbox_demo mixbox.cpp mixbox_demo.c -lstdc++ -lm -O2

# 使用g++编译
g++ -o mixbox_demo mixbox.cpp mixbox_demo.cpp -lm -O2

# 启用OpenMP并行优化
g++ -o mixbox_demo mixbox.cpp mixbox_demo.cpp -lm -O2 -fopenmp

运行输出示例

Mixbox C/C++ 库演示程序
=======================
=== 基础色彩混合演示 ===
比例 0.0: RGB(  0,  33, 133)
比例 0.1: RGB( 25,  46, 119)
比例 0.2: RGB( 50,  65, 104)
比例 0.3: RGB( 79,  87,  88)
比例 0.4: RGB(112, 112,  70)
比例 0.5: RGB(148, 139,  50)
比例 0.6: RGB(183, 166,  31)
比例 0.7: RGB(213, 189,  15)
比例 0.8: RGB(232, 205,   5)
比例 0.9: RGB(244, 211,   1)
比例 1.0: RGB(252, 211,   0)

=== 多颜色混合演示 ===
比例 60:30:10: RGB(223, 108,  15)
比例 30:60:10: RGB(223, 166,  15)
比例 10:30:60: RGB( 66, 108, 108)

演示完成!

总结

Mixbox为C/C++开发者提供了一个强大而易用的色彩混合解决方案。通过模拟真实颜料的物理特性,它能够产生比传统RGB混合更自然、更生动的色彩效果。无论是图形应用程序、游戏开发还是图像处理,Mixbox都能为您的项目增添专业的色彩处理能力。

记住:蓝色和黄色混合应该产生鲜活的绿色,而不是沉闷的灰色——这就是Mixbox的魅力所在!


注意: 本文档中的代码示例基于Mixbox 2.0版本。使用时请确保遵守相应的开源许可证条款。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值