BMP读取 c++方式

读取BMP文件并显示出来(C++实现) 读取BMP文件的时候我们首先需要弄清楚bmp格式文件的结构 bmp的文件格式 bmp文件包含在windows.h的头文件里。编写代码的时候可以直接调用Windows.h 头文件来调用。 阅读详情

读取BMP文件的时候我们首先需要弄清楚bmp格式文件的结构
bmp的文件格式

bmp文件包含在windows.h的头文件里。编写代码的时候可以直接调用Windows.h 头文件来调用。
实现代码

#include<iostream>
#include<windows.h>
#include<fstream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<iomanip>
using namespace std;
unsigned char *pBmpBuf;//读入图像数据的指针

int bmpWidth;//图像的宽
int bmpHeight;//图像的高
RGBQUAD *pColorTable;//颜色表指针

int biBitCount;//图像类型,每像素位数



//-----------------------------------------------------------------------------------------
//给定一个图像位图数据、宽、高、颜色表指针及每像素所占的位数等信息,将其写到指定文件中
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;//灰度图像有颜色表,且颜色表表项为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);

    fclose(fp);//关闭文件

    return 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;

    //以二进制写的方式打开文件

    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 doIt()
{
    char readPath[]="girl.bmp";
    readBmp(readPath);
    // 输出整体图像信息
    cout << "width=" << bmpWidth << "height=" << bmpHeight << "biBitCount=" << biBitCount <<endl;
    // 图像的字节数
     int linebyte1=(bmpWidth*biBitCount/8+3)/4*4;
     int n =0,m=0,count_xiang_su = 0;

     // ofstream outfile("图像像素.txt",ios::in|ios::trunc);将像素数据存入TXT文件。
    //初始化原始像素的数组。

     if(biBitCount == 8)
    {
      for(int i=0;i<bmpHeight/2;i++)
        {
            for(int j=0;j<bmpWidth/2;i++)
                *(pBmpBuf+i*linebyte1+j)=0;
        }
    }

   if(biBitCount == 24)
    {
        for(int i=0;i<bmpHeight;i++)
        {
            for(int j=0;j<bmpWidth;j++)
            {
                for(int k=0;k<3;k++)//每像素RGB三个分量分别置0才变成黑色
                {
                  m= *(pBmpBuf+i*linebyte1+j*3+k);

                    count_xiang_su++;

                }
                n++;
            }


        }
        cout<<"总的像素个素为:"<<n<<endl;
        cout<<"----------------------------------------------------"<<endl;
    }

    // jiang tuxiang shuju cunpan .
     char writePath[] = "necpy.BMP";
     saveBmp(writePath, pBmpBuf, bmpWidth, bmpHeight, biBitCount, pColorTable);

    //清除缓冲区,pBmpBuf和pColorTable是全局变量,在文件读入时申请的空间

        delete []pBmpBuf;
         if(biBitCount==8)
        delete []pColorTable;

 }




int main()
{
    doIt();
    system("pause");
    return 0;
}
--------------------- 
作者:July_qiao 
来源:优快云 
原文:https://blog.youkuaiyun.com/wobuzhidao8/article/details/67638107 
版权声明:本文为博主原创文章,转载请附上博文链接!
c++生成bmp 使用调色板的位图图像,在其调色区域存储实际的颜色值,而在图像数据区域存储对调色板的索引值。使用直接色的位图图像,没有调色板区域,在图像数据区直接存储每行图像的每个像素的RGB颜色数据。图像数据区也不例外,按每行图像的数据字节,按4字节对齐。图像数据按行倒序存放,先存储最后一行图像数据,然后依次存放,直到第一行数据。备注:相较于windows画图程序,Photoshop保存的BMP文件,其图像数据区末尾多出两个0x00字节(图像数据区大小字段也大了2),可能是为了保证整个文件大小是4字节对齐。 阅读详情

相关推荐

c++实现bmp文件的读写

程序分为bmp相关的三个文件以及一个实例文件:  1.bmp格式文件的结构体定义--  bmpstruct.h  2.bmp格式文件的类定义文件-- cBMPimage.h  3.bmp格式文件的类实现文件 - cBMPimage.cpp   4示例文件--main.c   1.bmpstruct.h #ifndef BMPSTRUCT #define BMPSTRUCT //~

漂飘渔人 1358

c++读取bmp图片详解

先介绍几个会用到的函数。 1、FILE * fopen(const char * path,const char * mode); path是字符串类型的bmp图片路径;mode读取方式,等下回用到"rb",读写打开一个二进制文件,允许读写数据,文件必须存在。 2、int fseek(FILE *stream, long offset, int fromwhere); 函数设置文件

