/*真彩色bmp格式与PPM-P6之间的转换*/#include<math.h>
#include <iomanip>
#include <stdlib.h>
#include <windows.h>
#include <stdio.h>typedef struct BGR
{unsigned char b;unsigned char g;unsigned char r;
}BGR;typedef struct RGB
{unsigned char r;unsigned char g;unsigned char b;
}RGB;//bpp : BMP图像的色深,即一个像素用多少位表示,常见有1、4、8、16、24和32,分别对应单色、16色、256色、16位高彩色、24位真彩色和32位增强型真彩色
void PPMtoBMP(char *pFramePPM,int bpp)
{FILE* pPPM;fopen_s(&pPPM, pFramePPM, "rb");int width, height;char header[20];fgets(header, 20, pPPM);// get "P6" fgets(header, 20, pPPM);// get "width height" sscanf_s(header, "%d %d\n", &width, &height);fgets(header, 20, pPPM);// get "255" FILE *fp;fopen_s(&fp, "test.bmp", "wb");if (fp == NULL){printf("file is null.\n");return;}BITMAPFILEHEADER bmpheader;BITMAPINFOHEADER bmpinfo;RGB *ppmBitsRGB = (RGB *)malloc(width*height * sizeof(RGB));bmpheader.bfType = 0x4d42;bmpheader.bfReserved1 = 0;bmpheader.bfReserved2 = 0;bmpheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) - 2;bmpheader.bfSize = bmpheader.bfOffBits + width * height*bpp / 8;bmpinfo.biSize = sizeof(BITMAPINFOHEADER);bmpinfo.biWidth = width;bmpinfo.biHeight = height;bmpinfo.biPlanes = 1;bmpinfo.biBitCount = bpp;bmpinfo.biCompression = 0;//BI_RGB;bmpinfo.biSizeImage = width* height*bpp / 8;bmpinfo.biXPelsPerMeter = 100;bmpinfo.biYPelsPerMeter = 100;bmpinfo.biClrUsed = 0;bmpinfo.biClrImportant = 0;fwrite(&bmpheader.bfType, sizeof(bmpheader.bfType), 1, fp);fwrite(&bmpheader.bfSize, sizeof(bmpheader.bfSize), 1, fp);fwrite(&bmpheader.bfReserved1, sizeof(bmpheader.bfReserved1), 1, fp);fwrite(&bmpheader.bfReserved2, sizeof(bmpheader.bfReserved2), 1, fp);fwrite(&bmpheader.bfOffBits, sizeof(bmpheader.bfOffBits), 1, fp);fwrite(&bmpinfo.biSize, sizeof(bmpinfo.biSize), 1, fp);fwrite(&bmpinfo.biWidth, sizeof(bmpinfo.biWidth), 1, fp);fwrite(&bmpinfo.biHeight, sizeof(bmpinfo.biHeight), 1, fp);fwrite(&bmpinfo.biPlanes, sizeof(bmpinfo.biPlanes), 1, fp);fwrite(&bmpinfo.biBitCount, sizeof(bmpinfo.biBitCount), 1, fp);fwrite(&bmpinfo.biCompression, sizeof(bmpinfo.biCompression), 1, fp);fwrite(&bmpinfo.biSizeImage, sizeof(bmpinfo.biSizeImage), 1, fp);fwrite(&bmpinfo.biXPelsPerMeter, sizeof(bmpinfo.biXPelsPerMeter), 1, fp);fwrite(&bmpinfo.biYPelsPerMeter, sizeof(bmpinfo.biYPelsPerMeter), 1, fp);fwrite(&bmpinfo.biClrUsed, sizeof(bmpinfo.biClrUsed), 1, fp);fwrite(&bmpinfo.biClrImportant, sizeof(bmpinfo.biClrImportant), 1, fp);int y,x;for (y = 0; y < height; y++){fread(&ppmBitsRGB[y*width], 3 * width, 1, pPPM);for (x = width - 1; x >= 0; x--){fwrite(&ppmBitsRGB[y*width + x].b, 1, 1, fp);fwrite(&ppmBitsRGB[y*width + x].g, 1, 1, fp);fwrite(&ppmBitsRGB[y*width + x].r, 1, 1, fp);}}fclose(fp);fp = NULL;return;
}void BMPtoPPM(char *pFrameRGB)
{FILE* pBMP;fopen_s(&pBMP, pFrameRGB, "rb");BITMAPINFOHEADER infoHeader;BITMAPFILEHEADER fileHeader;FILE *pFile;fopen_s(&pFile, "test.ppm", "wb");if (pFile == NULL){printf("file is null.\n");return;}fread(&fileHeader, sizeof(BITMAPFILEHEADER), 1, pBMP);fread(&infoHeader, sizeof(BITMAPINFOHEADER), 1, pBMP);if (infoHeader.biBitCount != 24){printf("it is not a 24-bit rgb image.\n");return;}long width = infoHeader.biWidth;long height = infoHeader.biHeight;// Write headerfprintf(pFile, "P6\n%d %d\n255\n", width, height);// Write pixel dataint i, j;BGR *bmpBitsBGR = (BGR *)malloc(width*height * sizeof(BGR));//获取每一个像素点的BGR值fseek(pBMP, fileHeader.bfOffBits, 0);for (i = 0; i <height; i++){fread(&bmpBitsBGR[i*width], 3 * width, 1, pBMP);for (j = width - 1; j >= 0; j--){fwrite(&bmpBitsBGR[i*width + j].r, 1, 1, pFile);fwrite(&bmpBitsBGR[i*width + j].g, 1, 1, pFile);fwrite(&bmpBitsBGR[i*width + j].b, 1, 1, pFile);}fseek(pBMP, (4 - (width % 4)) % 4, SEEK_CUR); //4字节对齐}// Close filefclose(pBMP);fclose(pFile);free(bmpBitsBGR);bmpBitsBGR = NULL;return;
}void main(){char readPath[] = "test.ppm";PPMtoBMP(readPath,24); return;
}

