zoukankan      html  css  js  c++  java
  • c++ 读取图片RGB

    #include"stdio.h"
    #include"iostream.h"
    #include"string.h"
    #include <conio.h>
    #include"stdlib.h"
    #include"windows.h"

    unsigned char *pBmpBuf;//读入图像数据的指针
    int bmpWidth;//图像的宽
    int bmpHeight;//图像的高
    RGBQUAD *pColorTable;//颜色表指针
    int biBitCount;//图像类型,每像素位数

    /*****************************************************/
    /*函数名称readBmp()*/

    bool readBmp(char *bmpName)
    {
    //二进制读方式打开指定的图像文件
    FILE *fp=fopen(bmpName,"rb");
    if(fp==0) return 0;

    //跳过位图文件头结构BITMAPFILEHEADER
    fseek(fp,sizeof(BITMAPFILEHEADER),0);

    //定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中
    BITMAPINFOHEADER head;
    fread(&head, sizeof(BITMAPINFOHEADER), 1,fp);

    //获取图像宽、高、每像素所占位数等信息
    bmpWidth=head.biWidth;
    bmpHeight=head.biHeight;
    biBitCount=head.biBitCount;

    //定义变量,计算图像每行像素所占的字节数(必须是4的倍数)
    //int lineByte=(bmpWidth * biBitCount/8+3)/4*4;
    int lineByte=(bmpWidth*biBitCount+31)/32*4;

    //灰度图像有颜色表,且颜色表表项为256
    if(biBitCount==8)
    {
    //申请颜色表所需要的空间,读颜色表进内存
    pColorTable=new RGBQUAD[256];
    fread(pColorTable,sizeof(RGBQUAD),256,fp);
    }

    //申请位图数据所需要的空间,读位图数据进内存
    pBmpBuf=new unsigned char[lineByte * bmpHeight];
    fread(pBmpBuf,1,lineByte * bmpHeight,fp);


    int BytesPerLine;
    BYTE data[999999];
    BYTE Color[1300][3];
    BytesPerLine=(bmpWidth*biBitCount+31)/32*4;
      fseek(fp,54,0);
    for(int i=bmpHeight-1;i>=0;i--)
    {  
    fread(data,1,BytesPerLine,fp);  

    for(int k=0;k <bmpWidth*3;k++)
    {
    if(k%3==2)
    {
    Color[k/3][2]=data[k-2];//b
    Color[k/3][1]=data[k-1];//g
    Color[k/3][0]=data[k-0];//r
    }
    }

    int m=1,n;
    cout<<"第"<<i<<"行的颜色red分量矩阵为:"<<endl;
    for(k=0;k<bmpWidth;k++)
    {
    n=int(Color[k][0]);
    if(n/100==0&&n/10==0)
    cout<<" "<<n<<" ";
    else if(n/100==0)
    cout<<" "<<n<<" ";
    else
    cout<<n<<" ";
    if(k==10*m-1)
    {
    cout<<endl;
    m++;
    }
    }
    cout<<endl<<endl<<endl;

    m=1;
    cout<<"第"<<i<<"行的颜色green分量矩阵为:"<<endl;
    for(k=0;k<bmpWidth;k++)
    {
    n=int(Color[k][1]);
    if(n/100==0&&n/10==0)
    cout<<" "<<n<<" ";
    else if(n/100==0)
    cout<<" "<<n<<" ";
    else
    cout<<n<<" ";
    if(k==10*m-1)
    {
    cout<<endl;
    m++;
    }
    }
    cout<<endl<<endl<<endl;

    m=1;
    cout<<"第"<<i<<"行的颜色blue分量矩阵为:"<<endl;
    for(k=0;k<bmpWidth;k++)
    {
    n=int(Color[k][2]);
    if(n/100==0&&n/10==0)
    cout<<" "<<n<<" ";
    else if(n/100==0)
    cout<<" "<<n<<" ";
    else
    cout<<n<<" ";
    if(k==10*m-1)
    {
    cout<<endl;
    m++;
    }
    }
    cout<<endl<<endl<<endl;
    }

    //关闭文件
    fclose(fp);
    return 1;
    }


    /*函数名称:saveBmp()函数参数:char *bmpName文件名字及路径;
    unsigned char *imgBuf待存盘的位图数据;
    int width以像素为单位待存盘位图的宽;
    int height以像素为单位待存盘位图高;
    int biBitCount每像素所占位数;
    RGBQUAD *pColorTable颜色表指针
    返回值:0为失败,1为成功.
    说明:给定一个图像位图数据、宽、高、颜色表指针及每像素所占的位数等信息,
    将其写到指定文件中*/


    bool saveBmp(char *bmpName,unsigned char *imgBuf,int width,int height,
    int biBitCount, RGBQUAD *pColorTable)
    {
    //如果位图数据指针为0,则没有数据传入,函数返回
    if(!imgBuf) return 0;  

    //颜色表大小,以字节为单位,灰度图像颜色表为1024字节,彩色图像颜色表大小为0
    int colorTablesize=0;
    if(biBitCount==8)
    colorTablesize=1024;

    //待存储图像数据每行字节数为4的倍数
    //int lineByte=(width * biBitCount/8+3)/4*4;
    int lineByte=(bmpWidth*biBitCount+31)/32*4;

    //以二进制写的方式打开文件
    FILE *fp=fopen(bmpName,"wb");
    if(fp==0) return 0;

    //申请位图文件头结构变量,填写文件头信息
    BITMAPFILEHEADER fileHead;
    fileHead.bfType = 0x4D42;

    //bmp类型  
    //bfSize是图像文件4个组成部分之和
    fileHead.bfSize=sizeof(BITMAPFILEHEADER)+
    sizeof(BITMAPINFOHEADER)+colorTablesize+
    lineByte*height;
    fileHead.bfReserved1=0;
    fileHead.bfReserved2=0;

    //bfOffBits是图像文件前3个部分所需空间之和
    fileHead.bfOffBits=54+colorTablesize;

    //写文件头进文件
    fwrite(&fileHead,sizeof(BITMAPFILEHEADER),1,fp);

    //申请位图信息头结构变量,填写信息头信息
    BITMAPINFOHEADER head;
    head.biBitCount=biBitCount;
    head.biClrImportant=0;
    head.biClrUsed=0;head.biCompression=0;
    head.biHeight=height;
    head.biPlanes=1;
    head.biSize=40;
    head.biSizeImage=lineByte*height;
    head.biWidth=width;
    head.biXPelsPerMeter=0;
    head.biYPelsPerMeter=0;

    //写位图信息头进内存
    fwrite(&head,sizeof(BITMAPINFOHEADER),1,fp);

    //如果灰度图像,有颜色表,写入文件
    if(biBitCount==8)
    fwrite(pColorTable,sizeof(RGBQUAD),256,fp);

    //写位图数据进文件
    fwrite(imgBuf,height*lineByte,1,fp);

    //关闭文件fclose(fp);
    return 1;
    }


    void main()
    {
    //读入指定BMP文件进内存
    char readPath[]="D:\\4.bmp";
    readBmp(readPath);

    //输出图像的信息
    printf("width=%d,height=%d,biBitCount=%d\n",bmpWidth,bmpHeight,biBitCount);

    cout<<endl<<endl<<endl;

    //将图像数据存盘
    char writePath[]="D:\\2.bmp";
    saveBmp(writePath,pBmpBuf,bmpWidth,bmpHeight,biBitCount,pColorTable);

    //清除缓冲区,pBmpBuf和pColorTable是全局变量,在文件读入时申请的空间
    delete []pBmpBuf;
    if(biBitCount==8)
    delete []pColorTable;
    }

  • 相关阅读:
    475. Heaters
    69. Sqrt(x)
    83. Remove Duplicates from Sorted List Java solutions
    206. Reverse Linked List java solutions
    100. Same Tree Java Solutions
    1. Two Sum Java Solutions
    9. Palindrome Number Java Solutions
    112. Path Sum Java Solutin
    190. Reverse Bits Java Solutin
    202. Happy Number Java Solutin
  • 原文地址:https://www.cnblogs.com/zzxap/p/2175691.html
Copyright © 2011-2022 走看看