int->BYTE
От: gok Россия  
Дата: 02.12.05 21:58
Оценка:
чотт зациклило. Как преобразовать int в BYTE и обратно?
Для int->BYTE нашел:
#define CVT(x) (((x) * 255L) / ((1L<<16)-1))

gok
Re: int->BYTE
От: Кодт Россия  
Дата: 02.12.05 23:06
Оценка: 3 (1) +1
Здравствуйте, gok, Вы писали:

gok>чотт зациклило. Как преобразовать int в BYTE и обратно?


Вообще-то,
int i;
unsigned char b;
char c;

b = (unsigned char)i; // при этом отбрасываются старшие разряды
i = (int)b;
i = (int)(unsigned char)c; // нужно сперва сделать беззнаковым, иначе знаковый разряд выйдет боком:
(int)'\xFF' == (int)((char)-1) == (int)(-1) == -1 == (int)0xFFFFFFFF;
(int)(unsigned char)'\xFF' = (int)(unsigned char)((char)-1) = (int)((unsigned char)0xFF) = (int)0xFF = 0xFF;


gok>Для int->BYTE нашел:

gok>#define CVT(x) (((x) * 255L) / ((1L<<16)-1))


Что это за мрачная формула: x*(2^8-1)/(2^16-1) — в чём её серемяжный смысл?
Перекуём баги на фичи!
Re[2]: int->BYTE
От: gok Россия  
Дата: 05.12.05 22:46
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Что это за мрачная формула: x*(2^8-1)/(2^16-1) — в чём её серемяжный смысл?



Из либтифф-а, загоняет целые значения для цвета.
Спасибо большое за помощь!
gok
Re[3]: int->BYTE
От: Кодт Россия  
Дата: 05.12.05 22:58
Оценка:
Здравствуйте, gok, Вы писали:

К>>Что это за мрачная формула: x*(2^8-1)/(2^16-1) — в чём её серемяжный смысл?


gok>Из либтифф-а, загоняет целые значения для цвета.

gok>Спасибо большое за помощь!

Аааа. Я понял. Имеется в виду, что на входе 16 бит на цвет (или на градации серого), а в TIFF — только 8. И нужно сделать постеризацию.

Есть два способа сделать это:
1) просто выкинуть младший байт и расслабиться
2) выполнить пересчёт: [0..2^16-1] равномерно отобразить на [0..2^8-1] — что мы и наблюдаем в формуле
Перекуём баги на фичи!
Re[4]: int->BYTE
От: gok Россия  
Дата: 06.12.05 02:01
Оценка:
Здравствуйте, Кодт, Вы писали:

К>2) выполнить пересчёт: [0..2^16-1] равномерно отобразить на [0..2^8-1] — что мы и наблюдаем в формуле




Вне темы, «спортивного ради…»: почему бы этот коэф не подсчитать один раз на всю жизнь? Или это выигрышь в вычислении целых?
gok
Re[5]: int->BYTE
От: Plague Россия 177230800
Дата: 06.12.05 07:55
Оценка:
Здравствуйте, gok, Вы писали:

gok>Здравствуйте, Кодт, Вы писали:


К>>2) выполнить пересчёт: [0..2^16-1] равномерно отобразить на [0..2^8-1] — что мы и наблюдаем в формуле


gok>


gok>Вне темы, «спортивного ради…»: почему бы этот коэф не подсчитать один раз на всю жизнь? Или это выигрышь в вычислении целых?


А компилятор на что?? )) Тем более так, вроде, нагляднее чем МАГИЧЕСКИЕ числа. ))
Re[6]: int->BYTE
От: donsergio  
Дата: 06.12.05 09:42
Оценка:
Здравствуйте, Plague, Вы писали:

P>А компилятор на что?? )) Тем более так, вроде, нагляднее чем МАГИЧЕСКИЕ числа. ))


Еще нагляднее будет обернуть в макрос, тогда МАГИЧЕСКИХ чисел будет еще меньше
Re[4]: int->BYTE
От: achp  
Дата: 06.12.05 11:36
Оценка:
Здравствуйте, Кодт, Вы писали:

К>2) выполнить пересчёт: [0..2^16-1] равномерно отобразить на [0..2^8-1] — что мы и наблюдаем в формуле


Нет, не наблюдаем. Только одно значение 0xFFFF отображается в 0xFF. Таким образом, скажем, значение 0xFFFE, в шестнадцатибитной кодировке по своей яркости максимально близкое к 0xFFFF, отобразится в 0xFE, восьмибитому коду, обозначающему уровень яркости, равный шестнадцатибитному 0xFEFE.
Re[5]: int->BYTE
От: Кодт Россия  
Дата: 06.12.05 12:00
Оценка:
Здравствуйте, achp, Вы писали:

К>>2) выполнить пересчёт: [0..2^16-1] равномерно отобразить на [0..2^8-1] — что мы и наблюдаем в формуле


A>Нет, не наблюдаем. Только одно значение 0xFFFF отображается в 0xFF. Таким образом, скажем, значение 0xFFFE, в шестнадцатибитной кодировке по своей яркости максимально близкое к 0xFFFF, отобразится в 0xFE, восьмибитому коду, обозначающему уровень яркости, равный шестнадцатибитному 0xFEFE.


Ну естественно, что формула кривая. Правильная должна выглядеть так: round(x*nom/den), а с учётом целочисленности — это (x*nom+den/2)/den
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.