69,371
社区成员
发帖
与我相关
我的任务
分享
for(i = 0; i < LENGTH/LOOPDEEP;)
{
pbuf[index_16+1] = color_24to16(pvideo_buf + i);
pbuf[index_16+2] = color_24to16(pvideo_buf + i + BYTES);
pbuf[index_16+3] = color_24to16(pvideo_buf + i + 2*BYTES);
pbuf[index_16+4] = color_24to16(pvideo_buf + i + 3*BYTES);
index_16 += 4;
i += 4*BYTES;
}
#define LOOPDEEP 4
#define LENGTH (WIDTH * HEIGHT * BYTES)
#typedef unsigned char UINT8;
#typedef unsigned int UINT32;
//这个宏定义不知道括号配对没有,LZ自己再检查一下。之所以转换为UINT8是因为LZ之前的定义
//是char s[],有符号,有符号数右移行为是不确定的(符号位的问题)
#define color_24to16(pch) ((short)\
(*((UINT8*)pch) >> 3)|\
((*((UINT8*)pch + 1)>>2) <<5)|\
((*((UINT8*)pch + 2)>>3) <<11))
UINT32 index_16 = 0;
UINT32 i;
//如果LZ对效率要求比较苛刻的话,可以考虑像下面这样展开循环,不过这样可读性稍微差一点,
//kissoflife原来的代码可读性更好,LZ视情况自己选择吧。
//注意一点,如果LENGTH不是LOOPDEEP的整数倍的话,余下的LENGTH%OOPDEEP部分需要单独处理,
//因为这里正好LENGTH%OOPDEEP==0,所以我就没有单独处理这部分了
for(i = 0; i < LENGTH/LOOPDEEP;)
{
pbuf[index_16++] = color_24to16(pvideo_buf + i);//将24位颜色转换为16位
i += BYTES;
pbuf[index_16++] = color_24to16(pvideo_buf + i);//将24位颜色转换为16位
i += BYTES;
pbuf[index_16++] = color_24to16(pvideo_buf + i);//将24位颜色转换为16位
i += BYTES;
pbuf[index_16++] = color_24to16(pvideo_buf + i);//将24位颜色转换为16位
i += BYTES;
}
#define color_24to16(pch) ((short)(((*(pch) >> 3))|((*(pch + 1)>>2) <<5)|((*(pch + 2)>>3) <<11)))
#define color_24to16(pch) ((short)(((*pch >> 3))|((*(pch + 1)>>2) <<5)|((*(pch + 2)>>3) <<11)))
int length = WIDTH * HEIGHT * BYTES; // 数组总长度
int index_16 = 0;
int i;
for(i = 0; i < length; i += BYTES, index_16++)
{
pbuf[index_16] = color_24to16(pvideo_buf + i);//将24位颜色转换为16位
}
#define color_24to16(pch) ((short)(((*pch >> 3))|((*(pch + 1)>>2) <<5)|((*(pch + 2)>>3) <<11)))
int length = WIDTH * HEIGHT * BYTES; // 数组总长度
int index_24 = 0;
int index_16 = 0;
int i;
for(i = 0; i < length; i++)
{
pbuf[index_16++] = color_24to16(pvideo_buf + index_24);//将24位颜色转换为16位
index_24 += BYTES; // 调整源计数器
}