使用VS2019BMP转RGB
本文参考:BMP转RGB
一.主要函数
1)fopen(char filename,char mode);
fopen() 会获取文件信息,包括文件名、文件状态、当前读写位置等,并将这些信息保存到一个 FILE 类型的结构体变量中,然后将该变量的地址返回。其中filename为文件名(包括文件路径),mode为打开方式,它们都是字符串。
2)fread(void buffer, size_t size, size_t count, FILE stream)
从给定流 stream 读取数据到 buffer所指向的数组中。其中buffer是读取的数据存放的内存的指针(可以是数组,也可以是新开辟的空间,buffer就是一个索引),size 是每次读取的字节数 ,count是读取次数,strean 是要读取的文件的指针。
3)fclose(FILE stream);
关闭一个流,把缓冲区内最后剩余的数据输出到磁盘文件中,并释放文件指针和有关的缓冲区。
4)fseek(FILE stream, long offset, int fromwhere);
函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere为基准,偏移offset个字节的位置。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。
5)fwrite(const void* buffer,size_t size, size_t count, FILE* stream);
向文件中写入一个数据块。(写入的数据不限于文本格式,也可以是二进制文件等)返回值:返回实际写入的数据块数。其中buffer是一个指针。对fwrite来说是要写入数据的地址,size是要写入内容的单字节数,count是要 进行写入size字节的数据项的个数,stream为目标文件指针, 返回实际写入的数据项个数count。
二.编程实现
编程实现的思路如下,首先读入分辨率为512*512的24位无压缩位图的数据,然后对位图每个像素的每个通道灰度值x0.5,最后再根据修改后的数据生成一个新的位图保存。为了方便,最后面调用opencv显示对比结果。下图为运行结果。
左图为原图,右图为转后图
原图如下:
三.完整代码
#include "opencv2/opencv.hpp"
#include <iostream>
#include<windows.h>
#include<stdio.h>
using namespace std;
using namespace cv;
//#define _CRT_SECURE_NO_WARNINGS//在预处理器定义
BYTE* RmwRead8BitBmpFile2Img(const char* filename, int* width, int* height) {
FILE* binFile;
BYTE* pImg = NULL;
BITMAPFILEHEADER fileHeader;
BITMAPINFOHEADER bmpHeader;
BOOL isRead = TRUE;
int linenum, ex; //linenum:一行像素的字节总数,包括填充字节
//open file
if ((binFile = fopen(filename, "rb")) == NULL) return NULL;
//读文件头和信息头
//为什么用fread读到结构体可行?因为bmp数据存储方式跟windows正好都是小端模式
//从binFile以1byte为单位读取sizeof(fileHeader)个数据,保存到fileHeader首地址的地方,由于windows是小端存储,正好跟bmp数据格式对应
//fread 如果读取成功,则返回实际读到的单元个数
if (fread((void*)& fileHeader, 1, sizeof(fileHeader), binFile) != sizeof(fileHeader)) isRead = FALSE;
if (fread((void*)& bmpHeader, 1, sizeof(bmpHeader), binFile) != sizeof(</