• Bitmap 图片格式并用 C++ 读写 Bitmap


    转自 Bitmap 图片格式并用 C++ 读写 Bitmap

    1、Bitmap 图片格式

      每部分的具体内容就不展开了。要说的有两点:

      (1)调色板不是必须的,可有可无,有没有调色板可以通过位图文件头的 bfOffBits 是否等于位图文件头加上位图信息头的长度来判断。调色板这个问题也曾经导致我在用 C++ 读取 BMP 的时候出错,原因就是并不是每个图片都没有调色板的,我读取的开始位置错了。

      (2)windows 的 BMP 是从最后一行开始读的!这个问题曾经导致我在用 C++ 做图像的旋转时方向错误。

    2、C++ 读取 Bitmap 图片

        #include <stdio.h>  
        #include <stdlib.h>  
        #include <windows.h>  
          
        typedef struct  
        {  
            BYTE b;  
            BYTE g;  
            BYTE r;  
        }RGB;  
          
        void imgOpr(RGB &a,RGB &b)  
        {  
            b.b=a.b;      
            b.g=a.g;  
            b.r=a.r;  
        }  
          
        int main()  
        {  
            BITMAPFILEHEADER fileHeader;  
            BITMAPINFOHEADER infoHeader;  
            FILE* pfin =fopen("D:/1.bmp","rb");  
            FILE* pfout = fopen( "D:/2.bmp" , "wb");  
            //Read the Bitmap file header;  
            fread(&fileHeader,sizeof(BITMAPFILEHEADER),1,pfin);  
            //Read the Bitmap info header;  
            fread(&infoHeader,sizeof(BITMAPINFOHEADER),1,pfin);  
            //为简化代码,只处理24位彩色  
            int height,weight;  
            height=0;  
            weight=0;  
            height=infoHeader.biHeight;  
            weight=infoHeader.biWidth;  
            if( infoHeader.biBitCount >= 1)  
            {  
                int size = height * weight;  
                RGB img[height][weight];  
                RGB img2[weight][height];  
                fread( img , sizeof(RGB) , size , pfin );  
                  
                //对图片进行操作   
                int i, j;  
                for (i=0; i<height; i++)   
                    for (j=0 ; j < weight ; j++ )  
                    {  
                        //将数组 img 赋值给 img2   
                        imgOpr(img[i][j],img2[i][j]);  
                    }  
                  
                //将修改后的图片保存到文件   
                fwrite( &fileHeader , sizeof(fileHeader) , 1 , pfout );  
                fwrite( &infoHeader , sizeof(infoHeader) , 1 , pfout );  
                fwrite( img2 , sizeof(RGB) , size , pfout );  
            }  
            fclose(pfin);  
            fclose(pfout);  
          
            return 0;  
        }  
  • 相关阅读:
    ubuntu 安装mysql和redis 开放远程连接
    linux时间不对,执行ntpdate时间同步始终不对。
    Web漏洞
    生产者消费者模型
    多进程抢票问题
    socket通讯-----UDP
    python3读写csv文件
    # 把csv转xls
    python os模块 用资源管理器显示文件,pyinstall打包命令
    创建一个最简单的pyqt5窗口
  • 原文地址:https://www.cnblogs.com/arxive/p/8420950.html
Copyright © 2020-2023  润新知