RGB24位、RGB555、RGB565的疑惑

benben_shayatou 2010-11-22 10:23:34
RGB24位中每一个分量用8位来表示,那么每一位的范围应该是0~255,而RGB555、RGB565中各个分量表示所用的位数为5、5、5或者5、6、5,那么这样在三者之间进行转换的时候不会有很大的损失吗?
我想搞清楚这些需要看些什么资料呀,有经验的同志们帮帮忙吧!
...全文
741 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoujk 2010-11-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ronghuaqiu 的回复:]
貌似影响不大
[/Quote]
你用数学工具来看一下,如直方图,就知道了,影响还是很大的,特别是对于需要把这些图做为参数进行运算的算法,可能导致结果出现很大的差异
[Quote=引用 4 楼 benben_shayatou 的回复:]
我进行了实验,可以进行移位并补偿的方法来获取转化后的值,总体上来说这些转化对结果的影响不是很大^_^
[/Quote]
移动是将色彩损失限制到高位或者低位,而保留中间的过度色。你用这算法把图像转换以后,再用它的逆运算转换成 24 位,然后将两张图像相减并取绝对值,就会看到一些差异
验证码识别 2010-11-25
  • 打赏
  • 举报
回复
这个就是一个颜色合并, 当然有图象失真了
ronghuaqiu 2010-11-25
  • 打赏
  • 举报
回复
貌似影响不大
benben_shayatou 2010-11-25
  • 打赏
  • 举报
回复
我进行了实验,可以进行移位并补偿的方法来获取转化后的值,总体上来说这些转化对结果的影响不是很大^_^
leewckk 2010-11-23
  • 打赏
  • 举报
回复
网络上找的像素操作的类的封装,希望对你有帮助:
//RGB24
void CPixelRGB24::ConvertByCover(unsigned char * inPixel)
{
if (inPixel)
{
*inPixel = m_TargetB;
inPixel++;
*inPixel = m_TargetG;
inPixel++;
*inPixel = m_TargetR;
}
}

//RGB555
void CPixelRGB555::ConvertByCover(unsigned char * inPixel)
{
if (inPixel)
{
*inPixel = m_Mask[0];
inPixel++;
*inPixel = m_Mask[1];
}
}

void CPixelRGB555::SideEffectColorChanged(void)
{
CBasePixel::SideEffectColorChanged();

const unsigned int bits555[] = {0x7C00, 0x03E0, 0x001F}; // RGB
// Caculate the mask bits
unsigned int wMask, wTemp;
wTemp = unsigned int (m_TargetB / 256. * 32);
wMask = wTemp & bits555[2];
wTemp = unsigned int (m_TargetG / 256. * 32);
wTemp = wTemp << 5;
wMask += wTemp & bits555[1];
wTemp = unsigned int (m_TargetR / 256. * 32);
wTemp = wTemp << 10;
wMask += wTemp & bits555[0];
// Store the high byte and low byte seperately
m_Mask[0] = wMask & 0xff;
wMask = wMask >> 8;
m_Mask[1] = wMask & 0xff;
}


//RGB565

void CPixelRGB565::ConvertByCover(unsigned char * inPixel)
{
if (inPixel)
{
*inPixel = m_Mask[0];
inPixel++;
*inPixel = m_Mask[1];
}
}

void CPixelRGB565::SideEffectColorChanged(void)
{
CBasePixel::SideEffectColorChanged();

const unsigned int bits565[] = {0xF800, 0x07E0, 0x001F}; // RGB
// Caculate the mask bits
unsigned int wMask, wTemp;
wTemp = unsigned int (m_TargetB / 256. * 32);
wMask = wTemp & bits565[2];
wTemp = unsigned int (m_TargetG / 256. * 64);
wTemp = wTemp << 5;
wMask += wTemp & bits565[1];
wTemp = unsigned int (m_TargetR / 256. * 32);
wTemp = wTemp << 11;
wMask += wTemp & bits565[0];
// Store the high byte and low byte seperately
m_Mask[0] = wMask & 0xff;
wMask = wMask >> 8;
m_Mask[1] = wMask & 0xff;
}
Rico_Liu 2010-11-22
  • 打赏
  • 举报
回复
RGB555对应的值为0~31
这几个相互转换好像就是简单的映射。
就像
RGB888的中一个64转成RGB555
为64×(32/256)
一个乘法运算而已,开销不大

19,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