bmp 图片解析绘图 RGB 转YUV 查表法 ,降低CPU占有率

举报
aiot_bigbear 发表于 2022/09/25 02:36:05 2022/09/25
【摘要】 unsigned char y_r[256]; unsigned char y_g[256]; unsigned char y_b[256]; unsigned char u_r[256]; unsigned char u_g[256]; unsigned char u_b[256]; unsigned char v_r[256]; u...
unsigned char y_r[256];
unsigned char y_g[256];
unsigned char y_b[256];
unsigned char u_r[256];
unsigned char u_g[256];
unsigned char u_b[256];
unsigned char v_r[256];
unsigned char v_g[256];
unsigned char v_b[256];
void gif_init_Palette(void)
{
	int i=0;
	for(i=0;i<256;i++)
	{
	#if 0
		y_r[i]=66 * i/ 256;
		u_r[i]=38* i/ 256;
		v_r[i]=112 * i/ 256;
		y_g[i]=129* i/ 256;
		u_g[i]=74 * i/ 256;
		v_g[i]=94 * i/ 256;
		y_b[i]=25* i/ 256;
		u_b[i]=112 * i/ 256;
		v_b[i]=18 * i/ 256;
		#else
		y_r[i]=(66 * i)>>8;
		u_r[i]=(38* i)>>8;
		v_r[i]=(112 * i)>>8;
		y_g[i]=(129* i)>>8;
		u_g[i]=(74 * i)>>8;
		v_g[i]=(94 * i)>>8;
		y_b[i]=(25* i)>>8;
		u_b[i]=(112 * i)>>8;
		v_b[i]=(18 * i)>>8;
		#endif
	}
}

上述是RGB 转YUV 3个分量的转换方法‘

static int _DrawBitmap(const unsigned char * pData, int x0, int y0, int XSize, int YSize, int Bpp, int NumColors) {
int i, j, Step,BytesPerLine = 0;
unsigned int Offset;
char *p;
Window_Para_t  window;
unsigned int color;  
unsigned char r,g,b ;
unsigned int palette[256];
unsigned int y = 0,cb0=0,cr0 = 0;
unsigned short cby = 0,cry = 0;
unsigned short *pPicUse = (unsigned short*)pSppbufer;  //gMultiPicBuf;//
 
  for (i = 0; i < NumColors; i++) {
    unsigned char r, g, b;
    b = *(pData);
    g = *(pData + 1);
    r = *(pData + 2);
    pData += 4;
   palette[i] = ((unsigned int)b << 16) | (g << 8) | r;
  }
  #if 0
  switch (Bpp) {
    case 1:
      BytesPerLine = ((XSize + 31) >> 5) << 2;
      break;
    case 4:
      BytesPerLine = (((XSize << 2) + 31) >> 5) << 2;
      break;
    case 8:
      BytesPerLine = ((XSize +  3) >> 2) << 2;
      break;
  }
  #endif
  window.PositionX=x0;
  window.PositionY=y0;
  window.Width=XSize;
  window.Height=YSize;
  gx_mhp_set_spp_display(&window);
  *(volatile int*)0x40005028 |= (1<<1);//12 15
  unsigned short y2,u,v;
for(i = 0; i < YSize; i++)
{
	for(j = 0; j < XSize; j++)
	{
		//unOffset = (YSize - i - 1)* (XSize +2)+j;	
		Offset = (YSize - i - 1)* (XSize)+j;	
		//Offset=(YSize - i - 1)* ((((XSize * Bpp) + 31) >> 5)<<2)+ j;
		color=palette[(pData[Offset])];
		
		 r = color&0xff;
		g =( color>>8)&0xff;
		b = (color>>16)& 0xff;
		#if 0
		if(j%2)
	   	{

				y = ((4*r+8*g+2*b)>>4);
				cr0 = 128+((7*r-6*g-b)>>4);			
				cry = (cr0<<8)+y;
				*(pPicUse + i* XSize +j)  = cry;

		}
		else
		{

				y = ((4*r+8*g+2*b)>>4);
				cb0 = 128+((-2*r-5*g+7*b)>>4);
				cby = (cb0<<8)+y;
				*(pPicUse + i* XSize +j) = cby;
		}
		#else
		y2 = y_r[r]+y_g[g]+y_b[b]+16;
		u = -u_r[r]-u_g[g]+u_b[b]+128;
		v =  v_r[r]-v_g[g]-v_b[b]+128;		
		y2 = y2&0xfc;
		u = u&0xf0;
		v  = v&0xf0;
		if(pData[Offset]!=0)
		{
			*(pPicUse + i* XSize +j) = ((U16)(y2<<8))|((U16)(u<<2))|((U16)(v>>2))|3;
		}
		else
		{
			*(pPicUse + i* XSize +j)  = 0;
		}
		#endif
	}
}

  return 0;
}

 

文章来源: blog.csdn.net,作者:悟空胆好小,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/xushx_bigbear/article/details/122730932

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。