解决方案 »

  1.   

    这实际是如何制造调色板的问题,关于大于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;
                }
            }
        }这样得到的图像基本还可以。如果要求更好的质量可以进行颜色抖动,相对麻烦些。
      

  2.   

    给你个函数吧,里面有全局变量,但是核心都在。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;}