`
feng88724
  • 浏览: 172788 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

24位以下BMP图的读取、复制

阅读更多
#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读取复制程序

    对于非压缩的BMP文件,每个像素通常用1、4、8或24位表示,对应于灰度图像、16色图像、256色图像和真彩色图像。 该程序实现了以下功能: 1. **读取BMP文件头和信息头**:通过定义相应的结构体,程序可以解析文件头...

    读取BMP图片并显示在控件上面

    无论是C++还是Python,或者其他支持BMP读取的编程语言,核心思路都是类似的:解析BMP文件,创建一个内存表示,然后将这个表示传给控件进行显示。理解BMP文件的结构以及编程语言提供的图像处理库是实现这一目标的关键...

    MFC 读取BMP格式图片

    AfxMessageBox("只支持8位和24位的BMP文件!"); file.Close(); return FALSE; } // 分配内存来存储图像数据 void* imageData = NULL; if (bitsPerPixel == 8) imageData = new RGBQUAD[infoHeader.biClrUsed...

    C语言对BMP图像的读和写和对像素的操作

    - **24位色**:遍历像素数组,将每个像素的R、G、B三个分量均设置为0。 2. **写入BMP图像**:根据读取的数据重新构建一个BMP文件。 #### 五、详细代码解析 ##### 1. 主函数 ```c int main() { // 读取图像 char ...

    Qt BMP图片32位深度转换成8,24位

    本文将详细讨论如何在Qt环境下将32位深度的BMP图片转换为8位和24位深度的BMP图片。 首先,我们需要了解BMP文件格式。BMP是Microsoft Windows操作系统中的一个标准图像格式,它不进行任何压缩,因此文件大小较大,但...

    24为真彩色BMP文件的读和写

    24位真彩色BMP文件表示的是每个像素由红、绿、蓝三种颜色组成,每种颜色用8位二进制表示,总共24位,能够呈现16,777,216种颜色,即真彩色。这种格式广泛应用于Windows操作系统和其他软件中。 在VC++环境下,开发...

    24位bmp位图转灰度图(MFC实现)

    总结一下,实现“24位bmp位图转灰度图(MFC实现)”需要以下步骤: 1. 了解并解析BMP文件格式。 2. 使用MFC的CFile和CBitmap类读取BMP文件。 3. 创建与原位图兼容的位图缓冲区。 4. 应用灰度转换公式转换每个像素。...

    Windows下BMP读取显示

    在我们的BMP读取程序中,我们将利用这个框架来更新和绘制窗口内容。 3. GDI(Graphics Device Interface): GDI是Windows提供的图形库,用于在窗口上绘制文本、图形和图像。我们要使用GDI函数如CreateDIBSection...

    BMP 24位转8位 DLL

    在这个场景中,我们关注的是一个名为“BMP 24位转8位 DLL”的工具,它专门用于将BMP格式的图片从24位色彩深度转换为8位。这个工具封装成了动态链接库(DLL)文件,使得开发者可以方便地将其集成到自己的应用程序中...

    VC读取图像VC代码读取BMP文件并显示

    以下是一个简单的VC++代码示例,演示如何读取并显示BMP文件: ```cpp #include LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc, hMemDC; HBITMAP hBitmap, ...

    VC++实现读取显示bmp图像

    如果是24位真彩色BMP,每个像素需要3个字节(红、绿、蓝各一个字节)。 4. **读取图像数据**:使用CFile的`Read()`函数,你可以读取BMP文件中的像素数据。由于BMP是按行存储且数据倒序排列的(从下到上,从右到左)...

    C语言读取BMP图像

    读取BMP图像并生成新的图片涉及以下步骤: 1. 打开输入BMP文件,读取文件头和图像信息头。 2. 分配内存来存储图像数据,考虑到可能的行填充。 3. 使用fread逐行读取图像数据到内存中。 4. 如果需要复制或处理图像,...

    纯C++实现24位BMP图像的旋转、缩放、裁剪等一系列操作

    本项目专注于24位BMP图像的处理,包括旋转、缩放和裁剪等基本操作。这里我们将深入探讨这些概念以及如何使用C++实现它们。 首先,24位BMP(Bitmap)格式是Windows操作系统中最常见的位图文件格式之一。它存储每个...

    VC 读取BMP文件,并显示

    以下是一个简化的代码示例,展示如何在VC++中读取并显示BMP文件: ```cpp #include #include int main() { // 打开文件 std::ifstream file("image.bmp", std::ios::binary); // 读取文件头和信息头 // ...

    利用win32 SDK 显示bmp图像

    接着,使用`BitBlt`函数将位映射从内存DC复制到窗口的设备上下文,从而在屏幕上显示图像。 6. **释放资源** 在程序执行完毕后,别忘了释放所有已分配的资源,包括位映图、设备上下文和文件句柄。 在"win32bmpDemo...

    数字水印程序,bmp位图读取

    本项目是一个针对初学者的实践教程,旨在介绍如何使用编程技术实现数字水印功能,并重点涉及BMP位图文件的读取与处理。 首先,我们来了解一下“数字水印”。数字水印是一种将特定信息嵌入到多媒体文件(如图像、...

    BMP转hex,C数组

    标题中的“BMP转hex,C数组”是指将24位色彩的BMP图像文件转换成十六进制(hex)格式,并且将其数据结构转化为C语言数组的形式,以便于在C程序中直接读取和处理图像数据。这个过程通常涉及以下几个关键知识点: 1. ...

    BMP影像的读取和存储

    读取BMP图像通常涉及以下步骤: 1. 打开文件:使用文件操作函数打开BMP文件,并读取文件头和信息头,以获取图像的宽度、高度、色彩深度等信息。 2. 分析DIB结构:根据信息头的数据,解析DIB结构,了解像素数据的...

    用vc++实现bmp图像显示

    以下是一个简单的示例代码,展示如何在C++中使用GDI显示BMP图像: ```cpp #include #include class CMyDlg : public CDialog { public: CMyDlg(CWnd* pParent = NULL) : CDialog(CMyDlg::IDD, pParent) { } ...

Global site tag (gtag.js) - Google Analytics