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);
}
}
代码说明
- 首先使用
image
库加载图片并转换为RGB格式 - 创建
ColorThief
实例用于颜色提取 get_color
方法提取主色调,参数说明:ColorFormat::Rgb
指定输出为RGB格式10
是质量参数(1-10)true
表示是否忽略白色背景
get_palette
方法提取调色板,额外参数:- 第二个
10
表示要提取的颜色数量
- 第二个
- 最后打印提取的颜色信息
运行此代码前,请确保在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
)
}
性能提示
- 对于实时应用,使用较低的质量参数(3-5)
- 处理前缩小大图像尺寸
- 缓存结果以避免重复计算
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)
}
这个完整示例包含以下功能:
- 从指定路径加载图像
- 将图像转换为RGB格式
- 使用质量参数8提取5种主色调
- 打印每种颜色的RGB值和十六进制值
- 包含错误处理逻辑
使用时只需将"example.jpg"替换为您要处理的图像路径即可。