2012-10-14 2 views
0

Я пытаюсь преобразовать между двойным, который находится между 0 и 1, и неподписанный символ для обработки изображения.Преобразование из float в unsigned char в C

Что я делаю до сих пор, у меня есть массив поплавков.

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, но они не работают.

Вопрос к вам: Как преобразовать между поплавком и символом без знака?

EDIT: код, который генерируется правильный вывод заключается в следующем:

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.

+0

Это бессмысленно, чтобы преобразовать между поплавком и без знака без дополнительной информации. Как вы ожидаете, что он будет преобразован? К целочисленному округленному значению? Для фактического персонажа? – Joe

+0

Каков вход для вывода, который вы опубликовали? – Dani

+0

@ Дани: вход для этих значений - значения RGB, взятые из UIColor. У меня есть все мои данные в необработанном массиве, и я пытаюсь преобразовать между 'float' и' unsigned char' для преобразования между массивом C и UIImage. – Scott

ответ

0

Преобразовать этот код:

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.

Смежные вопросы