u013509299的专栏 2万+

BMP文件的读取和保存

BMP文件结构分析和读取保存

冰雪林中著此身 2691

C++实现bmp文件的读写

C++实现BMP文件读写

ting 2081

vs2019实现24位真彩BMP文件顺时针旋转90°和180°

暑假期间,导师布置了一个将24位BMP图像的翻转90°和180°的小任务,经过经典面向百度编程,学习了一些bmp格式的知识,主要参考以下几篇文章。 知乎一位大佬的详解:C++实现将24位真彩BMP文件顺时针旋转90度,补足字节部分是精华 bmp24位位图格式总结:BMP24位位图格式总结 主体代码部分还是知乎大佬那篇文章,我自己在vs2019上运行时debug了一遍,添加了旋转函数rotation1,使其能够旋转180°(这部分搞清楚bmp图像的存储格式,其实是可以旋转任意较好的角度,找到新指针和旧指

dracary的博客 1513

c++ BMP24IMAGEDATA 获取rgb转YUV420的类

/Ø 计算公式:Y = 0.30R + 0.59G + 0.11B , U = 0.493(B-Y), V = 0.877(R-Y)//Ø 需要注意采用4 : 2 : 0格式,u的数据是y的数据的1 / 4,v的数据是y的数据的1 / 4,有一个下采样的过程。default://对于小于等于8bit的bmp文件,首先需要位与移位取像素数据,查调色板,写RGB缓冲区。//参数: bmp文件,该文件的位图文件头,该文件的位图信息头,输出buffer(bmp文件开头的调色板数据)//height为列数。

全粘工程师 599

纯c++读取与显示BMP图片

2019/10/7给某些网络巨婴的说明 第一,不会配置vs环境的请绕道 第二,不懂字符集区别的请走开 第三,不会定义类的成员变量的请去学习 第四,不会处理编译器错误信息的请去百度 第五,什么都不会只会喷人的必删回复 下列代码全是经过测试的,vs2013正常运行,也许用在一些地方有点小BUG,但是整体功能都是正常的(PS:我不是你长辈,没有义务去帮你一点一点改还要改到你满意为止) ...

PangCoder的博客 2万+

C++将文本字符串转换成BMP图片

文本合成技术,C++将文本字符串转换成BMP图片

[DEBUG]Opengl读取BMP文件不完整(黑块)解决方法

void* pixeldata,*data;FILE* f;f = fopen("tex.bmp","rb"); //注意使用二进制打开方式!!!fseek(f,0,SEEK_END);size_t fileSize=ftell(f);fseek(f,0,SEEK_SET);data = new BYTE[fileSize];fread(data,fileSize,1,f);pixel...

dianlang2648的博客 401

BMP(Bitmap)生成器,纯C++实现由数组生成位图

纯C++代码写文件的形式生成Bitmap。对于理解Bitmap的格式有着非常好的效果。

C++语言BMP图像高度宽度和数据的读取

利用C++语言,读取BMP图像的高度和宽度,将数据转成为RAW格式,再利用文件头和RAW文件的数据,重新转化成BMP文件。其中采用了动态二维数组。

BMP文件读取函数--32或者24都可以读--在VS2017--C++中可以使用

GLbyte* ReadBmpFile(const char * szFileName, GLint&amp; ImageWidth, GLint&amp; ImageHeight) { FILE* pFile; GLint PixelLength; GLint weishen; GLint Height; GLbyte* PixelData, ...

wxwx05060259的专栏 457

2024年捡垃圾指南:E5 V3/V4服务器CPU怎么选?从游戏多开到深度学习,附华南X99主板搭配清单

本文详细解析2024年E5 V3/V4服务器CPU的选购策略,涵盖游戏多开、深度学习等多种应用场景。通过对比E5 V3与V4系列的制程、功耗及性能差异,提供高性价比的CPU型号推荐及华南X99主板搭配方案,帮助用户在有限预算下打造高效能工作站。

weixin_42549451的博客 1586

c++读取24位bmp图像进行4字节补全并保存为bmp(用于解决图像编码解码时4字节不对齐的图像出错)

#include <iostream> #include <fstream> #pragma pack(1)//可以自定义结构体对齐方式 using namespace std; typedef unsigned char BYTE;//一个字节 typedef unsigned short WORD;//两个字节 typedef unsigned int DWOR...

fly_qi7的博客 1936

Cisco Secure ACS 5.8.0.32 安装 + Crack 教程

在ESXi 6.7 上经历过无数次的安装尝试测试了各种兼容版本都没有安装成功,记最后一次安装成功的过程.

Junior's Blog 3538

细说VLAN之untag和tag

一、拓扑图 先给出上面拓扑图的结论,后面再详细讲解: 结论:只有PC1与PC4之间能相互通信,除此之外,所有PC之间均不能通信,比如PC1与PC3不能建立通信。 针对Ping命令的一个知识: 要想ping通某台主机,必须满足两个条件: 1,源主机的ICMP请求包必须能达到目的主机。 2,目的主机的ICMP应答包必须能回到源主机。 二、理论基础 端口的出...

NoobMaster的博客 3万+

C++:BMP图像旋转180度(附带源码)

C++:BMP图像旋转180度(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 800

C#操作SQLite数据库帮助类——SQLiteHelper

using System; using System.Collections.Generic; using System.Data.SQLite; using System.Data; namespace Com.ZCWL.Rock.Helper { public class SQLiteHelper { private static string connectionString =

跟健哥出去走走 2万+

利用fstream读取BMP图像文件(DIB设备无关位图)

一、BMP文件结构1、位图文件头BITMAPFILEHEADER(14字节)typedef struct tagBITMAPFILEHEADER { WORD bfType;//位图文件类型,必须为0x4D42,即字符串‘BM’ DWORD bfSize;//位图文件大小,单位byte WORD bfReserved1; //保留字节 ...

尾巴长蘑菇 638

Python实战:5分钟搞定N-CMAPSS航空发动机数据集解析(附完整代码)

本文提供了一份针对N-CMAPSS航空发动机数据集的快速解析实战指南。通过Python的h5py库,详细演示了如何读取HDF5文件结构、理解数据分类(如传感器、健康参数、场景描述符)并加载为Pandas DataFrame。文章还澄清了数据集中常见的变量数量疑惑,并给出了从数据加载到构建剩余使用寿命预测模型预处理流水线的完整代码,帮助工程师和研究人员高效入门航空发动机预测性维护分析。

weixin_29057065的博客 422

GPU 运维实战:H100/H800/B300 换卡与压测

(烧多久、看什么、什么算合格)。文末还给了一个能直接跑的验收判定脚本,三个真实场景的裁决输出都在。

老韩的Linux云计算架构师进阶之路 275

怎么读取BMP图片数据

以前看一些类似的文章,现在要具体用了,才知道白看,纸上得来终觉浅,绝知此事须躬行。一些都得从再来。不过,话又说回来。看过才知道是这么一回事了。用UltraEdit打开一张BMP图片,分析了一下。 再结全代码(如下)  for (int y = 0; y          for (int x = 0; x           ULONG C = x + (_BOOT_BMP_YSIZE-1

1049

【LAMMPS学习】五、LAMMPS命令(8) Pair_style 势

所有LAMMPS pair_style命令如下表所示。有些样式有加速版本。这由括号中的附加字母表示:g = GPU, i = INTEL, k = KOKKOS, o = OPENMP, t = OPT。

荷塘阅色 3016

C语言 BMP图片处理

BMP是bitmap的缩写形式,bitmap顾名思义,就是位图也即Windows位图。它一般由4部分组成:文件头信息块、图像描述信息块、颜色表(在真彩色模式无颜色表)和图像数据区组成。在系统中以BMP为扩展名保存。       打开Windows的画图程序,在保存图像时,可以看到三个选项:2色位图(黑白)、16色位图、256色位图和24位位图。这是最普通的生成位图的工具,在这里讲解的BMP位

大江的专栏 1234

Spring AI 项目实战(三):Spring Boot + AI + DeepSeek 打造智能客服系统(附完整源码)

摘要 本文介绍了基于Spring Boot 3.2和Spring AI 1.0.0-M4构建智能客服系统的技术方案。系统采用分层架构设计,集成DeepSeek API提供自然语言处理能力,使用MyBatis和H2数据库实现数据持久化,并通过Thymeleaf+Bootstrap构建前端界面。文章详细阐述了项目的技术栈选择、Maven依赖配置、应用架构设计,以及各模块的功能划分,为开发者提供了完整的智能客服系统实现方案,涵盖从后端服务到前端交互的全流程开发指导。

博客 3847

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

bmp file read

CBitmap * CgggDlg::ReadBmpFromFile(CString file){ CBitmap *pbmp = NULL; CFile f_read; if(!f_read.Open(file, CFile::modeRead)) {  return NULL; } DWORD len = f_read.GetLength(); BYTE *pBuf = (BYTE *):

536

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

上一篇: const关键字
下一篇: 绘图用的函数及矩形类CRect和矩形结构RECT
qq932827310
博客等级 码龄9年 44粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值