平台:Linux


/***************************************************************************** 文件名:Yuyv422ToPnm.c* 文件描述:把yuyv422格式的图片转换为pnm格式的图片,需要提供yuv422源文件名*         yuv图片的宽,yuv图片的高以及需要转换的pnm图片名称* 编写人:王廷云* 编写日期:2017-12-1* 修改日期:2018-1-1
****************************************************************************/
#include <stdio.h>
#include <unistd.h>#include <sys/types.h>                              // 下面四个头文件是linux系统编程特有的
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>#include <linux/videodev2.h>                        // 操作摄像头设备#define  CLAMP(v)  ((v<0?0:(v>255?255:v)))          // 钳制像素值的范围int main(int argc, char **argv)
{int width;                                      // yuv图片的宽int height;                                     // yuv图片的高/* 参数检查是否足够*/if (argc != 5){/* yuv图片名 yuv图片的宽,yuv图片的高,pnm图片名称  */printf("Usage: [%s] [srcName] [width] [height] [destName]\n", argv[0]);return -1;}/* 打开yuyv文件:用open是因为后面的内存映射要的是文件描述符 */int fin = open(argv[1], O_RDONLY);if (-1 == fin){perror("open");return -2;}/* 获取yuv图片信息 */struct stat st_buf;fstat(fin, &st_buf);                          // 用于获取图片大小sscanf(argv[2], "%d", &width);                // 获取图片宽度sscanf(argv[3], "%d", &height);               // 获取图片高度/* 把文件进行内存映射:加快操作速度(此步骤可以不用) */unsigned char *yuyv;yuyv = mmap(NULL, st_buf.st_size, PROT_READ, MAP_SHARED, fin, 0);if (MAP_FAILED == yuyv){perror("mmap");return -2;}/* 进行数据转换并保存到文件中去 */FILE *fout = fopen(argv[4], "w");if (NULL == fout){perror("fopen");return -3;}unsigned char *p = yuyv;unsigned char y0, y1, u0, v1;unsigned char rgb[3];int x, y;/* 写pnm文件头 */fprintf(fout, "P6\n%d %d\n255\n", width, height);/* 把yuv数据转换为rgb数据并写入pnm文件中 */for (y = 0; y < height; y++){for (x = 0; x < width; x += 2)       // 两个像素一起写{/* 读2个yuv422像素:共4个字节 yu yv */y0 = *p++;u0 = *p++;y1 = *p++;v1 = *p++;/* 转换为2个rgb像素:共6个字节rgb rgb */rgb[0] = CLAMP(y0 + 1.402 * (v1 - 128));rgb[1] = CLAMP(y0 - 0.344 * (u0 - 128) - 0.714 * (v1 - 128));rgb[2] = CLAMP(y0 + 1.772 * (u0 - 128));fwrite(rgb, 1, 3, fout);        // 写第一个rgb像素rgb[0] = CLAMP(y1 + 1.402 * (v1 - 128));rgb[1] = CLAMP(y1 - 0.344 * (u0 - 128) - 0.714 * (v1 - 128));rgb[2] = CLAMP(y1 + 1.772 * (u0 - 128));fwrite(rgb, 1, 3, fout);        // 写第二个rgb像素}}/* 尾部处理工作 */munmap(yuyv, st_buf.st_size);           // 解除内存映射close(fin);                             // 关闭已打开的文件fclose(fout);return 0;
}

