| AWARE [SYSTEMS] | Imaging expertise for the Delphi developer | |||||||
![]() |
TIFF and LibTiff Mailing List Archive | |||||||
LibTiff Mailing List
TIFF and LibTiff Mailing List Archive Contact
The TIFF Mailing List Homepage |
Thread2004.01.14 18:18 "Re: COLORMAP and byte padding", by Marti MariaHi, > For the perfectionists who are wondering: multiplying by 257 works perfectly. In > effect, it makes the least significant byte a copy of the most significant byte > of the 16-bit value. In C: > > uint16val = ((uint8val << 8) | uint8val); > > Note that when reducing the 16-bit value to 8-bit, you could divide by 257 > and round, but it's way faster to simply take the upper byte (the same as > an integer division by 256, truncating everything after the decimal point). > Don't divide by 256 and round, because you will end up 1 too high in > 50% of the cases. In C: > > uint8val = (uint16val >> 8); > Yep, that is fast, but unfortunately can give significant errors, since that is same than dividing by 256. Here are a couple of macros that does the trick. #define RGB_8_TO_16(rgb) (WORD) ((((WORD) (rgb)) << 8)|(rgb)) #define RGB_16_TO_8(rgb) (BYTE) ((((rgb) * 65281 + 8388608) >> 24) & 0xFF) Regards, Marti Maria The little cms project http://www.littlecms.com marti@littlecms.com |
|||||||