将颜色从字符指针转换为整数以用于LibX
我正在为一个学校项目制作一个线框三维模型的等轴测投影,使用Libx的一个名为Minilibx的 API。
输入的字符指针color的格式是 0xffffff
输入的字符指针 *hexa是我使用的基础 0123456789abcdef
我可以使用一些自制函数以及math.h中的函数,但在使用那些可能提供直接解决方案的库方面,我的限制很大。
从我作为输入的地图得到一个char *str "0xffffff",我需要把它转换成一个 int color
这个int color是一个整型,存储颜色的数值,在字符字符串中表示为红、绿、蓝三色的组合,取值范围从 0 到 255。
在尝试以下函数
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 似乎能正确解释基本颜色并且是白色,但当它是颜色混合时就会得到错误的颜色。因此所有的“组合”颜色都是完全错误的。
我发现问题来自这样一个事实:从 0 到 255 的多种颜色编码可能会相加得到同一个整数,导致我在 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。