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
相关产品推荐
相关产品推荐

