VS2019BMP转RGB

本文介绍了在VS2019环境下,如何将BMP图像转换为RGB格式。主要涉及fopen、fread、fclose、fseek和fwrite等文件操作函数,以及位图像素数据的处理,通过读取24位无压缩BMP,调整像素通道灰度值,生成新的RGB位图。最后使用opencv展示转换效果。
摘要由CSDN通过智能技术生成

使用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(</
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值