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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值