【C语言】之把yuyv422格式的图片转换为pnm格式的图片相关推荐

  1. 将BMP 格式图片转换为 JPEG 格式【c语言】

    源码链接: https://blog.csdn.net/qq_44394952/article/details/122587475?spm=1001.2014.3001.5502. 一.任务及目标 利 ...

  2. 将BMP 格式图片转换为 JPEG 格式【c语言源码】

    原理及代码讲解链接: https://blog.csdn.net/qq_44394952/article/details/122587306?spm=1001.2014.3001.5502. 主函数m ...

  3. 如何批量将 bmp 格式图片转换为 png 格式

    概要:bmp 格式是纹的操作系统当中非常常见的一种图片格式,这种格式的特点是包含的图像信息较丰富,几乎不进行压缩,所以导致了它存在一个很大的缺点,那就是占用磁盘空间过大,那么我们怎么将 bmp 格式的 ...

  4. java gif转jpg_Java gif图片转换为jpg格式

    下面通过代码给大家介绍Java gif图片转换为jpg格式,具体代码如下所示: if(fileName.toLowerCase().endsWith(".gif")){//由于头像 ...

  5. java gif转jpg_Java gif图片转换为jpg格式|chu

    下面通过代码给大家介绍Java gif图片转换为jpg格式,具体代码如下所示: if(fileName.toLowerCase().endsWith(".gif")){//由于头像 ...

  6. java gif jpg_Java gif图片转换为jpg格式

    下面通过代码给大家介绍Java gif图片转换为jpg格式,具体代码如下所示: if(fileName.toLowerCase().endsWith(".gif")){//由于头像 ...

  7. JAVA实现bmp转换JPEG_Java gif图片转换为jpg格式

    下面通过代码给大家介绍Java gif图片转换为jpg格式,具体代码如下所示: if(fileName.toLowerCase().endsWith(".gif")){//由于头像 ...

  8. 如何批量将 gif 图片转换为 jpg 格式

    概要:gif 格式的图片相信大家或多或少的都有接触过.最常见的就是我们的表情包.动图等等,这也是 gif 格式图片比较大的应用场景.但也并不一定是所有的 gif 格式的图片都是动图,也有些是静态的.那 ...

  9. 如何批量将 webp 格式图片转换为 png 格式

    概要:在之前的文章当中,我们对 webp 格式的图片做过一些简单的介绍.这种格式是一种用于 web 项目的新的图像格式,他可以大大提高网站访问速度,因为同样的分辨率的 webp 格式的图片,它的大小要 ...

最新文章

  1. 一文快速入门分库分表中间件 Sharding-JDBC
  2. freemarker-ide eclipse安装地址 安装方法 页面静态化
  3. UICollectionViewController的用法1
  4. c++ set有序性
  5. [Issue Fixed]-svnadmin: warning: cannot set LC_CTYPE locale
  6. 从云计算到大数据华胜天成的国际化之路
  7. 安装Discuz!论坛
  8. Java多线程之Semaphore用法
  9. 嵌入式Linux驱动笔记(十八)------浅析V4L2框架之ioctl【转】
  10. vector父类类型可以存放子类吗_拼夕夕三轮面经:被问到反射和泛型的bug,你踏空了吗?...
  11. 华为鸿蒙状态栏,华为手机状态栏图标都代表什么
  12. 工具善其事,必先被苦逼的其器所钝伤然后打磨之才能利其器
  13. createCaptureSession()
  14. 408王道计算机网络强化——传输层和应用层
  15. 如何提高在搜索引擎中的排名-百度排名-竞价排名-自然排名
  16. Flutter 不容错过的 7 大亮点 | Google I/O 精彩回顾
  17. Vue中的export和export default{}用法
  18. 微信小程序wx.request请求封装,和跨域的解决。
  19. 向idea导入包后,idea却不识别java类文件,无法运行
  20. 干货 | 如何做一个有职业规划的数据人

热门文章

  1. 深圳互联网企业外迁调查:深圳房价等高压连锁效应
  2. centos6安装新宋体
  3. vue+three.js展示nrrd+vtk3D模型-vue框架集成(下)
  4. 转载本博客文章时请注明出处
  5. 百度APP移动端网络深度优化实践分享(一):DNS优化篇
  6. 【捆绑定价】Bundling Information Goods: Pricing, Profits, and Efficiency (重要)
  7. 拆解搜狗:AI护城河与生态进化论
  8. 分离权限管理与访问控制
  9. 28130-13-4,Val-Val-Val,H2N-VVV-OH
  10. C++笔记--Linux编程(8)-gcc gbb make