BMP与PPM格式的转换相关推荐

  1. python修改文件格式为jpg_python将.ppm格式图片转换成.jpg格式文件的方法

    python将.ppm格式图片转换成.jpg格式文件的方法 将.ppm格式的图片转换成.jpg格式的图像,除了通过软件转换,还可以使用python脚本直接转换,so easy!!! from PIL ...

  2. 数字图像处理-bmp与jpeg格式互相转换

    原理 JPEG图像的存储压缩结构 参考链接:https://www.zhihu.com/question/22116845/answer/22998727 来源:知乎 JPEG文件的格式是分为一个一个 ...

  3. linux ppm转jpg_python将.ppm格式图片转换成.jpg格式文件的方法

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  4. 将ppm格式转换为bmp格式的方式有哪些?

    学习需要,要将PPM格式的图片转换为bmp格式,试了两种方法: 1.使用Photoshop 2019逐张转换,另存为你需要的格式. 2.使用代码进行转换,这里我使用matlab工具进行转换 参考博客 ...

  5. 转换图片保持画质_图片格式怎么相互转换,如何转换jpg、 bmp、png格式

    图片的格式有很多种,常见的就是jpg.bmp.png格式,这些格式本质上是没有多大的区别,都是安卓和电脑可以直接打开查看的,但是有时候还是会用到一些固定的格式,比如上传个人信息身份的时候,那这个时候如 ...

  6. 如何批量将 bmp 格式图片转换转换为 jpg

    概要:png 和 jpg 这两种格式的图片相信大家都非常熟悉,但是 bmp 格式的图片可能大家接触得并没有那么多,bmp 是 Windows 操作系统中的标准图像文件格式,能够被多种 Windows ...

  7. bmp格式如何转换成jpg?可批量转换

    bmp对于很多小伙伴们来说可能比较陌生,因为接触使用的比较少,但它也是Windows操作系统中的标准图像文件格式,小编在百度里经常下载到,由于这种图片格式不进行压缩,所以比较占用内存空间,并且很多网站 ...

  8. bmp格式怎么转换?教你三步快速转图片格式

    图片已经是我们生活和工作中随处可见的了,大家平时也都会将自己手中的图片上传到网络平台上.但是大部分的网络平台上传的图片都要求是JPG格式的,而我们手中的图片刚好是bmp格式的无法上传使用,遇到这种情况 ...

  9. html怎么转换bmp,BMP是什么格式 怎么把BMP转成JPG格式的方法

    首先来说说BMP是什么格式 BMP全称Bitmap,是Window操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广.它采用位映射存储格式,除了图像 ...

最新文章

  1. 多线程共享内存的问题
  2. python访问数据库如何解决高并发_使用 Python 和 Oracle 数据库实现高并发性
  3. 压力真的会害死你,我也轻度抑郁过
  4. C++ Templates之模板元编程
  5. 马里兰大学calce电池循环测试数据集_Keras-建立RNN(循环神经网络)
  6. SQLite 被曝存在漏洞,数千应用受影响
  7. 收购小蓝单车部分资产、与ofo蜜月期结束,滴滴重构共享单车布局
  8. 高德经纬度转普通GPS经纬度
  9. Zabbix错误:zbx_mem_malloc(): out of memory的解决方法
  10. VSCode 之 设置 settings.json 配置文件
  11. java 数据类型cher,java期末考试题96534-(20008)
  12. unittest---unittest生成测试报告
  13. 华为 虚拟机 fusion服务器,华为FusionCompute虚拟机挂载点磁盘空间在线扩容
  14. 「优知学院」淘宝架构的前世今生(下)
  15. 【邢不行|量化小讲堂系列19-Python量化入门】平均趋向指标(ADX)策略在A股的实证
  16. 做一个理想现实主义者而不是幻想世俗主义者
  17. FutureCompletableFuture
  18. Oracle甲骨文8.7亿美元高价收购Eloqua
  19. ensp华为路由器ARP与ICMP的抓包
  20. utf—8在苹果手机上乱码_【研究】解决iPhone中文邮件乱码的四种方法

热门文章

  1. uniapp如何点击高亮,文字相对于整个页面左右居中显示?
  2. NYOJ-20 吝啬的国度【深搜】
  3. [Android App] iPhoneX朋友圈小尾巴工具
  4. 人脸识别中的活体检测算法综述
  5. 其实你的AI技能并没有那么值钱\n
  6. iOS开发笔记1:[转]导航栏里的Back按钮显示不出来
  7. 反思抑郁症的原因:抑郁症能否遗传?
  8. 用 Python 轻松将懂车帝视频转换为文本
  9. 次世代关卡制作流程:使用Unreal Engine 4
  10. window+将html文件设置为我们的壁纸