BMP与PPM格式的转换

原创 2016年08月29日 17:00:00
/*真彩色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 rgb image.\n");
        return;
    }
    long width = infoHeader.biWidth;
    long height = infoHeader.biHeight;

    // Write header
    fprintf(pFile, "P6\n%d %d\n255\n", width, height);

    // Write pixel data
    int 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 file
    fclose(pBMP);
    fclose(pFile);
    free(bmpBitsBGR);
    bmpBitsBGR = NULL;
    return;
}

void main(){
    char readPath[] = "test.ppm";
    PPMtoBMP(readPath,24); 
    return;
}

相关文章推荐

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

PPM格式转化为BMP格式的实现

在网上找了好久都没能找到PPM格式的详细的编码规则, http://wangbingkun.spaces.live.com/blog/cns!E188E2874053C244!215.entry 链接...
  • faceRec
  • faceRec
  • 2007年07月14日 11:13
  • 7381

linux中生成ppm图片

转换方法如下: bmp图片使用bmptoppm。jpg,png,gif都有相应的topnm工具,但我没有试过。  $bmptoppm pic.bmp > temp1.ppm //生成ppm  $...

使用python将ppm格式转换成jpg

最近有个很火的文章,叫 有没有一段代码,让你觉得人类的智慧也可以璀璨无比? 自己试了一下里面的代码,可是图片格式让我犯难了。PPM格式的图片怎么打开呢?难不成还特意为它去装个专业的图形处理软件吗? ...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

OpenCV的ppm到bmp图片格式转换

#include #include #include #include #include using namespace std; int main(int argc, ch...
  • Augusdi
  • Augusdi
  • 2013年04月28日 22:11
  • 2843

ARM处理器之MMU和Cache

本节首先从总体上介绍MMU、Cache和CPU核是如何协同工作的,后面两节分别讲解MMU和Cache的细节。三星公司的S3C2410是一种很常见的采用ARM920T的芯片,涉及到具体的芯片时我们以S3...
  • sfrysh
  • sfrysh
  • 2012年06月24日 14:00
  • 2383

物理地址扩展(PAE)分页机制

Intel通过在处理器上把管脚数从32增加到36,以提高处理器的寻址能力,使其达到2^36=64GB,为此,需引入一种新的分页机制。         64GB的RAM被分为2^24个页框,页...

bmp图像格式转换(ppm,pgm)

  • 2017年04月28日 16:04
  • 18.4MB
  • 下载

OpenCV的ppm到bmp图片格式转换

#include #include #include #include #include using namespace std; int main(int argc, char * ar...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:BMP与PPM格式的转换
举报原因:
原因补充:

(最多只允许输入30个字)