我有16位灰度图像的原始数据。我想通过将相同的值复制到所有3个通道来制作48位RGB图像。 现在我在做:
BYTE *bit=new BYTE[512*512*6];
int j=-1;
int i=0;
for(int k=0;k<512*512;k++)
{
bit[i]=ptr[++j];
bit[++i]=ptr[j];
bit[++i]=ptr[j];
bit[++i]=ptr[++j];
bit[++i]=ptr[j];
bit[++i]=ptr[j];
i++;
}
此代码会产生淡黄色调。是否需要换位?
答案 0 :(得分:2)
试试这个:
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;
}
此代码假定首先存储最重要的字节(big-endian)。如果您使用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;
}