⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yuv2ppm.c

📁 onmivision 摄相头模块驱动程序,blackfin 平台参考设计.
💻 C
字号:
#include <stdio.h>#include <stdlib.h>/*  yuv2ppm  Converts Quantel YUV (UYUV) 4:2:2 images from ZapIt! to ppm.  Written by Scott Scriven <yuv2ppm@xyzz.org>  Released as public domain.*//*  Compile thusly:  cc -o yuv2ppm yuv2ppm.c*//* example.ppm  (ascii)P3# feep.ppm4 415 0  0  0    0  0  0    0  0  0   15  0 15 0  0  0    0 15  7    0  0  0    0  0  0 0  0  0    0  0  0    0 15  7    0  0  015  0 15    0  0  0    0  0  0    0  0  0*//*  Use "P6" for binary data, or "P3" for ascii data. */int make_outfile(char *outfile, char *infile){   int i;      for(i=0; infile[i]; i++)      outfile[i] = infile[i];   outfile[i++] = '.';   outfile[i++] = 'p';   outfile[i++] = 'p';   outfile[i++] = 'm';   outfile[i++] = 0;      return 0;}int yuv2rgb(int y, int u, int v){   unsigned int pixel32;   unsigned char *pixel = (unsigned char *)&pixel32;   int r, g, b;   #if 0   /*     One formula I found:  (not the right one)         R = 1.164(Y - 16) + 1.596(Cr - 128)     G = 1.164(Y - 16) - 0.813(Cr - 128) - 0.391(Cb - 128)     B = 1.164(Y - 16)                   + 2.018(Cb - 128)   */         r = (1.164 * (y - 16))      + (2.018 * (v - 128));   g = (1.164 * (y - 16))      - (0.813 * (u - 128))      - (0.391 * (v - 128));   b = (1.164 * (y - 16))      + (1.596 * (u - 128));#else   /*     Another formula I found:  (seems to work)          R = Y + 1.370705 (V-128)     G = Y - 0.698001 (V-128) - 0.337633 (U-128)     B = Y + 1.732446 (U-128)   */      r = y + (1.370705 * (v-128));   g = y - (0.698001 * (v-128)) - (0.337633 * (u-128));   b = y + (1.732446 * (u-128));#endif   // Even with proper conversion, some values still need clipping.   if (r > 255) r = 255;   if (g > 255) g = 255;   if (b > 255) b = 255;   if (r < 0) r = 0;   if (g < 0) g = 0;   if (b < 0) b = 0;   // Values only go from 0-220..  Why?   pixel[0] = r * 220 / 256;   pixel[1] = g * 220 / 256;   pixel[2] = b * 220 / 256;   pixel[3] = 0;      printf("yuv2rgb(%i, %i, %i) -> %i, %i, %i  (0x%x)\n",	  y, u, v,	  pixel[0], pixel[1], pixel[2],	  pixel32);        return pixel32;}int yuv2ppm(char *infile, char *outfile){   FILE *in, *out;   int i;   unsigned int pixel_16;   unsigned char pixel_24[3];   unsigned int pixel32;   int y, u, v, y2;      char *ppmheader = "P6\n# Generated by yuv2ppm\n720 486\n255\n";   in = fopen(infile, "rb");   out = fopen(outfile, "wb");   if (!in  ||  !out)  return 0;   fprintf(out, ppmheader);   for(i=0; i<352*288/2; i++)   {      fread(&pixel_16, 4, 1, in);      pixel_24[0] = pixel_24[1] = pixel_24[2] = 0;            u  = ((pixel_16 & 0x000000ff));      y  = ((pixel_16 & 0x0000ff00)>>8);      v  = ((pixel_16 & 0x00ff0000)>>16);      y2 = ((pixel_16 & 0xff000000)>>24);      pixel32 = yuv2rgb(y, u, v);      pixel_24[0] = (pixel32 & 0x000000ff);      pixel_24[1] = (pixel32 & 0x0000ff00) >> 8;      pixel_24[2] = (pixel32 & 0x00ff0000) >> 16;            // For binary PPM      fwrite(pixel_24, 3, 1, out);      // For ascii PPM      //fprintf(out, "%i %i %i\n",      //	 pixel_24[0],      //	 pixel_24[1],      //	 pixel_24[2]);            pixel32 = yuv2rgb(y2, u, v);      pixel_24[0] = (pixel32 & 0x000000ff);      pixel_24[1] = (pixel32 & 0x0000ff00) >> 8;      pixel_24[2] = (pixel32 & 0x00ff0000) >> 16;      // For binary PPM      fwrite(pixel_24, 3, 1, out);      // For ascii PPM      //fprintf(out, "%i %i %i\n",      //	 pixel_24[0],      //	 pixel_24[1],      //	 pixel_24[2]);	    }   fclose(in);   fclose(out);   return 1;}int main(int argc, char **argv){  char *infile, outfile[256];  int i;  int success;    for(i=1; i<argc; i++)  {     success = 0;     infile = argv[i];     make_outfile(outfile, infile);          printf("%s -> %s...  ", infile, outfile);     fflush(stdout);     success = yuv2ppm(infile, outfile);          if(success)     {	printf("Done.\n");     }     else     {	printf("Failed.  Aborting.\n");	return 1;     }  }  return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -