关于YUV图像转换问题

发布于 2022-09-30 19:16:13 字数 5985 浏览 5 评论 0

现在要做个个从yuv422转换成BMP565格式的图片

  1. static void cvt_422p_to_rgb565(int width, int height, const unsigned char *src, char * file)
  2. {
  3.     FILE *fp;
  4.         int Y0POS = 0,UPOS = 1,VPOS = 3,Y1POS = 2;
  5.         int u,v,r,g,b;
  6.         int rdif,invgdif,bdif;
  7.         unsigned char *YUVdata;
  8.         unsigned char RGBdata[2];
  9.     BITMAPFILEHEADER *file_head = (BITMAPFILEHEADER *)malloc(sizeof(BITMAPFILEHEADER));
  10.     BITMAPINFOHEADER *file_info = (BITMAPINFOHEADER *)malloc(sizeof(BITMAPINFOHEADER));
  11.         RGBMASK *bitmask =(RGBMASK *)malloc(sizeof(RGBMASK));
  12.         if (file_head == NULL || file_info == NULL || bitmask == NULL )
  13.             perror("lost malloc");
  14.     file_head->bfType = 19778;
  15.     file_head->bfSize = 0;                                                //这个大小
  16.     file_head->bfReserved1 = 0;
  17.     file_head->bfReserved2 = 0;
  18.     file_head->bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBMASK);
  19.     printf("%s %d\n",__func__,__LINE__);
  20.     file_info->biSize = sizeof(BITMAPINFOHEADER);
  21.     file_info->biWidth = width;
  22.     file_info->biHeight = height;
  23.     file_info->biPlanes = 1;
  24.     file_info->biBitCount = 16;
  25.     file_info->biCompression = 0;
  26.        
  27.     printf("%s %d\n",__func__,__LINE__);
  28.   
  29.     file_info->biSizeImage = (file_info->biWidth* file_info->biBitCount+31)/8 /4 * 4 *height;
  30.   
  31.     file_info->biXPelsPerMeter = 0;
  32.     file_info->biYPelsPerMeter = 0;
  33.     file_info->biClrUsed = 0;
  34.     file_info->biClrImportant = 0;
  35.     printf("%s %d\n",__func__,__LINE__);
  36.     bitmask->rgbRed = 0xF800;
  37.     bitmask->rgbGreen = 0x07E0;
  38.     bitmask->rgbBlue = 0x001F;
  39.   
  40.     fp=fopen(file, "wb");
  41.     {
  42.         if ( fp == NULL )
  43.         {
  44.                perror("open");
  45.                    return;
  46.             }
  47.     }
  48.   
  49.     fwrite(file_head,sizeof(BITMAPFILEHEADER),1,fp);
  50.     fwrite(file_info,sizeof(BITMAPINFOHEADER),1,fp);
  51.     fwrite(bitmask,sizeof(RGBMASK),1,fp);
  52.     while ( src )
  53.     {
  54.         YUVdata = (unsigned char *)src ;                                                ///
  55.         u = YUVdata[UPOS] - 128;
  56.         v = YUVdata[VPOS] - 128;
  57.         rdif = v + ((v * 103) >> 8);
  58.         invgdif = ((u * 88) >> 8) +((v * 183) >> 8);
  59.         bdif = u +( (u*198) >> 8);
  60.         r = YUVdata[Y0POS] + rdif;
  61.         g = YUVdata[Y0POS] - invgdif;
  62.         b = YUVdata[Y0POS] + bdif;
  63.        
  64.             RGBdata[1] =( (r & 0xF8)  | ( g >> 5) );
  65.         RGBdata[0] =( ((g & 0x1C) << 3) | ( b >> 3) );
  66.        
  67.         fwrite(RGBdata,sizeof(RGBdata),1,fp);
  68.        
  69.             r = YUVdata[Y1POS] + rdif;
  70.         g = YUVdata[Y1POS] - invgdif;
  71.         b = YUVdata[Y1POS] + bdif;
  72.             RGBdata[1] =( (r & 0xF8)  | ( g >> 5) );
  73.         RGBdata[0] =( ((g & 0x1C) << 3) | ( b >> 3) );
  74.         fwrite(RGBdata,sizeof(RGBdata),1,fp);
  75.             src += 4;
  76.     }
  77.     file_head->bfSize = ftell(fp) - file_head->bfOffBits;
  78.         fseek(fp,sizeof(file_head->bfType),SEEK_SET);
  79.         fwrite(&file_head->bfSize,sizeof(file_head->bfSize),1,fp);
  80.         free(file_head);
  81.         free(file_info);
  82.         free(bitmask);
  83.     fclose(fp);
  84. }

复制代码转换后图片老是显示不出来,不知道是哪里错了,请高手们帮忙看下

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文