字体图片rgb565格式转换为ARGB888格式

RGB的意思是红色(Red)、绿色(Green)和蓝色(Blue)
rgb565 是16位(2字节)
565表示在16位编码中每个颜色分量所占的位数。红色占5个bit,绿色占6个bit,蓝色占5个bit。
argb888 是32位 (4字节)
888表示红色占8个bit,绿色占8个bit,蓝色占8个bit,还有a表示透明度,也是占8个bit
那么一个像素点占8+8+8+8=32位(4字节)

直接贴参考代码

//将渲染后的Surface转换成Bitmap
 void MySample_SurfaceWord_ToBMP(SDL_Surface *surface,BITMAP_S *stBitmap,SDL_Color fntcol)
{
  unsigned short words_color = ((fntcol.r >> 3) << 11) + ((fntcol.g >> 2) << 5) + (fntcol.b >> 3);  //字体颜色
  unsigned short bck_color = 0xffff - words_color; //字体以外的背景颜色
  stBitmap->u32Height = (surface->h); //BITMAP 的宽高向上2对齐
	stBitmap->u32Width = (surface->w);
	stBitmap->pData = malloc(4*(stBitmap->u32Height)*(stBitmap->u32Width)); //申请空间,ARGB8888=>4Byte/Pixel,总大小为4*w*h
	memset(stBitmap->pData,0,4*(stBitmap->u32Height)*(stBitmap->u32Width));
	int i,j;
	int w = surface->w;
	int h = surface->h;

	for (i = 0; i < h; ++i)
	{
		RK_U32 *p_dst = (RK_U32*)stBitmap->pData;
		RK_U16 *p_src = (RK_U16*)surface->pixels;
	    int dis_pos = 0;
	    if(w % 2 != 0)
	    	dis_pos = i;     //处理w为奇数的情况
		for(j=0;j<w;j++)
		{
			int a,r, g , b;
			r = (p_src[i*w+dis_pos+j] & 0xF800) >> 8;   //原图像是RGB565,RGB各分量提取
			g = (p_src[i*w+dis_pos+j] & 0x07e0) >> 3;
			b = (p_src[i*w+dis_pos+j] & 0x001f) << 3;
			
      //一致则A位设置为0,透明
      if (bck_color == p_src[i*w+dis_pos+j])
      a = 0x00;   //当发现这一位与背景颜色相同时候,把a的透明度设为完全透明
      else a = 0xff;

			p_dst[i*stBitmap->u32Width+j] = (a << 24) | (r << 16) | (g << 8) | b; //转换成ARGB888
		}
	}
	stBitmap->enPixelFormat = PIXEL_FORMAT_ARGB_8888;
}