Преобразование значения цвета от плавания 0.. 1 к байту 0.. 255

Каков был бы корректный способ преобразовать значение цвета от плавания до байта? Сначала я думал b=f*255.0 должен сделать это, но теперь я думаю, это в этом случае только точное 1.0 будет преобразован в 255, но 0.9999 уже будет 254 который является, вероятно, не, что я хочу...

Это кажется этим b=f*256.0 было бы лучше за исключением того, что это будет иметь нежелательный случай создания 256 в случае точного 1.0.

В конце я использую это:

#define F2B(f) ((f) >= 1.0 ? 255 : (int)((f)*256.0))
19
задан inkredibl 16 December 2009 в 12:49
поделиться

3 ответа

1.0 is the only case that can go wrong, so handle that case separately:

b = floor(f >= 1.0 ? 255 : f * 256.0)

Also, it might be worth forcing that f really is 0<=f<=1 to avoid incorrect behaviour due to rounding errors (eg. f=1.0000001).

f2 = max(0.0, min(1.0, f))
b = floor(f2 == 1.0 ? 255 : f2 * 256.0)

Alternative safe solutions:

b = (f >= 1.0 ? 255 : (f <= 0.0 ? 0 : (int)floor(f * 256.0)))

or

b = max(0, min(255, (int)floor(f * 256.0)))
26
ответ дан 30 November 2019 в 03:02
поделиться

I believe the correct is floor(f*256), not round. This will map the interval 0..1 to exactly 256 zones of equal length.

[EDIT] and check 256 as a special case.

0
ответ дан 30 November 2019 в 03:02
поделиться

Почему бы не попробовать что-нибудь вроде

b=f*255.999

Избавляется от специального случая f==1, но 0.999 - это все равно 255

.
7
ответ дан 30 November 2019 в 03:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: