我移植,从16位色彩深度打造以18位色深的软件。 我怎么能转换16位色18位色? 谢谢。
Answer 1:
如果不知道该设备,我只能猜测。 设备通常是红,绿,蓝所以每个颜色会得到变化的6位。 这意味着每个颜色和总共262,144种颜色的64种组合。
任何位图还可以扩展到该显示。 如果你把每个组件(比如,红色),规范它,然后乘以64,你将有缩放版本。
如果你问别的东西或想了解更多细节,请询问。
更新:
有两个16位位图格式。 一个是5-5-5(每像素5位),另一种是5-6-5(绿色得到一个额外的位)。 我假设5-5-5此转换的缘故。
对于每个像素内的每一颜色你需要的东西是这样的:
NewColor = (oldColor/32.0)*64
这将打开旧颜色分为0.0和1.0之间的数字,然后将其放大到新的值的范围。
Answer 2:
假定16位的颜色是在5-6-5格式:
// RRRRR-GGGGGG-BBBBB, 16bit -->
//RRRRR0-GGGGGG-BBBBB0, 18bit with the formula below:
Color18 = ((Color16 & 0xF800) << 2) | ((Color16 & 0x07E0) << 1) | ((Color16 & 0x1F) << 1);
Answer 3:
我没有看到这个盖在其他的答案,但是你想从5到6位的转换是这样的,二进制11111被映射到111111,因为两者都代表全上 。 要做到这一点的方法之一是复制领先位(S)。
red6 = (red5 << 1) | (red5 >> 4);
如果您使用的是算术转换,记住,最大的值是31和63,而不是32和64。
red6 = (red5 * 63 + 15) / 31; // all ints, +15 is for rounding
如果你关心其它中间值,例如,如果你想16映射32其一是调节式(例如,改变15〜14)或只是做一个表。
Answer 4:
要回答这个问题转换
我不熟悉C ++库图像,但我敢肯定,这个的代码已经存在某处。 但是,如果你愿意,你可以自己做。
每个像素有三个通道:红色,绿色和蓝色。 在一个16位的位图,每一个信道不具有相同数目的每个信道的位。 通常情况下,绿色是第一个拿到任何额外的比特,因为人眼对这种颜色最敏感的。
这也可能是565 - 蓝色5红,绿色6,和5。
对于一个18位的位图(如前所述),每个信道具有6个比特。 因此,绿色是很容易! 就在从16位格式拷贝值到18位格式。 其他两个信道是稍硬。 你必须插5至6:
18_Value = (16_Value / 32) * 64 //integers only of course. You need to round properly to get best results.
有你有它。 如果您还不熟悉下,我建议你研究它们:
- 位移位运算符
- 位图跨越
- 指针数学
- 字节对齐
- 编辑 - 确保你知道事情是如何在内存布局; RGB或BGR。 它会惹你的头,如果你做任何事情比这更复杂,你向后想着它(因为绿色是中间它并不适合这种转换是很重要)。
Answer 5:
你将首先得来访问每个色彩分量(即提取R值,G值,和B值)。 要做到这一点的方式将完全取决于颜色存储在内存中的方式。 如果它被保存为RGB,具有5-6-5位的组件,你可以使用这样的事情:
blueComponent = (colour & 0x1F);
greenComponent = (colour >> 5 ) & 0x3F;
redComponent = (colour >> 11) & 0x1F;
这将提取的颜色分量你,则可以使用以上概述的方法,以各成分(I假定18位将使用每个组件6个比特)的转换:
blueComponent = (blueComponent / 32.0) * 64;
//greenComponent = (greenComponent / 64.0) * 64; // not needed
redComponent = (redComponent / 32.0) * 64;
请注意,上面的代码,则需要使用32.0,或将确保你的计划是作为一个浮点数数一些其他的方法是很重要的。 然后将部件组合成的18位彩色,使用方法:
colour = (redComponent << 12) | (greenComponent << 6) | blueComponent;