Попробуйте это:
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). Если вы используете мало-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;
}
А как насчет обратной операции, т.е. 48 битых 16bit изображений – user3845376
Я добавил обратную операцию до конца моего ответа. – kol
Спасибо Вам очень много – user3845376