求打开ccd拍摄的12位图像转化成8位的源码。 谢谢。[email protected] 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这实际是如何制造调色板的问题,关于大于8位的位图转换为8位或小于8位的位图都是这样的问题。12位图的数据应该是 BBBB GGGG RRRR,一个简单的做法是取高3位的B,高3位的G,高2位的R,即BBB B(丢弃) GGG G(丢弃) RR RR(丢弃),合成一个8位值:BBBGGGRR.那么调色板这样构造: RGBQUAD pColors[256]; int i, j, k, index; for (k=0; k<8; k++) { for(j=0; j<8; j++) { for(i=0; i<4; i++) { index = (k << 5) + (j << 2) + i; pColors[index].rgbBlue = k * 255 / 7; pColors[index].rgbGreen = j * 255 / 7; pColors[index].rgbRed = i * 255 / 3; pColors[index].rgbReserved = 0; } } }这样得到的图像基本还可以。如果要求更好的质量可以进行颜色抖动,相对麻烦些。 给你个函数吧,里面有全局变量,但是核心都在。L_BOOL CDicomReader::ReadBits(BYTE *lpDesBits, BYTE *lpSrcBits, long length, int count){//按位读取数据length 为 lWidth*lHeight是图片象素数,根据其来判断输入输出 //数据的长度,count为读入的数据位数暂时只支持12为读入16位的格式。 switch ( count ) { case 12: //read 12 Bits long i; short * tempBits; tempBits = new short [length]; for( i=0;i<length;i++ ) { memcpy( tempBits + i,lpSrcBits + i+(int)(i/2) ,2 ); if( i%2 == 0 ) { tempBits[i] = tempBits[i] & 4095; } else { tempBits[i] = tempBits[i] & 65520; tempBits[i] = tempBits[i]>>4; } } memcpy(lpDesBits,tempBits,length*2); delete [] tempBits; break; default: return false; } return true;} 关于GetCurrentDirectory问题 VC 在dlg1中画到dlg2上 多次close, create udp socket后,为啥该socket接收不到之前server发过来的数据? 如何得到拨号网络和vpn等连接名和密码设置等,是注册表吗 初学者提问 PAL和NTSC这两种制式的不同都有哪些? 如何实现它们之间的转换(在pc机上) 散分(10分钟后结贴) ??????非常奇怪,在线?????? 各位大哥帮帮忙吧,vc 使用dll 无法解析的外部命令 很简单的socket问题 请问学vc应该学什么?学如何使用mfc库的的成员函数,还是......? 怎样使用全局数组
12位图的数据应该是 BBBB GGGG RRRR,一个简单的做法是取高3位的B,高3位的G,高2位的R,即
BBB B(丢弃) GGG G(丢弃) RR RR(丢弃),合成一个8位值:BBBGGGRR.那么调色板这样构造:
RGBQUAD pColors[256];
int i, j, k, index;
for (k=0; k<8; k++)
{
for(j=0; j<8; j++)
{
for(i=0; i<4; i++)
{
index = (k << 5) + (j << 2) + i;
pColors[index].rgbBlue = k * 255 / 7;
pColors[index].rgbGreen = j * 255 / 7;
pColors[index].rgbRed = i * 255 / 3;
pColors[index].rgbReserved = 0;
}
}
}这样得到的图像基本还可以。如果要求更好的质量可以进行颜色抖动,相对麻烦些。
long length, int count)
{//按位读取数据length 为 lWidth*lHeight是图片象素数,根据其来判断输入输出
//数据的长度,count为读入的数据位数暂时只支持12为读入16位的格式。 switch ( count )
{
case 12:
//read 12 Bits
long i;
short * tempBits; tempBits = new short [length]; for( i=0;i<length;i++ )
{
memcpy( tempBits + i,lpSrcBits + i+(int)(i/2) ,2 );
if( i%2 == 0 )
{
tempBits[i] = tempBits[i] & 4095;
}
else
{
tempBits[i] = tempBits[i] & 65520;
tempBits[i] = tempBits[i]>>4;
}
}
memcpy(lpDesBits,tempBits,length*2);
delete [] tempBits; break;
default:
return false;
}
return true;}