试试这个:
BYTE *bit=new BYTE[512*512*6];
int j=-2;
int i=-1;
for(int k=0;k<512*512;k++)
{
bit[++i]=ptr[++++j];
bit[++i]=ptr[j+1];
bit[++i]=ptr[j];
bit[++i]=ptr[j+1];
bit[++i]=ptr[j];
bit[++i]=ptr[j+1];
}
这将执行以下操作。
第一轮:
bit[0]=ptr[0];
bit[1]=ptr[1];
bit[2]=ptr[0];
bit[3]=ptr[1];
bit[4]=ptr[0];
bit[5]=ptr[1];
第二轮:
bit[6]=ptr[2];
bit[7]=ptr[3];
bit[8]=ptr[2];
bit[9]=ptr[3];
bit[10]=ptr[2];
bit[11]=ptr[3];
...等等。
其实你不需要i和j:
BYTE *bit=new BYTE[512*512*6];
for(int k=0;k<512*512;k++)
{
bit[6*k]=ptr[2*k];
bit[6*k+1]=ptr[2*k+1];
bit[6*k+2]=ptr[2*k];
bit[6*k+3]=ptr[2*k+1];
bit[6*k+4]=ptr[2*k];
bit[6*k+5]=ptr[2*k+1];
}
逆向运算(48位转16位):
BYTE *bit=new BYTE[512*512*6];
for(int k=0;k<512*512;k++)
{
ptr[2*k]=bit[6*k];
ptr[2*k+1]=bit[6*k+1];
}
如果RGB图像是非灰度的,那么你必须calculate the luminance每个像素并将亮度复制到16位灰度图像中:
BYTE *bit=new BYTE[512*512*6];
for(int k=0;k<512*512;k++)
{
unsigned int R=(bit[6*k]<<8)+bit[6*k+1];
unsigned int G=(bit[6*k+2]<<8)+bit[6*k+3];
unsigned int B=(bit[6*k+4]<<8)+bit[6*k+5];
unsigned int Y=(unsigned int)round(0.2126*R+0.7152*G+0.0722*B);
ptr[2*k]=Y>>8;
ptr[2*k+1]=Y&0xFF;
}
此代码假定首先存储最高有效字节(大端)。如果您使用 little-endian 存储:
BYTE *bit=new BYTE[512*512*6];
for(int k=0;k<512*512;k++)
{
unsigned int R=(bit[6*k+1]<<8)+bit[6*k];
unsigned int G=(bit[6*k+3]<<8)+bit[6*k+2];
unsigned int B=(bit[6*k+5]<<8)+bit[6*k+4];
unsigned int Y=(unsigned int)round(0.2126*R+0.7152*G+0.0722*B);
ptr[2*k+1]=Y>>8;
ptr[2*k]=Y&0xFF;
}