Rust图像主色调提取库color-thief的使用,高效提取图片主题色与调色板生成

Rust图像主色调提取库color-thief的使用,高效提取图片主题色与调色板生成

color-thief-rs

color-thief-rs是color-thief算法在Rust中的重新实现。该实现是基于同一个算法的Swift版本进行了大量修改。

差异点

  • 没有getColor方法,因为它只是getPalette的简写
  • 输出颜色与JS版本略有不同

性能

比JS版本快约150倍。

test q1  ... bench:   1,429,800 ns/iter (+/- 21,987)
test q10 ... bench:     854,297 ns/iter (+/- 25,468)

使用

依赖:Rust >= 1.13

Cargo.toml中添加:

[dependencies]
color-thief = "0.2"

许可证

color-thief-rs采用MIT许可证。

完整示例代码

以下是使用color-thief提取图片主题色和调色板的完整示例:

use color_thief::{Color, ColorFormat, ColorThief};
use image::open;

fn main() {
    // 加载图片
    let img = open("example.jpg").expect("Failed to open image").to_rgb8();
    
    // 创建ColorThief实例
    let color_thief = ColorThief::new();
    
    // 提取主色调
    let dominant_color = color_thief.get_color(&img, ColorFormat::Rgb, 10, true)
        .expect("Failed to get dominant color");
    
    // 提取调色板(最多10种颜色)
    let palette = color_thief.get_palette(&img, ColorFormat::Rgb, 10, 10, true)
        .expect("Failed to get palette");
    
    // 打印主色调
    println!("Dominant color: RGB({}, {}, {})", 
        dominant_color.r, dominant_color.g, dominant_color.b);
    
    // 打印调色板
    println!("Palette:");
    for (i, color) in palette.iter().enumerate() {
        println!("{}. RGB({}, {}, {})", i+1, color.r, color.g, color.b);
    }
}

代码说明

  1. 首先使用image库加载图片并转换为RGB格式
  2. 创建ColorThief实例用于颜色提取
  3. get_color方法提取主色调,参数说明:
    • ColorFormat::Rgb指定输出为RGB格式
    • 10是质量参数(1-10)
    • true表示是否忽略白色背景
  4. get_palette方法提取调色板,额外参数:
    • 第二个10表示要提取的颜色数量
  5. 最后打印提取的颜色信息

运行此代码前,请确保在Cargo.toml中添加了以下依赖:

[dependencies]
color-thief = "0.2"
image = "0.24"

1 回复

Rust图像主色调提取库color-thief使用指南

color-thief是一个高效的Rust库,用于从图像中提取主色调和生成调色板。它基于中位切割算法(Median Cut),能够快速分析图像并返回最具代表性的颜色。

安装方法

Cargo.toml中添加依赖:

[dependencies]
color-thief = "0.2"
image = "0.24"  # 用于加载图像

基本用法

1. 提取主色调

use color_thief::{Color, ColorFormat};
use image::open;

fn main() {
    // 加载图像
    let img = open("example.jpg").unwrap().to_rgb8();
    
    // 提取主色调
    let color = color_thief::get_palette(
        img.as_raw(),
        ColorFormat::Rgb,
        10,  // 质量设置(1-10)
        1    // 要提取的颜色数量
    ).unwrap();
    
    println!("主色调: {:?}", color[0]);
}

2. 生成调色板

use color_thief::{Color, ColorFormat};
use image::open;

fn main() {
    let img = open("example.jpg").unwrap().to_rgb8();
    
    // 生成包含5种颜色的调色板
    let palette = color_thief::get_palette(
        img.as_raw(),
        ColorFormat::Rgb,
        10,  // 质量
        5    // 颜色数量
    ).unwrap();
    
    println!("调色板:");
    for color in palette {
        println!("RGB: ({}, {}, {})", color.r, color.g, color.b);
    }
}

高级用法

1. 处理不同颜色格式

// 处理RGBA格式图像
let img = open("example.png").unwrap().to_rgba8();
let palette = color_thief::get_palette(
    img.as_raw(),
    ColorFormat::Rgba,
    10,
    5
).unwrap();

2. 自定义质量参数

质量参数(1-10)影响计算精度和性能:

// 高质量但较慢
let palette = color_thief::get_palette(img_data, ColorFormat::Rgb, 10, 5);

// 低质量但更快
let palette = color_thief::get_palette(img_data, ColorFormat::Rgb, 3, 5);

3. 处理大图像

对于大图像,可以先缩小以提高性能:

use image::imageops::resize;

let img = open("large.jpg").unwrap().to_rgb8();
let small_img = resize(&img, 300, 300, image::imageops::FilterType::Triangle);

let palette = color_thief::get_palette(
    small_img.as_raw(),
    ColorFormat::Rgb,
    8,
    5
).unwrap();

实际应用示例

生成网站主题色

use color_thief::{Color, ColorFormat};
use image::open;

fn generate_theme(image_path: &str) -> String {
    let img = open(image_path).unwrap().to_rgb8();
    let palette = color_thief::get_palette(
        img.as_raw(),
        ColorFormat::Rgb,
        8,
        3
    ).unwrap();
    
    format!(
        "body {{ background-color: #{:02x}{:02x}{:02x}; }}\n\
         .primary {{ color: #{:02x}{:02x}{:02x}; }}\n\
         .secondary {{ color: #{:02x}{:02x}{:02x}; }}",
        palette[0].r, palette[0].g, palette[0].b,
        palette[1].r, palette[1].g, palette[1].b,
        palette[2].r, palette[2].g, palette[2].b
    )
}

性能提示

  1. 对于实时应用,使用较低的质量参数(3-5)
  2. 处理前缩小大图像尺寸
  3. 缓存结果以避免重复计算

color-thief库提供了简单而强大的方式来从图像中提取有意义的颜色信息,非常适合用于图像处理、设计工具和UI主题生成等应用场景。

完整示例demo

下面是一个完整的示例,展示如何从图像中提取主色调并生成调色板:

use color_thief::{ColorFormat, get_palette};
use image::{open, DynamicImage};
use std::path::Path;

fn main() {
    // 定义图像路径
    let image_path = Path::new("example.jpg");
    
    // 加载并处理图像
    match process_image(image_path) {
        Ok(palette) => {
            println!("提取到的调色板:");
            for (i, color) in palette.iter().enumerate() {
                println!("{}. RGB: ({}, {}, {})", i+1, color.r, color.g, color.b);
                println!("   十六进制: #{:02x}{:02x}{:02x}", color.r, color.g, color.b);
            }
        }
        Err(e) => eprintln!("处理图像出错: {}", e),
    }
}

fn process_image(path: &Path) -> Result<Vec<color_thief::Color>, Box<dyn std::error::Error>> {
    // 打开图像并转换为RGB格式
    let img = open(path)?.to_rgb8();
    
    // 提取5种主色调,质量设置为8
    let palette = get_palette(
        img.as_raw(),
        ColorFormat::Rgb,
        8,
        5
    )?;
    
    Ok(palette)
}

这个完整示例包含以下功能:

  1. 从指定路径加载图像
  2. 将图像转换为RGB格式
  3. 使用质量参数8提取5种主色调
  4. 打印每种颜色的RGB值和十六进制值
  5. 包含错误处理逻辑

使用时只需将"example.jpg"替换为您要处理的图像路径即可。

回到顶部