设置指定颜色为新的颜色 - SetColorsToNewColor
函数简介
将图片中指定的颜色替换为新的颜色。此函数可以批量修改图片中所有匹配指定颜色的像素点,支持颜色范围匹配和精确匹配。常用于图片颜色替换、背景色修改、主题色更改等场景。可以同时替换多个颜色。
接口名称
SetColorsToNewColor
DLL调用
int SetColorsToNewColor(long ola, long image_ptr, string old_colors, string new_colors, int similarity)
参数定义:
ola
(长整型数): OLAPlug对象的指针,由 CreateCOLAPlugInterFace 接口生成。image_ptr
(长整型数): 要修改的图片句柄。old_colors
(字符串): 要替换的原始颜色列表,格式为"color1|color2|color3...",每个颜色为6位十六进制RGB值。new_colors
(字符串): 替换后的新颜色列表,格式同old_colors,必须与old_colors数量相同。similarity
(整型数): 颜色匹配的相似度阈值,范围0-255。0表示完全匹配,值越大表示匹配范围越宽松。
示例:
// 替换单个颜色示例
void ReplaceColorExample() {
long image = LoadImage(ola, "D:\\test\\source.png");
if (image != 0) {
// 将红色(FF0000)替换为蓝色(0000FF)
int ret = SetColorsToNewColor(ola, image, "FF0000", "0000FF", 10);
if (ret == 1) {
printf("颜色替换成功\n");
SaveImageFromPtr(ola, image, "D:\\test\\replaced.png");
}
FreeImagePtr(ola, image);
}
}
// 替换多个颜色示例
void ReplaceMultipleColorsExample() {
long image = LoadImage(ola, "D:\\test\\source.png");
if (image != 0) {
// 同时替换多个颜色:
// 红色(FF0000) -> 蓝色(0000FF)
// 绿色(00FF00) -> 黄色(FFFF00)
// 白色(FFFFFF) -> 灰色(808080)
const char* old_colors = "FF0000|00FF00|FFFFFF";
const char* new_colors = "0000FF|FFFF00|808080";
int ret = SetColorsToNewColor(ola, image, old_colors, new_colors, 20);
if (ret == 1) {
printf("多个颜色替换成功\n");
SaveImageFromPtr(ola, image, "D:\\test\\multi_replaced.png");
}
FreeImagePtr(ola, image);
}
}
// 替换背景色示例
void ReplaceBackgroundExample() {
long image = LoadImage(ola, "D:\\test\\source.png");
if (image != 0) {
// 获取左上角的颜色作为背景色
int bg_color = GetColorPtr(ola, image, 0, 0);
// 将背景色转换为十六进制字符串
char old_color[7];
sprintf(old_color, "%06X", bg_color & 0xFFFFFF);
// 替换为新的背景色(例如:浅蓝色)
int ret = SetColorsToNewColor(ola, image, old_color, "E0F0FF", 30);
if (ret == 1) {
printf("背景色替换成功\n");
SaveImageFromPtr(ola, image, "D:\\test\\new_background.png");
}
FreeImagePtr(ola, image);
}
}
// 创建主题色变体
void CreateColorVariantsExample() {
long image = CreateImage(ola, 200, 200);
if (image != 0) {
// 填充原始颜色
for (int y = 0; y < 200; y++) {
for (int x = 0; x < 200; x++) {
SetPixel(ola, image, x, y, 0x4CAF50); // Material Design 绿色
}
}
// 创建不同主题色的变体
const char* themes[] = {
"4CAF50", // 原始绿色
"2196F3", // 蓝色
"F44336", // 红色
"9C27B0", // 紫色
"FF9800" // 橙色
};
for (int i = 1; i < 5; i++) {
long variant = CopyImage(ola, image);
if (variant != 0) {
SetColorsToNewColor(ola, variant, themes[0], themes[i], 0);
char filename[256];
sprintf(filename, "D:\\test\\theme_%s.png", themes[i]);
SaveImageFromPtr(ola, variant, filename);
FreeImagePtr(ola, variant);
}
}
FreeImagePtr(ola, image);
}
}
COM调用
int SetColorsToNewColor(long image_ptr, string old_colors, string new_colors, int similarity)
参数定义:
image_ptr
(长整型数): 要修改的图片句柄。old_colors
(字符串): 要替换的原始颜色列表,格式为"color1|color2|color3...",每个颜色为6位十六进制RGB值。new_colors
(字符串): 替换后的新颜色列表,格式同old_colors,必须与old_colors数量相同。similarity
(整型数): 颜色匹配的相似度阈值,范围0-255。0表示完全匹配,值越大表示匹配范围越宽松。
示例:
# 替换单个颜色示例
def replace_color_example():
image = ola.LoadImage("D:\\test\\source.png")
if image != 0:
# 将红色(FF0000)替换为蓝色(0000FF)
if ola.SetColorsToNewColor(image, "FF0000", "0000FF", 10) == 1:
messagebox("颜色替换成功")
ola.SaveImageFromPtr(image, "D:\\test\\replaced.png")
ola.FreeImagePtr(image)
# 替换多个颜色示例
def replace_multiple_colors_example():
image = ola.LoadImage("D:\\test\\source.png")
if image != 0:
# 同时替换多个颜色
old_colors = "FF0000|00FF00|FFFFFF" # 红色、绿色、白色
new_colors = "0000FF|FFFF00|808080" # 蓝色、黄色、灰色
if ola.SetColorsToNewColor(image, old_colors, new_colors, 20) == 1:
messagebox("多个颜色替换成功")
ola.SaveImageFromPtr(image, "D:\\test\\multi_replaced.png")
ola.FreeImagePtr(image)
# 替换背景色示例
def replace_background_example():
image = ola.LoadImage("D:\\test\\source.png")
if image != 0:
# 获取左上角的颜色作为背景色
bg_color = ola.GetColorPtr(image, 0, 0)
# 将背景色转换为十六进制字符串
old_color = f"{bg_color & 0xFFFFFF:06X}"
# 替换为新的背景色(浅蓝色)
if ola.SetColorsToNewColor(image, old_color, "E0F0FF", 30) == 1:
messagebox("背景色替换成功")
ola.SaveImageFromPtr(image, "D:\\test\\new_background.png")
ola.FreeImagePtr(image)
# 创建主题色变体
def create_color_variants_example():
image = ola.CreateImage(200, 200)
if image != 0:
# 填充原始颜色
for y in range(200):
for x in range(200):
ola.SetPixel(image, x, y, 0x4CAF50) # Material Design 绿色
# 创建不同主题色的变体
themes = [
"4CAF50", # 原始绿色
"2196F3", # 蓝色
"F44336", # 红色
"9C27B0", # 紫色
"FF9800" # 橙色
]
for i in range(1, 5):
variant = ola.CopyImage(image)
if variant != 0:
ola.SetColorsToNewColor(variant, themes[0], themes[i], 0)
ola.SaveImageFromPtr(variant, f"D:\\test\\theme_{themes[i]}.png")
ola.FreeImagePtr(variant)
ola.FreeImagePtr(image)
# 调用示例函数
replace_color_example()
replace_multiple_colors_example()
replace_background_example()
create_color_variants_example()
返回值
整型数:
- 0: 替换失败
- 1: 替换成功
注意事项
- 颜色值使用6位十六进制RGB格式,不包含透明度信息
- 原始颜色列表和新颜色列表的数量必须相同
- 相似度值越大,匹配的颜色范围越广,但可能会影响不需要替换的颜色
- 对于精确的颜色替换,建议将相似度设为0
- 处理大图片时,较大的相似度值可能会显著增加处理时间