You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CImg不同版本2D三角形颜色插值功能行为异常问题咨询

问题根因与修复方案

差异原因说明

  • CImg 2.4.5(版本号245)的颜色钳位问题:属于旧版本插值逻辑的已知Bug,颜色计算时直接使用unsigned char类型做中间运算,导致数值溢出后被强制钳位到255,无法执行正确的线性插值。
  • CImg 3.0.0(版本号300)插值完全失效问题:3.0大版本为了提升基础绘制性能,将draw_triangle()方法的顶点颜色插值开关默认值改为false,需要显式开启才能生效。

修复代码

调整参数并优化类型避免运算溢出,即可同时兼容两个版本:

#include <iostream>
#include <stdio.h>
#include "CImg.h"
using namespace cimg_library;

#define TITLE_LEN 100

int main() {
  char title [TITLE_LEN];
  snprintf(title, TITLE_LEN, "CImg version: %d", cimg_version);
  std::cout << title << "\n";

  // 用short类型存储中间结果避免无符号char溢出
  CImg<short> image(600, 200, 1, 3, 0);
  CImgDisplay main_disp(image, title);

  const unsigned char black[3] = {0, 0, 0};
  const unsigned char grey[3] = {100, 100, 100};
  const unsigned char white[3] = {255, 255, 255};

  // 单色填充不需要开启插值
  image.draw_triangle(100, 10, 10, 190, 190, 190, grey);

  // 最后一个参数显式开启顶点颜色插值
  image.draw_triangle(300, 10, 210, 190, 390, 190, white, black, white, 1, true);
  image.draw_triangle(500, 10, 410, 190, 590, 190, white, grey, white, 1, true);

  // 转回unsigned char输出显示
  CImg<unsigned char> disp_img = image.get_normalize(0,255);
  disp_img.display(main_disp);

  while (!main_disp.is_closed()) {
    main_disp.wait();
  }

  return 0;
}

后续建议

如果显式开启插值开关后300版本仍无法正常工作,属于版本Bug,可直接向CImg官方仓库提交Issue反馈。

内容的提问来源于stack exchange,提问作者mrdunk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 04:36:02