`
feng88724
  • 浏览: 170661 次
  • 性别: 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; 
} 
分享到:
评论

相关推荐

    ImageMagick v7.0.7-16

    它可以读取、转换、写入多种格式的图片。图片切割、颜色替换、各种效果的应用,图片的旋转、组合,文本,直线,多边形,椭圆,曲线,附加到图片伸展旋转。通常来说,它可以支持以下程序语言: Perl, C, C++, Python,...

    LABVIEW NI VISION 中文版详细解析

    复制到另一个图像。 Files 使用 Files VI 来读取、写入和检索图像文件信息。NI Vision 支持的文件格式是 BMP、 TIFF、JPEG、PNG、AIPD(内部文件格式)和 AVI(用于多个图像)。 External Display 使用 External ...

    Imagemagic 图片处理

    它可以读取、转换、写入多种格式的图片。图片切割、颜色替换、各种效果的应用,图片的旋转、组合,文本,直线,多边形,椭圆,曲线,附加到图片伸展旋转。ImageMagick是免费软件:全部源码开放,可以自由***,复制,...

    轻松水印 7.0.2单文件注册专业版

    大部分企业则借助互联网,发布自己的产品展示图片,推广自己的产品……但是,在互联网上复制、传播图片非常容易,很多图片在未经所有人同意的情況下就被到处、任意流传。为了保护自己的图片不被滥用,同时又起到了...

    轻松水印6.0绿色特别版

    支持目前绝大部分图像格式的读取(支持读取格式:JPEG, BMP, TIFF, PCX, PNG, TGA, PBM, PGM, PPM, GIF, VDA, ICB, VST, PIX, WMF, FAX, PSD, PDD, PSP, CUT and PCD )和JPEG, BMP, TIFF, GIF, PNG图片格式的保存...

    ImageMagick 6.4.1-3中文版下载-ImageMagick 6.4.1-3绿色软件下载

    它可以读取、转换、写入多种格式的图片。 图片切割、颜色替换、各种效果的应用,图片的旋转、组合,文本,直线, 多边形,椭圆,曲线,附加到图片伸展旋转。 ImageMagick是免费软件:全部源码开放,可以自由使用,...

    ImageMagick 最新版

    它可以读取、转换、写入多种格式的图片。图片切割、颜色替换、各种效果的应用,图片的旋转、组合,文本,直线,多边形,椭圆,曲线,附加到图片伸展旋转。ImageMagick是免费软件:全部源码开放,可以自由***,复制,...

    delphi 开发经验技巧宝典源码

    0070 求1000以内的完数 45 0071 如何计算x的y次方 46 3.2 复杂计算类算法 46 0072 如何实现金额大小写转换的算法 46 0073 如何计算时钟的指针位置 47 0074 如何计算汉字笔划 48 0075 如何计算两个日期...

    delphi 开发经验技巧宝典源码06

    0070 求1000以内的完数 45 0071 如何计算x的y次方 46 3.2 复杂计算类算法 46 0072 如何实现金额大小写转换的算法 46 0073 如何计算时钟的指针位置 47 0074 如何计算汉字笔划 48 0075 如何计算两个日期...

    网管教程 从入门到精通软件篇.txt

    /r 找到坏扇区并恢复可读取的信息。隐含着 /p 参数。  注意 Chkdsk 命令需要 Autochk.exe 文件。如果不能在启动目录(默认为 %systemroot%System32)中找到该文件,将试着在 Windows 安装 CD 中找到它。如果有多...

    人力资源管理软件(完全免费)

    支持数据复制,可指定条件复制部分数据,可从多个历史单据中复制 支持辅助数据管理(人力资源软件)(单机免费) 提供个税工具,应发金额、所得税、应发任输一个数据自动计算另外2个 灵活生成各类统计报表,可定制...

    计算机应用技术(实用手册)

    CPU为AMD3600+ 速龙64位双核酷睿技术 Memory Testing: 524288k ok with 32M shared memory 内存为512兆 32兆的二级缓存 IDE Channel 0 master : None IDE Channel 0 Slave : None IDE Channel 1 master : HL-DT-...

    C++MFC教程

    下图为消息投递模式 在16位的系统中系统中只有一个消息队列,所以系统必须等待当前任务处理消息后才可以发送下一消息到相应程序,如果一个程序陷如死循环或是耗时操作时系统就会得不到控制权。这种多任务系统也就...

    MSDEV.EXE-应用程序错误解决办法.

    将这个插件复制到X:\Program Files\Microsoft Visual Studio\Common\MSDev98\AddIns 重新打开VC6,Tools-&gt;Customize-&gt;Add-ins and Macro Files,选中FileTool Developer Studio Add-in即可。 此时打开VC6会有一个...

    BibItNow!「BibItNow!」-crx插件

    http://meyerweb.com/eric/tools/css/reset/-使用Mozilla开发人员网络提供的功能读取UTF16(非BMP)字符 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt ...

    超级有影响力霸气的Java面试题大全文档

    &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。 14、HashMap和Hashtable的区别。 HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空...

    GPRS控制卡 软件 GS7020B

    该项可被修改,因此建议在修改配置前先读取控制卡配置,以防写入 错误的编号。GPRS 通信方式下,该项不可编辑修改。  GPRS APN: APN 是GPRS 接入点名称。除非在中国大陆以外运行 GS7020B, 或已从移动服务商获得...

    oracle详解

    oracle会避开sql语句处理引擎,直接从数据库文件中读取数据,然后写入导出文件. 可以在导出日志中观察到: exp-00067: table xxx will be exported in conventional path 如果没有使用直接路径,必须保证buffer参数的值...

Global site tag (gtag.js) - Google Analytics