在 C 中从浮点数转换为无符号字符

Posted

技术标签:

【中文标题】在 C 中从浮点数转换为无符号字符【英文标题】:Converting from a float to an unsigned char in C 【发布时间】:2012-10-14 21:06:27 【问题描述】:

我正在尝试在 0 和 1 之间的双精度和用于处理图像的无符号字符之间进行转换。

到目前为止,我正在做的是我有一个浮点数组。

float array[length*4]

其中 4 来自 RGBA 颜色方案系统。然后我试试这个:

unsigned char newArray[4*length]
for (int i=0; i<4*length; i++)
    newArray[i] = 255*array[i];


for (int i=0; i<10; i++)
    printf("newArray: %d", newArray[i])

并得到以下输出:

newArray: 32
newArray: 128
newArray: 131
newArray: 0
newArray: 173
newArray: 224
newArray: 56
newArray: 60
newArray: 125
newArray: 104

什么时候应该是这样的:

should be: 0
should be: 75
should be: 140
should be: 255
should be: 1
should be: 79
should be: 143
should be: 255
should be: 1
should be: 84
should be: 150
should be: 255

我试过other methods,但它们不起作用。

我的问题是:如何在浮点数和无符号字符之间进行转换?

编辑:生成正确输出的代码是这样的:

for (i=0; i<length; i++) 
    [[data objectAtIndex:i] getRed:&red green:&green blue:&blue alpha:&alpha];
    array[i][0] = 255*red;
    array[i][1] = 255*green;
    array[i][2] = 255*blue;
    array[i][3] = 255*alpha;



for (i=0; i<10; i++) 
    NSLog(@"before: %f, %f, %f, %f", array[i][0],array[i][1],array[i][2],array[i][3]);

,我所做的只是编辑输出,所以它是

1
2
3
4

而不是1,2,3,4

【问题讨论】:

在没有更多信息的情况下在 float 和 unsigned char 之间进行转换是没有意义的。您希望它如何转换?到整数舍入值?给一个真实的角色? 您发布的输出的输入是什么? @Dani:这些值的输入是取自 UIColor 的 RGB 值。我将所有数据都放在一个原始数组中,并尝试在 floatunsigned char 之间进行转换以在 C 数组和 UIImage 之间进行转换。 @Joe:我希望它们是 RGB 值,ints 介于 0 和 255 之间。 @scott:我的意思是什么输入数字产生了这个特定的输出? 【参考方案1】:

转换此代码:

for (int i=0; i<4*length; i++)
    newArray[i] = 255*array[i];

到这里:

for (int i=0; i<4*length; i++)

    float f = 255*array[i];
    if (f < 0 || f > 255)
    
      printf("error, array[%d]=%f, 255*array[%d]=%f\n!", i, array[i], i, f);
      abort();
    
    newArray[i] = f;

它会告诉你你的浮点数不在 0 到 1 的范围内。

【讨论】:

以上是关于在 C 中从浮点数转换为无符号字符的主要内容,如果未能解决你的问题,请参考以下文章

将浮点数转换为无符号短时的舍入问题

C# 隐式运算符 MyType(int value) 自动“支持”从浮点数转换

从浮点数转换为 QByteArray

opencv c++:将图像矩阵从无符号字符转换为浮点数

在 SQLite 上转换表达式结果,从浮点数到十进制数

将 pandas 数据框列标签从浮点数转换为整数