将颜色从字符指针转换为整数以用于LibX

后端开发 2026-07-12

我正在为一个学校项目制作一个线框三维模型的等轴测投影,使用Libx的一个名为Minilibx的 API。

输入的字符指针color的格式是 0xffffff

输入的字符指针 *hexa是我使用的基础 0123456789abcdef

我可以使用一些自制函数以及math.h中的函数,但在使用那些可能提供直接解决方案的库方面,我的限制很大。

从我作为输入的地图得到一个char *str "0xffffff",我需要把它转换成一个 int color

这个int color是一个整型,存储颜色的数值,在字符字符串中表示为红、绿、蓝三色的组合,取值范围从 0255

在尝试以下函数

int hexint(char *color, char *hexa)
{
    int     i;
    int     len;
    int     j;
    int     color_int;

    i = 0;
    color_int = 0;
    if (!color)
        return (16777215);
    hexa++;
    hexa++;
    while (color[i])
        i++;
    len = (i - 1);
    while (--i >= 0)
    {
        j = 0;
        while (color[i] != hexa[j])
            j++;
        color_int += j * int_pow(16, int_abs((i - len)));
    }
    return (color_int);
}

之后,我得到一个整数,表示所有十六进制值的和。

内部使用的函数声明为:

int int_pow(int base, int exponent)
{
    int result;

    if (exponent == 0)
        return (1);
    result = base;
    while (--exponent > 0)
        result *= base;
    return (result);
}

int int_abs(int value)
{
    if (value < 0)
        value *= -1;
    return (value);
}

我不会把mlx_linux库的全部贴在这里,因为它很庞大。也不会解释它是如何与X11交互的,简单地说,因为我也不清楚。

但我用来把像素写入到放到我的窗口中的图像的函数是

void    pixel_put(t_data *img, int x, int y, int color)
{
    char    *dst;

    dst = img->addr + (y * img->line + x * (img->bpp / 8));
    *(unsigned int *)dst = color;
}

问题在于 hexint 似乎能正确解释基本颜色并且是白色,但当它是颜色混合时就会得到错误的颜色。因此所有的“组合”颜色都是完全错误的。

我发现问题来自这样一个事实:从 0255 的多种颜色编码可能会相加得到同一个整数,导致我在 put_pixel function 里产生混淆。

我不明白如何正确区分这些整数的组合,以便:

  • 每个颜色对应的输出整数必须对每种颜色都是唯一的
  • 如何从单个字符开始就能准确地计算它的值

在此先感谢你宝贵的帮助

解决方案

#include <stdio.h>
#include <stdlib.h>

long int text_to_color (const char *text)
{
        if (!text) return 0xffffff;
        return strtol (text, 0, 16);
}

int main(int argc, char *argv[])
{
        printf ("%ld\n", text_to_color (0));
        printf ("%ld\n", text_to_color ("0"));
        printf ("%ld\n", text_to_color ("123456"));
        printf ("%ld\n", text_to_color ("0x123456"));
        return 0;
}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章