您的位置:首页 > 运维架构 > Linux

linux下将bmp图片的RGB数值打印到文件中,并另存。

2017-09-11 17:41 567 查看
前面我们可以获取到bmp文件头的信息,那么这里我们的思路就是根据获取到的文件头信息,将文件头中的各种变量赋值即可;例如我们获取时,得到height=600,那么我们在设置时,可以人为将其设置成height=600

条件:

1.用windows画图工具另存的一张BMP格式图片;

2.linux 或 ubuntu下vim编译器;

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <fstream>

#include <iostream>
#pragma pack(2)
using namespace std;

typedef struct BITMAPFILEHEADER
{
u_int16_t bfType;
u_int32_t bfSize;
u_int16_t bfReserved1;
u_int16_t bfReserved2;
u_int32_t bfOffBits;
}BITMAPFILEHEADER;
typedef struct BITMAPINFOHEADER
{
u_int32_t biSize;
u_int32_t biWidth;
u_int32_t biHeight;
u_int16_t biPlanes;
u_int16_t biBitCount;
u_int32_t biCompression;
u_int32_t biSizeImage;
u_int32_t biXPelsPerMeter;
u_int32_t biYPelsPerMeter;
u_int32_t biClrUsed;
u_int32_t biClrImportant;
}BITMAPINFODEADER;

int biWidth; //图像宽
int biHeight; //图像高
int biBitCount; //图像类型,每像素位数
unsigned char *pBmpBuf; //存储图像数据
int lineByte; //图像数据每行字节数
int readBmp(char *bmpName)  
{  
    FILE *fp;  
    if( (fp = fopen(bmpName,"rb")) == NULL)  //以二进制的方式打开文件  
    {  
        cout<<"The file "<<bmpName<<"was not opened"<<endl;  
        return -1;  
    }  
    if(fseek(fp,sizeof(BITMAPFILEHEADER),SEEK_CUR))  //跳过BITMAPFILEHEADE  
    {  
        cout<<"跳转失败"<<endl;  
        return -1;  
    }  
    BITMAPINFOHEADER infoHead;  
    fread(&infoHead,sizeof(BITMAPINFOHEADER),1,fp);   //从fp中读取BITMAPINFOHEADER信息到infoHead中,同时fp的指针移动  
    biWidth = infoHead.biWidth;  
    biHeight = infoHead.biHeight;  
    biBitCount = infoHead.biBitCount;  
    lineByte = (biWidth*biBitCount/8+3)/4*4;   //lineByte必须为4的倍数
    //24位bmp没有颜色表,所以就直接到了实际的位图数据的起始位置  
    pBmpBuf = new unsigned char[lineByte * biHeight];  
    fread(pBmpBuf,sizeof(char),lineByte * biHeight,fp);  
    fclose(fp);   //关闭文件  
    return 0;  
}
int saveBmp(char *bmpName)  
{  
    FILE *fp;  
    if( (fp = fopen(bmpName,"wb") )== NULL)   //以二进制写入方式打开  
    {  
        cout<<"打开失败!"<<endl;  
        return -1;  
    }  
    //设置BITMAPFILEHEADER参数  
    BITMAPFILEHEADER fileHead;  
    fileHead.bfType = 0x4D42;     
    fileHead.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + lineByte * biHeight;  
    fileHead.bfReserved1 = 0;  
    fileHead.bfReserved2 = 0;  
    fileHead.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);  
    fwrite(&fileHead,sizeof(BITMAPFILEHEADER),1,fp);  
    //设置BITMAPINFOHEADER参数  
    BITMAPINFOHEADER infoHead;  
    infoHead.biSize = 40;  
    infoHead.biWidth = biWidth;  
    infoHead.biHeight = biHeight;  
    infoHead.biPlanes = 1;  
    infoHead.biBitCount = biBitCount;  
    infoHead.biCompression = 0;  
    infoHead.biSizeImage = lineByte * biHeight;  
    infoHead.biXPelsPerMeter = 0;  
    infoHead.biYPelsPerMeter = 0;  
    infoHead.biClrUsed = 0;  
    infoHead.biClrImportant = 0;  
    //写入  
    fwrite(&infoHead,sizeof(BITMAPINFOHEADER),1,fp); 

    fwrite(pBmpBuf,sizeof(char),lineByte * biHeight,fp);  
    fclose(fp);    //关闭文件  
    return 0;  
}
void work(char *openName,char* newName)  
{  
    if(-1 == readBmp(openName))  
        cout<<"readfile error!"<<endl;  
    //输出图像的信息  
    cout<<"Width = "<<biWidth<<" Height = "<<biHeight<<" biBitCount="<<biBitCount<<endl;  
    ofstream outfile("imageData.txt",ios::in | ios::trunc);  
    if(!outfile)  
    {  
        cout<<"open error"<<endl;  
        return ;  
    }  
    int count = 0;  
    //图像数据信息是从左下角按行开始存储的  
    for(int i = 0; i < biHeight; i++ )  
    {  
        for(int j = 0; j < biWidth; j++ )  
        {  
            for(int k = 0; k < 3; k++ )  
            {  
                int temp = *(pBmpBuf + i * lineByte + j + k);  
                count++;  
                outfile<<temp<<" ";  
                if(count % 8 == 0)  
                {  
                    outfile<<endl;  
                }  
            }  
        }  
    }  
    cout<<"总的像素数:"<<count / 3<<endl;  
    saveBmp(newName);  
    delete []pBmpBuf;  
    return ;
}  

int main(int argc,char *argv[])  
{ 
    if(argc != 3)
    {
        printf("usage:%s picOpenName picNewName\n",argv[0]);
        return -1;
    }
    work(argv[1],argv[2]);  
    return 0;  
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