#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <malloc.h>
#define WIDTHBYTES(i) ((i+31)/32*4)
//#pragma warning(disable: 4996)
int main()
{
BITMAPFILEHEADER bf; //BMP文件头结构体
BITMAPINFOHEADER bi; //BMP信息头结构体
FILE* fp; //指向文件的指针
RGBQUAD *ipRGB; //
DWORD LineByte,ImgSize;
DWORD NumColors;
unsigned char * * Imgdata;
int i,j;
char fileName[256];
//打开文件
printf("please enter filename:");
scanf("%s",fileName);
fp=fopen(fileName,"rb");
if(fp == NULL){
printf("Open file error!");
exit(0);
}
//读取信息头、文件头
fread(&bf,sizeof(BITMAPFILEHEADER),1,fp); //把指针fp所指向的文件的头信息写入bf(地址)
fread(&bi,sizeof(BITMAPINFOHEADER),1,fp);
LineByte=(DWORD)WIDTHBYTES(bi.biWidth*bi.biBitCount); //计算位图的实际宽度并确保它为32的倍数
ImgSize=(DWORD)LineByte*bi.biHeight;
if (bi.biClrUsed != 0 )
NumColors=(DWORD)bi.biClrUsed;
else
switch (bi.biBitCount)
{
case 1:NumColors=2;break;
case 4:NumColors=16;break;
case 8:NumColors=256;break;
case 24:NumColors=4096;break;
}
//分配调色板内存
ipRGB=(RGBQUAD *)malloc(NumColors*sizeof(RGBQUAD));
fread(ipRGB,sizeof(RGBQUAD),NumColors,fp);
//fseek(fp, -4, SEEK_CUR);
Imgdata=new unsigned char*[bi.biHeight]; //声明一个指针数组
for ( i=(bi.biHeight)-1;i>=0;i--)
Imgdata[i]=new unsigned char[bi.biWidth]; //每个数组元素也是一个指针数组
for ( i=(bi.biHeight)-1;i>=0;i--)
for(j=0;j<bi.biWidth;j++)
fread(&Imgdata[i][j],1,1,fp);//每次只读取一个1字节,存入数组
fclose(fp);
fp=fopen("mybmp.bmp","wb");
fwrite(&bf,sizeof(BITMAPFILEHEADER),1,fp);
fwrite(&bi,sizeof(BITMAPINFOHEADER),1,fp);
fwrite(ipRGB,sizeof(RGBQUAD),NumColors,fp);
for (i=(bi.biHeight)-1 ;i>=0;i--)
for (j=0 ;j<bi.biWidth;j++) {
Imgdata[i][j] = 255 - Imgdata[i][j];
fwrite(&Imgdata[i][j],1,1,fp);
}
free(Imgdata);
fclose(fp);
return 0;
}
分享到:
相关推荐
对于非压缩的BMP文件,每个像素通常用1、4、8或24位表示,对应于灰度图像、16色图像、256色图像和真彩色图像。 该程序实现了以下功能: 1. **读取BMP文件头和信息头**:通过定义相应的结构体,程序可以解析文件头...
无论是C++还是Python,或者其他支持BMP读取的编程语言,核心思路都是类似的:解析BMP文件,创建一个内存表示,然后将这个表示传给控件进行显示。理解BMP文件的结构以及编程语言提供的图像处理库是实现这一目标的关键...
AfxMessageBox("只支持8位和24位的BMP文件!"); file.Close(); return FALSE; } // 分配内存来存储图像数据 void* imageData = NULL; if (bitsPerPixel == 8) imageData = new RGBQUAD[infoHeader.biClrUsed...
- **24位色**:遍历像素数组,将每个像素的R、G、B三个分量均设置为0。 2. **写入BMP图像**:根据读取的数据重新构建一个BMP文件。 #### 五、详细代码解析 ##### 1. 主函数 ```c int main() { // 读取图像 char ...
本文将详细讨论如何在Qt环境下将32位深度的BMP图片转换为8位和24位深度的BMP图片。 首先,我们需要了解BMP文件格式。BMP是Microsoft Windows操作系统中的一个标准图像格式,它不进行任何压缩,因此文件大小较大,但...
24位真彩色BMP文件表示的是每个像素由红、绿、蓝三种颜色组成,每种颜色用8位二进制表示,总共24位,能够呈现16,777,216种颜色,即真彩色。这种格式广泛应用于Windows操作系统和其他软件中。 在VC++环境下,开发...
总结一下,实现“24位bmp位图转灰度图(MFC实现)”需要以下步骤: 1. 了解并解析BMP文件格式。 2. 使用MFC的CFile和CBitmap类读取BMP文件。 3. 创建与原位图兼容的位图缓冲区。 4. 应用灰度转换公式转换每个像素。...
在我们的BMP读取程序中,我们将利用这个框架来更新和绘制窗口内容。 3. GDI(Graphics Device Interface): GDI是Windows提供的图形库,用于在窗口上绘制文本、图形和图像。我们要使用GDI函数如CreateDIBSection...
在这个场景中,我们关注的是一个名为“BMP 24位转8位 DLL”的工具,它专门用于将BMP格式的图片从24位色彩深度转换为8位。这个工具封装成了动态链接库(DLL)文件,使得开发者可以方便地将其集成到自己的应用程序中...
以下是一个简单的VC++代码示例,演示如何读取并显示BMP文件: ```cpp #include LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc, hMemDC; HBITMAP hBitmap, ...
如果是24位真彩色BMP,每个像素需要3个字节(红、绿、蓝各一个字节)。 4. **读取图像数据**:使用CFile的`Read()`函数,你可以读取BMP文件中的像素数据。由于BMP是按行存储且数据倒序排列的(从下到上,从右到左)...
读取BMP图像并生成新的图片涉及以下步骤: 1. 打开输入BMP文件,读取文件头和图像信息头。 2. 分配内存来存储图像数据,考虑到可能的行填充。 3. 使用fread逐行读取图像数据到内存中。 4. 如果需要复制或处理图像,...
本项目专注于24位BMP图像的处理,包括旋转、缩放和裁剪等基本操作。这里我们将深入探讨这些概念以及如何使用C++实现它们。 首先,24位BMP(Bitmap)格式是Windows操作系统中最常见的位图文件格式之一。它存储每个...
以下是一个简化的代码示例,展示如何在VC++中读取并显示BMP文件: ```cpp #include #include int main() { // 打开文件 std::ifstream file("image.bmp", std::ios::binary); // 读取文件头和信息头 // ...
接着,使用`BitBlt`函数将位映射从内存DC复制到窗口的设备上下文,从而在屏幕上显示图像。 6. **释放资源** 在程序执行完毕后,别忘了释放所有已分配的资源,包括位映图、设备上下文和文件句柄。 在"win32bmpDemo...
本项目是一个针对初学者的实践教程,旨在介绍如何使用编程技术实现数字水印功能,并重点涉及BMP位图文件的读取与处理。 首先,我们来了解一下“数字水印”。数字水印是一种将特定信息嵌入到多媒体文件(如图像、...
标题中的“BMP转hex,C数组”是指将24位色彩的BMP图像文件转换成十六进制(hex)格式,并且将其数据结构转化为C语言数组的形式,以便于在C程序中直接读取和处理图像数据。这个过程通常涉及以下几个关键知识点: 1. ...
读取BMP图像通常涉及以下步骤: 1. 打开文件:使用文件操作函数打开BMP文件,并读取文件头和信息头,以获取图像的宽度、高度、色彩深度等信息。 2. 分析DIB结构:根据信息头的数据,解析DIB结构,了解像素数据的...
以下是一个简单的示例代码,展示如何在C++中使用GDI显示BMP图像: ```cpp #include #include class CMyDlg : public CDialog { public: CMyDlg(CWnd* pParent = NULL) : CDialog(CMyDlg::IDD, pParent) { } ...